OSDN Git Service

tunerec: include <unistd.h> for usleep
[rec10/rec10-git.git] / b25-remote / CasClient.cpp
1 // CasClient.cpp: CCasClient クラスのインプリメンテーション
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #include <stdio.h>
6 #include "W2L.h"
7 #include "CasClient.h"
8
9
10 #define TCP_TIMEOUT             1000UL          // 1秒
11
12
13 CCasClient::CCasClient(ICasClientHandler *pEventHandler, CSmartSock *pSocket)
14         : CBcasCard()
15         , m_pSocket(pSocket)
16         , m_pEventHandler(pEventHandler)
17         , m_hClientThread(NULL)
18 {
19         // クライアントスレッド起動
20         pthread_create(&m_hClientThread, NULL, CCasClient::ClientThreadRaw, (LPVOID)this);
21         if(!m_hClientThread){
22                 printf("ClientThread failed\n");
23                 delete this;
24         }
25         pthread_detach(m_hClientThread);
26         printf("ClientThread started\n");
27 }
28
29 CCasClient::~CCasClient(void)
30 {
31         delete m_pSocket;
32         if (m_hClientThread) pthread_join(m_hClientThread, NULL);
33 }
34
35 void CCasClient::CloseClient(void)
36 {
37         // クライアントを切断する
38         m_pSocket->Close();
39 }
40
41 void CCasClient::ClientThread(void)
42 {
43         // カードリーダを開く
44         if(!OpenCard())return;
45         
46         // 受信バッファ
47         BYTE byDataLen;
48         BYTE RecvBuf[256];
49         DWORD dwRecvSize;
50         
51         // メッセージ受信ループ
52         while(1){
53                 // ヘッダを受信
54                 if(!m_pSocket->Recv(&byDataLen, 1UL, TCP_TIMEOUT)){
55                         if(m_pSocket->GetLastError() == CSmartSock::EC_TIMEOUT)continue;
56                         else break;
57                 }
58
59                 // データを受信
60                 if(!m_pSocket->Recv(RecvBuf, byDataLen, TCP_TIMEOUT))break;
61         
62                 // カード送受信
63                 if(!TransmitCommand(RecvBuf, byDataLen, &RecvBuf[1], sizeof(RecvBuf) - 1UL, &dwRecvSize))dwRecvSize = 0UL;
64
65                 // データを送信
66                 RecvBuf[0] = (BYTE)dwRecvSize;
67                 if(!m_pSocket->Send(RecvBuf, dwRecvSize + 1UL, TCP_TIMEOUT))break;
68         }
69
70         printf("ClientThread exited\n");
71         // カードリーダを閉じる
72         CloseCard();
73 }
74
75 void* CCasClient::ClientThreadRaw(LPVOID pParam)
76 {
77         // クライアントスレッド
78         CCasClient *pThis = static_cast<CCasClient *>(pParam);
79
80         // 接続イベント通知
81         pThis->SendEvent(EID_CONNECTED);
82
83         // メンバ関数にリダイレクトする
84         pThis->ClientThread();
85
86         // 切断イベント通知
87         pThis->SendEvent(EID_DISCONNECTED);
88
89         delete pThis;
90
91         return 0UL;
92 }
93
94 void CCasClient::SendEvent(const DWORD dwEventID, PVOID pParam)
95 {
96         // ハンドラにイベントを通知する
97         if(m_pEventHandler)m_pEventHandler->OnCasClientEvent(this, dwEventID, pParam);
98 }