OSDN Git Service

add dist
[rec10/rec10-git.git] / dist / trunk / b25-remote / CasClient.cpp
diff --git a/dist/trunk/b25-remote/CasClient.cpp b/dist/trunk/b25-remote/CasClient.cpp
new file mode 100755 (executable)
index 0000000..4b6c6fb
--- /dev/null
@@ -0,0 +1,97 @@
+// CasClient.cpp: CCasClient \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
+#include <stdio.h>\r
+#include "W2L.h"\r
+#include "CasClient.h"
+\r
+\r
+#define TCP_TIMEOUT            1000UL          // 1\95b\r
+\r
+\r
+CCasClient::CCasClient(ICasClientHandler *pEventHandler, CSmartSock *pSocket)\r
+       : CBcasCard()\r
+       , m_pSocket(pSocket)\r
+       , m_pEventHandler(pEventHandler)\r
+       , m_hClientThread(NULL)\r
+{\r
+       // \83N\83\89\83C\83A\83\93\83g\83X\83\8c\83b\83h\8bN\93®\r
+       pthread_create(&m_hClientThread, NULL, CCasClient::ClientThreadRaw, (LPVOID)this);\r
+       if(!m_hClientThread){\r
+               printf("ClientThread failed\n");
+               delete this;\r
+       }\r
+       printf("ClientThread started\n");
+}\r
+\r
+CCasClient::~CCasClient(void)\r
+{\r
+       delete m_pSocket;\r
+       if (m_hClientThread) pthread_join(m_hClientThread, NULL);\r
+}\r
+\r
+void CCasClient::CloseClient(void)\r
+{\r
+       // \83N\83\89\83C\83A\83\93\83g\82ð\90Ø\92f\82·\82é\r
+       m_pSocket->Close();\r
+}\r
+\r
+void CCasClient::ClientThread(void)\r
+{\r
+       // \83J\81[\83h\83\8a\81[\83_\82ð\8aJ\82­\r
+       if(!OpenCard())return;\r
+       \r
+       // \8eó\90M\83o\83b\83t\83@\r
+       BYTE byDataLen;\r
+       BYTE RecvBuf[256];\r
+       DWORD dwRecvSize;\r
+       \r
+       // \83\81\83b\83Z\81[\83W\8eó\90M\83\8b\81[\83v\r
+       while(1){\r
+               // \83w\83b\83_\82ð\8eó\90M\r
+               if(!m_pSocket->Recv(&byDataLen, 1UL, TCP_TIMEOUT)){\r
+                       if(m_pSocket->GetLastError() == CSmartSock::EC_TIMEOUT)continue;\r
+                       else break;\r
+               }
+\r
+               // \83f\81[\83^\82ð\8eó\90M\r
+               if(!m_pSocket->Recv(RecvBuf, byDataLen, TCP_TIMEOUT))break;
+       \r
+               // \83J\81[\83h\91\97\8eó\90M\r
+               if(!TransmitCommand(RecvBuf, byDataLen, &RecvBuf[1], sizeof(RecvBuf) - 1UL, &dwRecvSize))dwRecvSize = 0UL;
+\r
+               // \83f\81[\83^\82ð\91\97\90M\r
+               RecvBuf[0] = (BYTE)dwRecvSize;\r
+               if(!m_pSocket->Send(RecvBuf, dwRecvSize + 1UL, TCP_TIMEOUT))break;
+       }\r
+\r
+       printf("ClientThread exited\n");
+       // \83J\81[\83h\83\8a\81[\83_\82ð\95Â\82\82é\r
+       CloseCard();\r
+}\r
+\r
+void* CCasClient::ClientThreadRaw(LPVOID pParam)\r
+{\r
+       // \83N\83\89\83C\83A\83\93\83g\83X\83\8c\83b\83h\r
+       CCasClient *pThis = static_cast<CCasClient *>(pParam);\r
+\r
+       // \90Ú\91±\83C\83x\83\93\83g\92Ê\92m\r
+       pThis->SendEvent(EID_CONNECTED);
+\r
+       // \83\81\83\93\83o\8aÖ\90\94\82É\83\8a\83_\83C\83\8c\83N\83g\82·\82é\r
+       pThis->ClientThread();
+\r
+       // \90Ø\92f\83C\83x\83\93\83g\92Ê\92m\r
+       pThis->SendEvent(EID_DISCONNECTED);
+\r
+       delete pThis;
+\r
+       return 0UL;\r
+}\r
+\r
+void CCasClient::SendEvent(const DWORD dwEventID, PVOID pParam)\r
+{\r
+       // \83n\83\93\83h\83\89\82É\83C\83x\83\93\83g\82ð\92Ê\92m\82·\82é\r
+       if(m_pEventHandler)m_pEventHandler->OnCasClientEvent(this, dwEventID, pParam);\r
+}\r