Changeset 1523

Show
Ignore:
Timestamp:
07/19/05 02:18:39 (3 years ago)
Author:
madcat
Message:

Core/gui comm sockets are now properly buffered - no more data getting lost.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • hydranode/hncore/plugins/cgcomm/src/cgcomm.cpp

    r1501 r1523  
    2525 
    2626IMPLEMENT_MODULE(ModMain); 
     27 
    2728bool ModMain::onInit() { 
    2829        logMsg("Initializing Core/GUI communication..."); 
     
    3536        return true; 
    3637} 
     38 
    3739int ModMain::onExit() { 
    3840        m_listener->destroy(); 
     
    4042} 
    4143 
    42 void ModMain::onIncoming(SocketServer *sock, SocketEvent evt) { 
     44void ModMain::onIncoming(SocketServer *sock, SocketEvent) { 
    4345        Client *c = new Client(sock->accept()); 
    4446        c->getEventTable().addHandler(c, this, &ModMain::onClientEvent); 
    4547        m_clients.insert(c); 
    4648} 
     49 
    4750void ModMain::onClientEvent(Client *c, int evt) { 
    4851        if (evt == EVT_DESTROY) { 
  • hydranode/hncore/plugins/cgcomm/src/client.cpp

    r1501 r1523  
    3535 
    3636Client::Client(SocketClient *sock) : m_socket(sock) { 
    37         m_subMap[SUB_AUTH    ].reset(new Subsystem::Auth    (m_socket)); 
    38         m_subMap[SUB_SEARCH  ].reset(new Subsystem::Search  (m_socket)); 
    39         m_subMap[SUB_DOWNLOAD].reset(new Subsystem::Download(m_socket)); 
    40         m_subMap[SUB_SHARED  ].reset(new Subsystem::Shared  (m_socket)); 
    41         m_subMap[SUB_CONFIG  ].reset(new Subsystem::Config  (m_socket)); 
    42         m_subMap[SUB_HASHER  ].reset(new Subsystem::Hasher  (m_socket)); 
    43         m_subMap[SUB_PLUGINS ].reset(new Subsystem::Plugins (m_socket)); 
    44         m_subMap[SUB_LOG     ].reset(new Subsystem::Log     (m_socket)); 
    45         m_subMap[SUB_EXT     ].reset(new Subsystem::Ext     (m_socket)); 
     37        boost::function<void (const std::string&)> sendFunc; 
     38        sendFunc = boost::bind(&Client::sendData, this, _1); 
     39 
     40        m_subMap[SUB_AUTH    ].reset(new Subsystem::Auth    (sendFunc)); 
     41        m_subMap[SUB_SEARCH  ].reset(new Subsystem::Search  (sendFunc)); 
     42        m_subMap[SUB_DOWNLOAD].reset(new Subsystem::Download(sendFunc)); 
     43        m_subMap[SUB_SHARED  ].reset(new Subsystem::Shared  (sendFunc)); 
     44        m_subMap[SUB_CONFIG  ].reset(new Subsystem::Config  (sendFunc)); 
     45        m_subMap[SUB_HASHER  ].reset(new Subsystem::Hasher  (sendFunc)); 
     46        m_subMap[SUB_PLUGINS ].reset(new Subsystem::Plugins (sendFunc)); 
     47        m_subMap[SUB_LOG     ].reset(new Subsystem::Log     (sendFunc)); 
     48        m_subMap[SUB_EXT     ].reset(new Subsystem::Ext     (sendFunc)); 
    4649 
    4750        m_socket->getEventTable().addHandler( 
     
    5154 
    5255void Client::parse(const std::string &data) { 
    53         m_buffer.append(data); 
    54         while (m_buffer.size() >= 4) { 
    55                 std::istringstream tmp(m_buffer); 
     56        m_inBuf.append(data); 
     57        while (m_inBuf.size() >= 4) { 
     58                std::istringstream tmp(m_inBuf); 
    5659                uint8_t subsys = Utils::getVal<uint8_t>(tmp); 
    5760                uint16_t size = Utils::getVal<uint16_t>(tmp); 
    58                 if (m_buffer.size() < size + 3u) { 
     61                if (m_inBuf.size() < size + 3u) { 
    5962                        return; 
    6063                } 
    61                 std::istringstream packet(m_buffer.substr(3, size)); 
     64                std::istringstream packet(m_inBuf.substr(3, size)); 
    6265                Iter it = m_subMap.find(subsys); 
    6366                if (it == m_subMap.end()) { 
     
    7073                        (*it).second->handle(packet); 
    7174                } 
    72                 m_buffer.erase(0, size + 3); 
     75                m_inBuf.erase(0, size + 3); 
    7376        } 
    7477} 
     
    7982                *sock >> buf; 
    8083                return parse(buf); 
     84        } else if (evt == SOCK_WRITE) { 
     85                uint32_t ret = m_socket->write(m_outBuf.data(),m_outBuf.size()); 
     86                if (ret < m_outBuf.size()) { 
     87                        m_outBuf.erase(0, ret); 
     88                } 
    8189        } else if (evt == SOCK_LOST || evt == SOCK_TIMEOUT || evt == SOCK_ERR) { 
    8290                destroy(); 
     
    8997} 
    9098 
     99void Client::sendData(const std::string &data) { 
     100        if (m_outBuf.size()) { 
     101                m_outBuf.append(data); 
     102        } else { 
     103                uint32_t ret = m_socket->write(data.data(), data.size()); 
     104                if (ret < data.size()) { 
     105                        m_outBuf.append(data.substr(ret)); 
     106                } 
     107        } 
     108} 
     109 
    91110} // namespace CGComm 
    92111 
  • hydranode/hncore/plugins/cgcomm/src/sub_auth.cpp

    r1501 r1523  
    2323namespace Subsystem { 
    2424 
    25 Auth::Auth(SocketClient *sock) : SubSysBase(sock, SUB_AUTH) {} 
    26 void Auth::handle(std::istream &i) {} 
     25Auth::Auth( 
     26        boost::function<void (const std::string&)> sendFunc 
     27) : SubSysBase(SUB_AUTH, sendFunc) {} 
     28 
     29void Auth::handle(std::istream &) {} 
    2730 
    2831} 
  • hydranode/hncore/plugins/cgcomm/src/sub_config.cpp

    r1501 r1523  
    2323namespace Subsystem { 
    2424 
    25 Config::Config(SocketClient *sock) : SubSysBase(sock, SUB_CONFIG) {} 
    26 void Config::handle(std::istream &i) {} 
     25Config::Config( 
     26        boost::function<void (const std::string&)> sendFunc 
     27) : SubSysBase(SUB_CONFIG, sendFunc) {} 
     28 
     29void Config::handle(std::istream &) {} 
    2730 
    2831} 
  • hydranode/hncore/plugins/cgcomm/src/sub_download.cpp

    r1501 r1523  
    2727namespace Subsystem { 
    2828 
    29 Download::Download(SocketClient *sock) : SubSysBase(sock, SUB_DOWNLOAD) {} 
     29Download::Download( 
     30        boost::function<void (const std::string&)> sendFunc 
     31) : SubSysBase(SUB_DOWNLOAD, sendFunc) {} 
     32 
    3033void Download::handle(std::istream &i) { 
    3134        uint8_t oc = Utils::getVal<uint8_t>(i); 
  • hydranode/hncore/plugins/cgcomm/src/sub_ext.cpp

    r1501 r1523  
    2323namespace Subsystem { 
    2424 
    25 Ext::Ext(SocketClient *sock) : SubSysBase(sock, SUB_EXT) {} 
    26 void Ext::handle(std::istream &i) {} 
     25Ext::Ext( 
     26        boost::function<void (const std::string&)> sendFunc 
     27) : SubSysBase(SUB_EXT, sendFunc) {} 
    2728 
     29void Ext::handle(std::istream &) {} 
    2830 
    2931} 
  • hydranode/hncore/plugins/cgcomm/src/sub_hasher.cpp

    r1501 r1523  
    2323namespace Subsystem { 
    2424 
    25 Hasher::Hasher(SocketClient *sock) : SubSysBase(sock, SUB_HASHER) {} 
    26 void Hasher::handle(std::istream &i) {} 
     25Hasher::Hasher( 
     26        boost::function<void (const std::string&)> sendFunc 
     27) : SubSysBase(SUB_HASHER, sendFunc) {} 
     28 
     29void Hasher::handle(std::istream &) {} 
    2730 
    2831} 
  • hydranode/hncore/plugins/cgcomm/src/sub_log.cpp

    r1501 r1523  
    2323namespace Subsystem { 
    2424 
    25 Log::Log(SocketClient *sock) : SubSysBase(sock, SUB_LOG) {} 
    26 void Log::handle(std::istream &i) {} 
     25Log::Log( 
     26        boost::function<void (const std::string&)> sendFunc 
     27) : SubSysBase(SUB_LOG, sendFunc) {} 
     28 
     29void Log::handle(std::istream &) {} 
    2730 
    2831} 
  • hydranode/hncore/plugins/cgcomm/src/sub_plugins.cpp

    r1501 r1523  
    2424namespace Subsystem { 
    2525 
    26 Plugins::Plugins(SocketClient *sock) : SubSysBase(sock, SUB_PLUGINS) {} 
    27 void Plugins::handle(std::istream &i) {} 
     26Plugins::Plugins( 
     27        boost::function<void (const std::string&)> sendFunc 
     28) : SubSysBase(SUB_PLUGINS, sendFunc) {} 
     29 
     30void Plugins::handle(std::istream &) {} 
    2831 
    2932} 
  • hydranode/hncore/plugins/cgcomm/src/sub_search.cpp

    r1501 r1523  
    2828namespace Subsystem { 
    2929 
    30 Search::Search(SocketClient *sock) : SubSysBase(sock, SUB_SEARCH), 
    31 m_lastResultCount() {} 
     30Search::Search( 
     31        boost::function<void (const std::string&)> sendFunc 
     32) : SubSysBase(SUB_SEARCH, sendFunc), m_lastResultCount() {} 
    3233 
    3334void Search::handle(std::istream &i) { 
  • hydranode/hncore/plugins/cgcomm/src/sub_shared.cpp

    r1501 r1523  
    2323namespace Subsystem { 
    2424 
    25 Shared::Shared(SocketClient *sock) : SubSysBase(sock, SUB_SHARED) {} 
    26 void Shared::handle(std::istream &i) {} 
     25Shared::Shared( 
     26        boost::function<void (const std::string&)> sendFunc 
     27) : SubSysBase(SUB_SHARED, sendFunc) {} 
     28 
     29void Shared::handle(std::istream &) {} 
    2730 
    2831} 
  • hydranode/hncore/plugins/cgcomm/src/subsysbase.cpp

    r1501 r1523  
    2525namespace CGComm { 
    2626 
    27 SubSysBase::SubSysBase(SocketClient *sock, uint8_t subCode) 
    28 : m_socket(sock), m_subCode(subCode) {} 
     27SubSysBase::SubSysBase( 
     28        uint8_t subCode, boost::function<void (const std::string&)> sendFunc 
     29) : sendData(sendFunc), m_subCode(subCode) {} 
    2930 
    3031SubSysBase::~SubSysBase() {} 
     
    3536        Utils::putVal<uint16_t>(tmp, data.size()); // packet size 
    3637        Utils::putVal<std::string>(tmp, data.data(), data.size()); 
    37         uint32_t ret = m_socket->write(tmp.str().data(), tmp.str().size()); 
     38        sendData(tmp.str()); 
    3839} 
    3940 
  • hydranode/include/hncore/cgcomm/client.h

    r1510 r1523  
    2525 
    2626namespace CGComm { 
     27 
    2728class SubSysBase; 
     29 
    2830enum ClientEvents { 
    2931        EVT_DESTROY 
     
    3537 
    3638        Client(SocketClient *sock); 
    37  
    3839        void destroy(); 
    3940private: 
    4041        void parse(const std::string &data); 
    4142        void onSocketEvent(SocketClient *sock, SocketEvent evt); 
     43        void sendData(const std::string &data); 
    4244 
    4345        typedef std::map<uint8_t, boost::shared_ptr<SubSysBase> > SubMap; 
    44         SubMap m_subMap; 
    4546        typedef SubMap::iterator Iter; 
    4647 
    47         std::string m_buffer; 
     48        SubMap m_subMap; 
     49        std::string m_inBuf; 
     50        std::string m_outBuf; 
    4851        SocketClient *m_socket; 
    4952}; 
  • hydranode/include/hncore/cgcomm/sub_auth.h

    r1510 r1523  
    2626class Auth : public SubSysBase { 
    2727public: 
    28         Auth(SocketClient *sock); 
     28        Auth(boost::function<void (const std::string&)> sendFunc); 
    2929        virtual void handle(std::istream &i); 
    3030}; 
  • hydranode/include/hncore/cgcomm/sub_config.h

    r1510 r1523  
    2626class Config : public SubSysBase { 
    2727public: 
    28         Config(SocketClient *sock); 
     28        Config(boost::function<void (const std::string&)> sendFunc); 
    2929        virtual void handle(std::istream &i); 
    3030}; 
  • hydranode/include/hncore/cgcomm/sub_download.h

    r1510 r1523  
    2727class Download : public SubSysBase { 
    2828public: 
    29         Download(SocketClient *sock); 
     29        Download(boost::function<void (const std::string&)> sendFunc); 
    3030        virtual void handle(std::istream &i); 
    3131private: 
  • hydranode/include/hncore/cgcomm/sub_ext.h

    r1510 r1523  
    2828class Ext : public SubSysBase { 
    2929public: 
    30         Ext(SocketClient *sock); 
     30        Ext(boost::function<void (const std::string&)> sendFunc); 
    3131        virtual void handle(std::istream &i); 
    3232}; 
  • hydranode/include/hncore/cgcomm/sub_hasher.h

    r1510 r1523  
    2727class Hasher : public SubSysBase { 
    2828public: 
    29         Hasher(SocketClient *sock); 
     29        Hasher(boost::function<void (const std::string&)> sendFunc); 
    3030        virtual void handle(std::istream &i); 
    3131}; 
  • hydranode/include/hncore/cgcomm/sub_log.h

    r1507 r1523  
    2626class Log : public SubSysBase { 
    2727public: 
    28         Log(SocketClient *sock); 
     28        Log(boost::function<void (const std::string&)> sendFunc); 
    2929        virtual void handle(std::istream &i); 
    3030}; 
  • hydranode/include/hncore/cgcomm/sub_plugins.h

    r1510 r1523  
    2727class Plugins : public SubSysBase { 
    2828public: 
    29         Plugins(SocketClient *sock); 
     29        Plugins(boost::function<void (const std::string&)> sendFunc); 
    3030        virtual void handle(std::istream &i); 
    3131}; 
  • hydranode/include/hncore/cgcomm/sub_search.h

    r1510 r1523  
    2929class Search : public SubSysBase { 
    3030public: 
    31         Search(SocketClient *sock); 
     31        Search(boost::function<void (const std::string&)> sendFunc); 
    3232        virtual void handle(std::istream &i); 
    3333private: 
  • hydranode/include/hncore/cgcomm/sub_shared.h

    r1510 r1523  
    2727class Shared : public SubSysBase { 
    2828public: 
    29         Shared(SocketClient *sock); 
     29        Shared(boost::function<void (const std::string&)> sendFunc); 
    3030        virtual void handle(std::istream &i); 
    3131}; 
  • hydranode/include/hncore/cgcomm/subsysbase.h

    r1510 r1523  
    2727class SubSysBase { 
    2828public: 
    29         SubSysBase(SocketClient *c, uint8_t subCode); 
     29        SubSysBase( 
     30                uint8_t subCode, 
     31                boost::function<void (const std::string&)> sendFunc 
     32        ); 
     33 
    3034        virtual ~SubSysBase(); 
    3135        virtual void handle(std::istream&) = 0; 
    3236        void sendPacket(const std::string &packet); 
    3337private: 
    34         SocketClient *m_socket;  // socket to write data to 
     38        // function used to send data 
     39        boost::function<void (const std::string&)> sendData; 
    3540        uint8_t m_subCode;       // subsystem code 
    3641};