OSDN Git Service

fix memory leak, thanks to Valgrind
[rec10/rec10-git.git] / b25-remote / CasServer.cpp
index 4c733b8..4ae1883 100755 (executable)
-// CasServer.cpp: CCasServer \83N\83\89\83X\82Ì\83C\83\93\83v\83\8a\83\81\83\93\83e\81[\83V\83\87\83\93\r
-//\r
-//////////////////////////////////////////////////////////////////////\r
-\r
-\r
-#include "CasServer.h"\r
-#include "BCasCard.h"\r
-\r
+// CasServer.cpp: CCasServer クラスのインプリメンテーション
+//
+//////////////////////////////////////////////////////////////////////
+
+
+#include "CasServer.h"
+#include "BCasCard.h"
+
 #define FALSE 0
-#define TRUE 1\r
-\r
-CCasServer::CCasServer(ICasServerHandler *pEventHandler)\r
-       : m_pEventHandler(pEventHandler)\r
-       , m_hServerThread(NULL)\r
-{\r
-\r
-}\r
-\r
-CCasServer::~CCasServer(void)\r
-{\r
-       CloseServer();\r
-}\r
-\r
-const BOOL CCasServer::OpenServer(const WORD wServerPort)\r
-{\r
-       // \83J\81[\83h\83\8a\81[\83_\91\8dÝ\83`\83F\83b\83N\r
-       CBcasCard BCasCard;\r
-       if(!BCasCard.OpenCard())return FALSE;\r
-\r
-       // \83T\81[\83o\83\\83P\83b\83g\83I\81[\83v\83\93\r
-       if(!m_pSocket.Listen(wServerPort))return FALSE;\r
-\r
-       // \83T\81[\83o\83X\83\8c\83b\83h\8bN\93®\r
-       pthread_create(&m_hServerThread, NULL, CCasServer::ServerThreadRaw, (LPVOID)this);\r
-       if(!m_hServerThread){\r
-               m_pSocket.Close();\r
-               return FALSE;\r
-       }\r
-\r
-       return TRUE;\r
-}\r
-\r
-void CCasServer::CloseServer(void)\r
-{\r
-       // \83T\81[\83o\83\\83P\83b\83g\83N\83\8d\81[\83Y\r
-       m_pSocket.Close();\r
-\r
-       // \83X\83\8c\83b\83h\83n\83\93\83h\83\8b\8aJ\95ú\r
-       if(m_hServerThread){\r
-               pthread_join(m_hServerThread, NULL);\r
-               m_hServerThread = NULL;\r
-       }\r
-\r
-       // \91S\83N\83\89\83C\83A\83\93\83g\90Ø\92f\r
-       m_Lock.Lock();\r
-       \r
-       for(ClientList::iterator It = m_ClientList.begin() ; It != m_ClientList.end() ; It++){\r
-               It->first->CloseClient();\r
-               }\r
-\r
-       m_Lock.Unlock();\r
-       \r
-       // \91S\83N\83\89\83C\83A\83\93\83g\82Ì\8fI\97¹\82ð\91Ò\82Â\r
-       while(m_ClientList.size()) sleep(1UL);\r
-}\r
-\r
-const DWORD CCasServer::GetClientNum(void) const\r
-{\r
-       // \90Ú\91±\92\86\82Ì\83N\83\89\83C\83A\83\93\83g\90\94\82ð\95Ô\82·\r
-       return m_ClientList.size();\r
-}\r
-\r
-void CCasServer::OnCasClientEvent(CCasClient *pClient, const DWORD dwEventID, PVOID pParam)\r
-{\r
-       CBlockLock AutoLock(&m_Lock);\r
-\r
-       // \83N\83\89\83C\83A\83\93\83g\83C\83x\83\93\83g\r
-       switch(dwEventID){\r
-               case CCasClient::EID_CONNECTED :\r
-                       // \83\8a\83X\83g\82É\92Ç\89Á\r
-                       m_ClientList[pClient] = pClient;\r
-                       if (m_pEventHandler) m_pEventHandler->OnCasServerEvent(this, CSEI_CONNECTED);\r
-                       break;\r
-                       \r
-               case CCasClient::EID_DISCONNECTED :\r
-                       // \83\8a\83X\83g\82©\82ç\8dí\8f\9c\r
-                       m_ClientList.erase(pClient);\r
-                       if (m_pEventHandler) m_pEventHandler->OnCasServerEvent(this, CSEI_DISCONNECTED);\r
-                       break;\r
-               }\r
-}\r
-\r
-void CCasServer::ServerThread(void)\r
-{\r
-       // \83A\83N\83Z\83v\83g\83\8b\81[\83v\r
-       CSmartSock *pNewSocket;\r
-       \r
-       while(pNewSocket = m_pSocket.Accept()){\r
-               // \83N\83\89\83C\83A\83\93\83g\83C\83\93\83X\83^\83\93\83X\90\90¬\r
-               new CCasClient(this, pNewSocket);\r
-               }\r
-}\r
-\r
-void* CCasServer::ServerThreadRaw(LPVOID pParam)\r
-{\r
-       // \83T\81[\83o\83X\83\8c\83b\83h\r
-       static_cast<CCasServer *>(pParam)->ServerThread();\r
-\r
-       return 0UL;\r
-}\r
+#define TRUE 1
+
+CCasServer::CCasServer(ICasServerHandler *pEventHandler)
+       : m_pEventHandler(pEventHandler)
+       , m_hServerThread(NULL)
+{
+
+}
+
+CCasServer::~CCasServer(void)
+{
+       CloseServer();
+}
+
+const BOOL CCasServer::OpenServer(const WORD wServerPort)
+{
+       // カードリーダ存在チェック
+       CBcasCard BCasCard;
+       if(!BCasCard.OpenCard())return FALSE;
+
+       // サーバソケットオープン
+       if(!m_pSocket.Listen(wServerPort))return FALSE;
+
+       // サーバスレッド起動
+       pthread_create(&m_hServerThread, NULL, CCasServer::ServerThreadRaw, (LPVOID)this);
+       if(!m_hServerThread){
+               m_pSocket.Close();
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+void CCasServer::CloseServer(void)
+{
+       // サーバソケットクローズ
+       m_pSocket.Close();
+
+       // スレッドハンドル開放
+       if(m_hServerThread){
+               pthread_join(m_hServerThread, NULL);
+               m_hServerThread = NULL;
+       }
+
+       // 全クライアント切断
+       m_Lock.Lock();
+       
+       for(ClientList::iterator It = m_ClientList.begin() ; It != m_ClientList.end() ; It++){
+               It->first->CloseClient();
+               }
+
+       m_Lock.Unlock();
+       
+       // 全クライアントの終了を待つ
+       while(m_ClientList.size()) sleep(1UL);
+}
+
+const DWORD CCasServer::GetClientNum(void) const
+{
+       // 接続中のクライアント数を返す
+       return m_ClientList.size();
+}
+
+void CCasServer::OnCasClientEvent(CCasClient *pClient, const DWORD dwEventID, PVOID pParam)
+{
+       CBlockLock AutoLock(&m_Lock);
+
+       // クライアントイベント
+       switch(dwEventID){
+               case CCasClient::EID_CONNECTED :
+                       // リストに追加
+                       m_ClientList[pClient] = pClient;
+                       if (m_pEventHandler) m_pEventHandler->OnCasServerEvent(this, CSEI_CONNECTED);
+                       break;
+                       
+               case CCasClient::EID_DISCONNECTED :
+                       // リストから削除
+                       m_ClientList.erase(pClient);
+                       if (m_pEventHandler) m_pEventHandler->OnCasServerEvent(this, CSEI_DISCONNECTED);
+                       break;
+               }
+}
+
+void CCasServer::ServerThread(void)
+{
+       // アクセプトループ
+       CSmartSock *pNewSocket;
+       
+       while(pNewSocket = m_pSocket.Accept()){
+               // クライアントインスタンス生成
+               new CCasClient(this, pNewSocket);
+               }
+}
+
+void* CCasServer::ServerThreadRaw(LPVOID pParam)
+{
+       // サーバスレッド
+       static_cast<CCasServer *>(pParam)->ServerThread();
+
+       return 0UL;
+}