OSDN Git Service

4c733b8c979a7e9f2823b355054a2dd268e6a7bf
[rec10/rec10-git.git] / b25-remote / CasServer.cpp
1 // 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
2 //\r
3 //////////////////////////////////////////////////////////////////////\r
4 \r
5 \r
6 #include "CasServer.h"\r
7 #include "BCasCard.h"\r
8 \r
9 #define FALSE 0
10 #define TRUE 1\r
11 \r
12 CCasServer::CCasServer(ICasServerHandler *pEventHandler)\r
13         : m_pEventHandler(pEventHandler)\r
14         , m_hServerThread(NULL)\r
15 {\r
16 \r
17 }\r
18 \r
19 CCasServer::~CCasServer(void)\r
20 {\r
21         CloseServer();\r
22 }\r
23 \r
24 const BOOL CCasServer::OpenServer(const WORD wServerPort)\r
25 {\r
26         // \83J\81[\83h\83\8a\81[\83_\91\8dÝ\83`\83F\83b\83N\r
27         CBcasCard BCasCard;\r
28         if(!BCasCard.OpenCard())return FALSE;\r
29 \r
30         // \83T\81[\83o\83\\83P\83b\83g\83I\81[\83v\83\93\r
31         if(!m_pSocket.Listen(wServerPort))return FALSE;\r
32 \r
33         // \83T\81[\83o\83X\83\8c\83b\83h\8bN\93®\r
34         pthread_create(&m_hServerThread, NULL, CCasServer::ServerThreadRaw, (LPVOID)this);\r
35         if(!m_hServerThread){\r
36                 m_pSocket.Close();\r
37                 return FALSE;\r
38         }\r
39 \r
40         return TRUE;\r
41 }\r
42 \r
43 void CCasServer::CloseServer(void)\r
44 {\r
45         // \83T\81[\83o\83\\83P\83b\83g\83N\83\8d\81[\83Y\r
46         m_pSocket.Close();\r
47 \r
48         // \83X\83\8c\83b\83h\83n\83\93\83h\83\8b\8aJ\95ú\r
49         if(m_hServerThread){\r
50                 pthread_join(m_hServerThread, NULL);\r
51                 m_hServerThread = NULL;\r
52         }\r
53 \r
54         // \91S\83N\83\89\83C\83A\83\93\83g\90Ø\92f\r
55         m_Lock.Lock();\r
56         \r
57         for(ClientList::iterator It = m_ClientList.begin() ; It != m_ClientList.end() ; It++){\r
58                 It->first->CloseClient();\r
59                 }\r
60 \r
61         m_Lock.Unlock();\r
62         \r
63         // \91S\83N\83\89\83C\83A\83\93\83g\82Ì\8fI\97¹\82ð\91Ò\82Â\r
64         while(m_ClientList.size()) sleep(1UL);\r
65 }\r
66 \r
67 const DWORD CCasServer::GetClientNum(void) const\r
68 {\r
69         // \90Ú\91±\92\86\82Ì\83N\83\89\83C\83A\83\93\83g\90\94\82ð\95Ô\82·\r
70         return m_ClientList.size();\r
71 }\r
72 \r
73 void CCasServer::OnCasClientEvent(CCasClient *pClient, const DWORD dwEventID, PVOID pParam)\r
74 {\r
75         CBlockLock AutoLock(&m_Lock);\r
76 \r
77         // \83N\83\89\83C\83A\83\93\83g\83C\83x\83\93\83g\r
78         switch(dwEventID){\r
79                 case CCasClient::EID_CONNECTED :\r
80                         // \83\8a\83X\83g\82É\92Ç\89Á\r
81                         m_ClientList[pClient] = pClient;\r
82                         if (m_pEventHandler) m_pEventHandler->OnCasServerEvent(this, CSEI_CONNECTED);\r
83                         break;\r
84                         \r
85                 case CCasClient::EID_DISCONNECTED :\r
86                         // \83\8a\83X\83g\82©\82ç\8dí\8f\9c\r
87                         m_ClientList.erase(pClient);\r
88                         if (m_pEventHandler) m_pEventHandler->OnCasServerEvent(this, CSEI_DISCONNECTED);\r
89                         break;\r
90                 }\r
91 }\r
92 \r
93 void CCasServer::ServerThread(void)\r
94 {\r
95         // \83A\83N\83Z\83v\83g\83\8b\81[\83v\r
96         CSmartSock *pNewSocket;\r
97         \r
98         while(pNewSocket = m_pSocket.Accept()){\r
99                 // \83N\83\89\83C\83A\83\93\83g\83C\83\93\83X\83^\83\93\83X\90\90¬\r
100                 new CCasClient(this, pNewSocket);\r
101                 }\r
102 }\r
103 \r
104 void* CCasServer::ServerThreadRaw(LPVOID pParam)\r
105 {\r
106         // \83T\81[\83o\83X\83\8c\83b\83h\r
107         static_cast<CCasServer *>(pParam)->ServerThread();\r
108 \r
109         return 0UL;\r
110 }\r