-// 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;
+}