OSDN Git Service

fix memory leak, thanks to Valgrind
[rec10/rec10-git.git] / b25-remote / CasClient.cpp
index 4b6c6fb..74fbb17 100755 (executable)
@@ -1,97 +1,98 @@
-// 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);
+}