diff --git a/src/cpp/ripple/WSConnection.h b/src/cpp/ripple/WSConnection.h index 7dcb9774b..e104e2dfc 100644 --- a/src/cpp/ripple/WSConnection.h +++ b/src/cpp/ripple/WSConnection.h @@ -4,11 +4,16 @@ #include "../json/value.h" +#include + #include "WSDoor.h" #include "Application.h" #include "Log.h" #include "NetworkOPs.h" #include "CallRPC.h" +#include "InstanceCounter.h" + +DEFINE_INSTANCE(WebSocketConnection); template class WSServerHandler; @@ -17,17 +22,19 @@ class WSServerHandler; // - Subscriptions // template -class WSConnection : public InfoSub +class WSConnection : public InfoSub, public IS_INSTANCE(WebSocketConnection) { public: - typedef typename endpoint_type::handler::connection_ptr connection_ptr; + typedef typename endpoint_type::connection_type connection; + typedef typename boost::shared_ptr connection_ptr; + typedef typename boost::weak_ptr weak_connection_ptr; typedef typename endpoint_type::handler::message_ptr message_ptr; protected: typedef void (WSConnection::*doFuncPtr)(Json::Value& jvResult, Json::Value &jvRequest); WSServerHandler* mHandler; - connection_ptr mConnection; + weak_connection_ptr mConnection; NetworkOPs& mNetwork; public: @@ -35,7 +42,7 @@ public: // : mHandler((WSServerHandler*)(NULL)), // mConnection(connection_ptr()) { ; } - WSConnection(WSServerHandler* wshpHandler, connection_ptr cpConnection) + WSConnection(WSServerHandler* wshpHandler, const connection_ptr& cpConnection) : mHandler(wshpHandler), mConnection(cpConnection), mNetwork(theApp->getOPs()) { ; } virtual ~WSConnection() @@ -51,7 +58,9 @@ public: // Implement overridden functions from base class: void send(const Json::Value& jvObj) { - mHandler->send(mConnection, jvObj); + connection_ptr ptr = mConnection.lock(); + if (ptr) + mHandler->send(ptr, jvObj); } // Utilities diff --git a/src/cpp/ripple/WSDoor.cpp b/src/cpp/ripple/WSDoor.cpp index d75c30cc5..1075c5996 100644 --- a/src/cpp/ripple/WSDoor.cpp +++ b/src/cpp/ripple/WSDoor.cpp @@ -24,6 +24,7 @@ SETUP_LOG(); #include #include +DECLARE_INSTANCE(WebSocketConnection); // // This is a light weight, untrusted interface for web clients.