diff --git a/newcoin.vcxproj b/newcoin.vcxproj
index 6e45fb534..56aa43c99 100644
--- a/newcoin.vcxproj
+++ b/newcoin.vcxproj
@@ -185,108 +185,96 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/newcoin.vcxproj.filters b/newcoin.vcxproj.filters
index de5c116e4..33693e035 100644
--- a/newcoin.vcxproj.filters
+++ b/newcoin.vcxproj.filters
@@ -320,33 +320,15 @@
-
- Header Files
-
Header Files\util
Header Files\util
-
- Header Files
-
Header Files\util
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
Header Files\util
@@ -359,277 +341,259 @@
Header Files\util
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
+
Header Files
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
+
Header Files
diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp
index 882551cc8..ed32b8464 100644
--- a/src/cpp/ripple/NetworkOPs.cpp
+++ b/src/cpp/ripple/NetworkOPs.cpp
@@ -1045,13 +1045,15 @@ void NetworkOPs::pubLedger(Ledger::ref lpAccepted)
for (SHAMapItem::pointer item = txSet.peekFirstItem(); !!item; item = txSet.peekNextItem(item->getTag()))
{
SerializedTransaction::pointer stTxn = theApp->getMasterTransaction().fetch(item, false, 0);
- // XXX Need to support other results.
- // XXX Need to give failures too.
- TER terResult = tesSUCCESS;
-
- pubAcceptedTransaction(lpAccepted, *stTxn, terResult);
+ if(stTxn)
+ {
+ // XXX Need to support other results.
+ // XXX Need to give failures too.
+ TER terResult = tesSUCCESS;
+
+ pubAcceptedTransaction(lpAccepted, *stTxn, terResult);
+ }
}
- // TODO: remove old entries from the submit map
}
}
}
@@ -1103,7 +1105,16 @@ void NetworkOPs::pubAcceptedTransaction(Ledger::ref lpCurrent, const SerializedT
}
-// TODO: tell the mSubmitMap people
+// TODO: will need to rework this to get the affected accounts in a different way when we want finer granularity than just subAccount
+// transactions to
+// transactions from
+// orderbook issuer <- weird since you are probably just interested in a particular pair
+// orderbook receiver
+// your credit setting?
+// other people credit set
+// other account changes
+
+
void NetworkOPs::pubAccountTransaction(Ledger::ref lpCurrent, const SerializedTransaction& stTxn, TER terResult, bool bAccepted)
{
boost::unordered_set notify;
@@ -1115,9 +1126,10 @@ void NetworkOPs::pubAccountTransaction(Ledger::ref lpCurrent, const SerializedTr
if (!mSubAccount.empty() || (!mSubRTAccount.empty()) )
{
- BOOST_FOREACH(const RippleAddress& naAccountPublic, stTxn.getAffectedAccounts())
+ typedef const std::pair AccountPair;
+ BOOST_FOREACH(AccountPair& affectedAccount, getAffectedAccounts(stTxn))
{
- subInfoMapIterator simiIt = mSubRTAccount.find(naAccountPublic.getAccountID());
+ subInfoMapIterator simiIt = mSubRTAccount.find(affectedAccount.first.getAccountID());
if (simiIt != mSubRTAccount.end())
{
@@ -1128,7 +1140,7 @@ void NetworkOPs::pubAccountTransaction(Ledger::ref lpCurrent, const SerializedTr
}
if(bAccepted)
{
- simiIt = mSubAccount.find(naAccountPublic.getAccountID());
+ simiIt = mSubAccount.find(affectedAccount.first.getAccountID());
if (simiIt != mSubAccount.end())
{
@@ -1153,6 +1165,36 @@ void NetworkOPs::pubAccountTransaction(Ledger::ref lpCurrent, const SerializedTr
}
}
+// JED: I know this is sort of ugly. I'm going to rework this to get the affected accounts in a different way when we want finer granularity than just "account"
+std::map NetworkOPs::getAffectedAccounts(const SerializedTransaction& stTxn)
+{
+ std::map accounts;
+
+ BOOST_FOREACH(const SerializedType& it, stTxn.peekData())
+ {
+ const STAccount* sa = dynamic_cast(&it);
+ if (sa)
+ {
+ bool found = false;
+ RippleAddress na = sa->getValueNCA();
+ accounts[na]=true;
+ }else
+ {
+ if( it.getFName() == sfLimitAmount )
+ {
+ const STAmount* amount = dynamic_cast(&it);
+ if(amount)
+ {
+ RippleAddress na;
+ na.setAccountID(amount->getIssuer());
+ accounts[na]=true;
+ }
+ }
+ }
+ }
+ return accounts;
+}
+
//
// Monitoring
//
@@ -1231,7 +1273,7 @@ uint32 NetworkOPs::acceptLedger()
void NetworkOPs::storeProposal(const LedgerProposal::pointer& proposal, const RippleAddress& peerPublic)
{
std::list& props = mStoredProposals[peerPublic.getNodeID()];
- if (props.size() >= (mLastCloseProposers + 10))
+ if (props.size() >= (unsigned)(mLastCloseProposers + 10))
props.pop_front();
props.push_back(proposal);
}
diff --git a/src/cpp/ripple/NetworkOPs.h b/src/cpp/ripple/NetworkOPs.h
index 0997f42af..bf5be14e2 100644
--- a/src/cpp/ripple/NetworkOPs.h
+++ b/src/cpp/ripple/NetworkOPs.h
@@ -90,7 +90,7 @@ protected:
boost::interprocess::interprocess_upgradable_mutex mMonitorLock;
subInfoMapType mSubAccount;
subInfoMapType mSubRTAccount;
- subSubmitMapType mSubmitMap;
+ subSubmitMapType mSubmitMap; // TODO: probably dump this
boost::unordered_set mSubLedger; // accepted ledgers
boost::unordered_set mSubServer; // when server changes connectivity state
@@ -107,6 +107,7 @@ protected:
void pubAcceptedTransaction(Ledger::ref lpCurrent, const SerializedTransaction& stTxn, TER terResult);
void pubAccountTransaction(Ledger::ref lpCurrent, const SerializedTransaction& stTxn, TER terResult,bool accepted);
+ std::map getAffectedAccounts(const SerializedTransaction& stTxn);
public:
NetworkOPs(boost::asio::io_service& io_service, LedgerMaster* pLedgerMaster);
diff --git a/src/cpp/ripple/TransactionMeta.cpp b/src/cpp/ripple/TransactionMeta.cpp
index 8866b039f..182a25a77 100644
--- a/src/cpp/ripple/TransactionMeta.cpp
+++ b/src/cpp/ripple/TransactionMeta.cpp
@@ -49,6 +49,34 @@ void TransactionMetaSet::setAffectedNode(const uint256& node, SField::ref type)
obj.setFieldH256(sfLedgerIndex, node);
}
+/*
+std::vector TransactionMetaSet::getAffectedAccounts()
+{
+ std::vector accounts;
+
+ BOOST_FOREACH(STObject& object, mNodes.getValue() )
+ {
+ const STAccount* sa = dynamic_cast(&it);
+ if (sa != NULL)
+ {
+ bool found = false;
+ RippleAddress na = sa->getValueNCA();
+ BOOST_FOREACH(const RippleAddress& it, accounts)
+ {
+ if (it == na)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ accounts.push_back(na);
+ }
+ }
+ return accounts;
+}
+*/
+
STObject& TransactionMetaSet::getAffectedNode(const uint256& node, SField::ref type)
{
assert(&type);
diff --git a/src/cpp/ripple/TransactionMeta.h b/src/cpp/ripple/TransactionMeta.h
index 100b09900..994e325a0 100644
--- a/src/cpp/ripple/TransactionMeta.h
+++ b/src/cpp/ripple/TransactionMeta.h
@@ -43,6 +43,7 @@ public:
STObject& getAffectedNode(const uint256&, SField::ref type);
STObject& getAffectedNode(const uint256&);
const STObject& peekAffectedNode(const uint256&) const;
+ //std::vector getAffectedAccounts();
Json::Value getJson(int p) const { return getAsObject().getJson(p); }
void addRaw(Serializer&, TER);