diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 54566429f..253e261b2 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -33,6 +33,18 @@ NetworkOPs::NetworkOPs(boost::asio::io_service& io_service, LedgerMaster* pLedge { } +std::string NetworkOPs::strOperatingMode() +{ + static const char* paStatusToken[] = { + "disconnected", + "connected", + "tracking", + "full" + }; + + return paStatusToken[mMode]; +} + boost::posix_time::ptime NetworkOPs::getNetworkTimePT() { int offset = 0; @@ -871,17 +883,12 @@ void NetworkOPs::setMode(OperatingMode om) if ((om >= omCONNECTED) && (mMode == omDISCONNECTED)) mConnectTime = boost::posix_time::second_clock::universal_time(); - Log lg((om < mMode) ? lsWARNING : lsINFO); - if (om == omDISCONNECTED) - lg << "STATE->Disconnected"; - else if (om == omCONNECTED) - lg << "STATE->Connected"; - else if (om == omTRACKING) - lg << "STATE->Tracking"; - else - lg << "STATE->Full"; + mMode = om; + + Log lg((om < mMode) ? lsWARNING : lsINFO); + + lg << "STATE->" << strOperatingMode(); - if ((om == omDISCONNECTED) || (mMode == omDISCONNECTED)) { boost::recursive_mutex::scoped_lock sl(mMonitorLock); @@ -889,8 +896,8 @@ void NetworkOPs::setMode(OperatingMode om) { Json::Value jvObj(Json::objectValue); - jvObj["type"] = "serverStatus"; - jvObj["server_status"] = om >= omCONNECTED ? "ok" : "noNetwork"; + jvObj["type"] = "serverStatus"; + jvObj["server_status"] = strOperatingMode(); BOOST_FOREACH(InfoSub* ispListener, mSubServer) { @@ -898,8 +905,6 @@ void NetworkOPs::setMode(OperatingMode om) } } } - - mMode = om; } diff --git a/src/cpp/ripple/NetworkOPs.h b/src/cpp/ripple/NetworkOPs.h index 2a9b5303e..25211db63 100644 --- a/src/cpp/ripple/NetworkOPs.h +++ b/src/cpp/ripple/NetworkOPs.h @@ -124,10 +124,7 @@ public: uint32 getLedgerID(const uint256& hash); uint32 getCurrentLedgerID(); OperatingMode getOperatingMode() { return mMode; } - inline bool available() { - // XXX Later this can be relaxed to omCONNECTED - return mMode >= omTRACKING; - } + std::string strOperatingMode(); Ledger::pointer getClosedLedger() { return mLedgerMaster->getClosedLedger(); } Ledger::pointer getCurrentLedger() { return mLedgerMaster->getCurrentLedger(); } diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index e7d34198d..a80e7b0a3 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -2101,21 +2101,24 @@ Json::Value RPCHandler::doSubscribe(Json::Value jvRequest) if(streamName=="server") { mNetOps->subServer(mInfoSub, jvResult); - jvResult["server_status"] = mNetOps->available() ? "ok" : "noNetwork"; - }else if(streamName=="ledger") + jvResult["server_status"] = mNetOps->strOperatingMode(); + + } else if(streamName=="ledger") { mNetOps->subLedger(mInfoSub, jvResult); - }else if(streamName=="transactions") + + } else if(streamName=="transactions") { mNetOps->subTransactions(mInfoSub); - }else if(streamName=="rt_transactions") + + } else if(streamName=="rt_transactions") { mNetOps->subRTTransactions(mInfoSub); - }else - { + } + else { jvResult["error"] = str(boost::format("Unknown stream: %s") % streamName); } - }else + } else { jvResult["error"] = "malformedSteam"; } @@ -2362,7 +2365,9 @@ Json::Value RPCHandler::doCommand(Json::Value& jvRequest, int iRole) { return rpcError(rpcNO_EVENTS); } - else if ((commandsA[i].iOptions & optNetwork) && !mNetOps->available()) + else if (commandsA[i].iOptions & optNetwork + && mNetOps->getOperatingMode() != NetworkOPs::omTRACKING + && mNetOps->getOperatingMode() != NetworkOPs::omFULL) { return rpcError(rpcNO_NETWORK); } diff --git a/src/js/remote.js b/src/js/remote.js index 4a84228da..968b60288 100644 --- a/src/js/remote.js +++ b/src/js/remote.js @@ -289,6 +289,7 @@ Remote.prototype._set_state = function (state) { this.state = state; this.emit('state', state); + switch (state) { case 'online': this.online_state = 'open'; @@ -499,7 +500,11 @@ Remote.prototype._connect_message = function (ws, json) { break; case 'serverStatus': - this._set_state(message.server_status === 'ok' ? 'online' : 'offline'); + // This message is only received when online. As we are connected, it is the definative final state. + this._set_state( + message.server_status === 'tracking' || message.server_status === 'full' + ? 'online' + : 'offline'); break; // All other messages @@ -861,7 +866,7 @@ Remote.prototype._server_subscribe = function () { self.emit('ledger_closed', message); } - if (message.server_status === "ok") { + if (message.server_status === 'tracking' || message.server_status === 'full') { self._set_state('online'); }