std::map LedgerEntryFormat::byType; std::map LedgerEntryFormat::byName; // VFALCO TODO surely we can think of a better way than macros? #define LEF_BASE \ << SOElement(sfLedgerIndex, SOE_OPTIONAL) \ << SOElement(sfLedgerEntryType, SOE_REQUIRED) \ << SOElement(sfFlags, SOE_REQUIRED) #define DECLARE_LEF(name, type) lef = new LedgerEntryFormat(#name, type); (*lef) LEF_BASE void LEFInit() { LedgerEntryFormat* lef; DECLARE_LEF(AccountRoot, ltACCOUNT_ROOT) << SOElement(sfAccount, SOE_REQUIRED) << SOElement(sfSequence, SOE_REQUIRED) << SOElement(sfBalance, SOE_REQUIRED) << SOElement(sfOwnerCount, SOE_REQUIRED) << SOElement(sfPreviousTxnID, SOE_REQUIRED) << SOElement(sfPreviousTxnLgrSeq, SOE_REQUIRED) << SOElement(sfRegularKey, SOE_OPTIONAL) << SOElement(sfEmailHash, SOE_OPTIONAL) << SOElement(sfWalletLocator, SOE_OPTIONAL) << SOElement(sfWalletSize, SOE_OPTIONAL) << SOElement(sfMessageKey, SOE_OPTIONAL) << SOElement(sfTransferRate, SOE_OPTIONAL) << SOElement(sfDomain, SOE_OPTIONAL) ; DECLARE_LEF(Contract, ltCONTRACT) << SOElement(sfAccount, SOE_REQUIRED) << SOElement(sfBalance, SOE_REQUIRED) << SOElement(sfPreviousTxnID, SOE_REQUIRED) << SOElement(sfPreviousTxnLgrSeq, SOE_REQUIRED) << SOElement(sfIssuer, SOE_REQUIRED) << SOElement(sfOwner, SOE_REQUIRED) << SOElement(sfExpiration, SOE_REQUIRED) << SOElement(sfBondAmount, SOE_REQUIRED) << SOElement(sfCreateCode, SOE_OPTIONAL) << SOElement(sfFundCode, SOE_OPTIONAL) << SOElement(sfRemoveCode, SOE_OPTIONAL) << SOElement(sfExpireCode, SOE_OPTIONAL) ; DECLARE_LEF(DirectoryNode, ltDIR_NODE) << SOElement(sfOwner, SOE_OPTIONAL) // for owner directories << SOElement(sfTakerPaysCurrency, SOE_OPTIONAL) // for order book directories << SOElement(sfTakerPaysIssuer, SOE_OPTIONAL) // for order book directories << SOElement(sfTakerGetsCurrency, SOE_OPTIONAL) // for order book directories << SOElement(sfTakerGetsIssuer, SOE_OPTIONAL) // for order book directories << SOElement(sfExchangeRate, SOE_OPTIONAL) // for order book directories << SOElement(sfIndexes, SOE_REQUIRED) << SOElement(sfRootIndex, SOE_REQUIRED) << SOElement(sfIndexNext, SOE_OPTIONAL) << SOElement(sfIndexPrevious, SOE_OPTIONAL) ; DECLARE_LEF(GeneratorMap, ltGENERATOR_MAP) << SOElement(sfGenerator, SOE_REQUIRED) ; DECLARE_LEF(Nickname, ltNICKNAME) << SOElement(sfAccount, SOE_REQUIRED) << SOElement(sfMinimumOffer, SOE_OPTIONAL) ; DECLARE_LEF(Offer, ltOFFER) << SOElement(sfAccount, SOE_REQUIRED) << SOElement(sfSequence, SOE_REQUIRED) << SOElement(sfTakerPays, SOE_REQUIRED) << SOElement(sfTakerGets, SOE_REQUIRED) << SOElement(sfBookDirectory, SOE_REQUIRED) << SOElement(sfBookNode, SOE_REQUIRED) << SOElement(sfOwnerNode, SOE_REQUIRED) << SOElement(sfPreviousTxnID, SOE_REQUIRED) << SOElement(sfPreviousTxnLgrSeq, SOE_REQUIRED) << SOElement(sfExpiration, SOE_OPTIONAL) ; DECLARE_LEF(RippleState, ltRIPPLE_STATE) << SOElement(sfBalance, SOE_REQUIRED) << SOElement(sfLowLimit, SOE_REQUIRED) << SOElement(sfHighLimit, SOE_REQUIRED) << SOElement(sfPreviousTxnID, SOE_REQUIRED) << SOElement(sfPreviousTxnLgrSeq, SOE_REQUIRED) << SOElement(sfLowNode, SOE_OPTIONAL) << SOElement(sfLowQualityIn, SOE_OPTIONAL) << SOElement(sfLowQualityOut, SOE_OPTIONAL) << SOElement(sfHighNode, SOE_OPTIONAL) << SOElement(sfHighQualityIn, SOE_OPTIONAL) << SOElement(sfHighQualityOut, SOE_OPTIONAL) ; DECLARE_LEF(LedgerHashes, ltLEDGER_HASHES) << SOElement(sfFirstLedgerSequence, SOE_OPTIONAL) // Remove if we do a ledger restart << SOElement(sfLastLedgerSequence, SOE_OPTIONAL) << SOElement(sfHashes, SOE_REQUIRED) ; DECLARE_LEF(EnabledFeatures, ltFEATURES) << SOElement(sfFeatures, SOE_REQUIRED) ; DECLARE_LEF(FeeSettings, ltFEE_SETTINGS) << SOElement(sfBaseFee, SOE_REQUIRED) << SOElement(sfReferenceFeeUnits, SOE_REQUIRED) << SOElement(sfReserveBase, SOE_REQUIRED) << SOElement(sfReserveIncrement, SOE_REQUIRED) ; } LedgerEntryFormat* LedgerEntryFormat::getLgrFormat(LedgerEntryType t) { std::map::iterator it = byType.find(static_cast(t)); if (it == byType.end()) return NULL; return it->second; } LedgerEntryFormat* LedgerEntryFormat::getLgrFormat(int t) { std::map::iterator it = byType.find((t)); if (it == byType.end()) return NULL; return it->second; } LedgerEntryFormat* LedgerEntryFormat::getLgrFormat(const std::string& t) { std::map::iterator it = byName.find((t)); if (it == byName.end()) return NULL; return it->second; } // vim:ts=4