--- /dev/null
+// 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
+#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