From cbb1e50222514f01b0bd0930ec7836ff3855b681 Mon Sep 17 00:00:00 2001 From: Stefan Thomas Date: Thu, 6 Dec 2012 12:20:16 -0800 Subject: [PATCH] Add event allowing client to track server's network connectivity. --- src/cpp/ripple/NetworkOPs.cpp | 21 +++++++++++++++++++++ src/cpp/ripple/RPCHandler.cpp | 1 + 2 files changed, 22 insertions(+) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 07ac2dfc1e..54566429fc 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -867,8 +867,10 @@ void NetworkOPs::consensusViewChange() void NetworkOPs::setMode(OperatingMode om) { if (mMode == om) return; + 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"; @@ -878,6 +880,25 @@ void NetworkOPs::setMode(OperatingMode om) lg << "STATE->Tracking"; else lg << "STATE->Full"; + + if ((om == omDISCONNECTED) || (mMode == omDISCONNECTED)) + { + boost::recursive_mutex::scoped_lock sl(mMonitorLock); + + if (!mSubServer.empty()) + { + Json::Value jvObj(Json::objectValue); + + jvObj["type"] = "serverStatus"; + jvObj["server_status"] = om >= omCONNECTED ? "ok" : "noNetwork"; + + BOOST_FOREACH(InfoSub* ispListener, mSubServer) + { + ispListener->send(jvObj); + } + } + } + mMode = om; } diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 076706bdcb..9a6d6191d2 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -2084,6 +2084,7 @@ 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") { mNetOps->subLedger(mInfoSub, jvResult);