-// 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
+// CasClient.cpp: CCasClient クラスのインプリメンテーション
+//
+//////////////////////////////////////////////////////////////////////
+
+#include <stdio.h>
+#include "W2L.h"
#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
+
+
+#define TCP_TIMEOUT 1000UL // 1秒
+
+
+CCasClient::CCasClient(ICasClientHandler *pEventHandler, CSmartSock *pSocket)
+ : CBcasCard()
+ , m_pSocket(pSocket)
+ , m_pEventHandler(pEventHandler)
+ , m_hClientThread(NULL)
+{
+ // クライアントスレッド起動
+ pthread_create(&m_hClientThread, NULL, CCasClient::ClientThreadRaw, (LPVOID)this);
+ if(!m_hClientThread){
printf("ClientThread failed\n");
- delete this;\r
- }\r
+ delete this;
+ }
+ pthread_detach(m_hClientThread);
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
+}
+
+CCasClient::~CCasClient(void)
+{
+ delete m_pSocket;
+ if (m_hClientThread) pthread_join(m_hClientThread, NULL);
+}
+
+void CCasClient::CloseClient(void)
+{
+ // クライアントを切断する
+ m_pSocket->Close();
+}
+
+void CCasClient::ClientThread(void)
+{
+ // カードリーダを開く
+ if(!OpenCard())return;
+
+ // 受信バッファ
+ BYTE byDataLen;
+ BYTE RecvBuf[256];
+ DWORD dwRecvSize;
+
+ // メッセージ受信ループ
+ while(1){
+ // ヘッダを受信
+ if(!m_pSocket->Recv(&byDataLen, 1UL, TCP_TIMEOUT)){
+ if(m_pSocket->GetLastError() == CSmartSock::EC_TIMEOUT)continue;
+ else break;
}
-\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
+
+ // データを送信
+ RecvBuf[0] = (BYTE)dwRecvSize;
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
+ // カードリーダを閉じる
+ CloseCard();
+}
+
+void* CCasClient::ClientThreadRaw(LPVOID pParam)
+{
+ // クライアントスレッド
+ CCasClient *pThis = static_cast<CCasClient *>(pParam);
+
+ // 接続イベント通知
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
+
+ return 0UL;
+}
+
+void CCasClient::SendEvent(const DWORD dwEventID, PVOID pParam)
+{
+ // ハンドラにイベントを通知する
+ if(m_pEventHandler)m_pEventHandler->OnCasClientEvent(this, dwEventID, pParam);
+}