OSDN Git Service

add dist
[rec10/rec10-git.git] / dist / trunk / b25-remote / CasServer.cpp
diff --git a/dist/trunk/b25-remote/CasServer.cpp b/dist/trunk/b25-remote/CasServer.cpp
new file mode 100755 (executable)
index 0000000..4c733b8
--- /dev/null
@@ -0,0 +1,110 @@
+// 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