TNB Library
TnbFileCommunicator.h
[詳解]
1#pragma once
11#include "TnbFile.h"
12#include "TnbCommunication.h"
13
14
15
16//TNB Library
17namespace TNB
18{
19
20
21
38{
39 DEFSUPER(ICommunication);
40public:
41
55 struct IWorker
56 {
58 virtual ~IWorker(void) {}
59
66 virtual bool OnOpen(void) = 0;
67
77 virtual size_t Read(size_t size, LPVOID _P) =0;
78
87 virtual size_t Write(size_t size, LPCVOID P) = 0;
88
95 virtual bool Purge(void) = 0;
96 };
97
98
99 //--------------------------------------
100
101
104 , m_property(_T("File"), TNBVIW_KIND_FILE, 1000)
105 {
106 }
107
109 virtual ~CFileCommunicator(void)
110 {
111 Close();
112 }
113
120 void SetWorker(IWorker* pWorker)
121 {
122 m_pWorker = pWorker;
123 }
124
130 void SetSendTimeout(DWORD to)
131 {
132 m_sendTimeout = to;
133 }
134
142 virtual bool SetReceiveTimeout(DWORD to)
143 {
145 return true;
146 }
147
152 virtual const TProperty& GetProperty(void) const
153 {
154 return m_property;
155 }
156
162 virtual bool Open(void)
163 {
164 if ( m_pWorker == NULL )
165 {
166 return false;
167 }
168 return m_pWorker->OnOpen();
169 }
170
174 virtual void Close(void)
175 {
176 }
177
183 virtual bool IsOpened(void) const
184 {
185 return true;
186 }
187
193 virtual bool CanSend(void) const
194 {
195 return (m_pWorker != NULL);
196 }
197
203 virtual bool CanReceive(void) const
204 {
205 return (m_pWorker != NULL);
206 }
207
215 virtual size_t Send(size_t size, LPCVOID P)
216 {
217 size_t r = INVALID_SIZE;
218 if ( m_pWorker != NULL )
219 {
220 CTickCount tick;
221 do
222 {
223 size_t rr = m_pWorker->Write(size, P);
224 if ( rr != INVALID_SIZE )
225 {
226 r = rr;
227 break;
228 }
229 ::Sleep(RETRY_INTERVAL);
230 }
231 while ( ! tick.IsPassed(m_sendTimeout) );
232 }
233 return r;
234 }
235
244 virtual size_t Receive(size_t size, LPVOID _P)
245 {
246 size_t r = 0;
247 if ( m_pWorker != NULL )
248 {
249 CTickCount tick;
250 do
251 {
252 size_t rr = m_pWorker->Read(size, _P);
253 if ( rr != INVALID_SIZE )
254 {
255 r = rr;
256 break;
257 }
258 ::Sleep(RETRY_INTERVAL);
259 }
260 while ( ! tick.IsPassed(m_property.receiveTimeout) );
261 }
262 return r;
263 }
264
270 virtual size_t GetReceivingDataSize(void) const
271 {
272 return INVALID_SIZE;
273 }
274
281 virtual EState Check(void) const
282 {
283 return IsConnect() ? CONNECTING : CLOSED;
284 }
285
290 virtual void Purge(void)
291 {
292 if ( m_pWorker != NULL )
293 {
294 CTickCount tick;
295 do
296 {
297 if ( m_pWorker->Purge() )
298 {
299 break;
300 }
301 ::Sleep(RETRY_INTERVAL);
302 }
303 while ( ! tick.IsPassed(m_property.receiveTimeout) );
304 }
305 }
306
307protected:
308 enum { RETRY_INTERVAL = 10 };
312};
313
314
315
332{
333public:
334
341 bool SetFileName(LPCTSTR lpszReadFile, LPCTSTR lpszWriteFile)
342 {
343 m_readFile = lpszReadFile;
344 m_writeFile = lpszWriteFile;
345 return true;
346 }
347
354 virtual bool OnOpen(void)
355 {
356 Purge();
357 bool isEmpty = m_readFile.IsEmpty() || m_writeFile.IsEmpty();
358 return ! isEmpty;
359 }
360
369 virtual size_t Read (size_t size, LPVOID _P)
370 {
371 CFileReader fr;
372 if ( fr.Open(m_readFile, false) )
373 {
374 size_t r = fr.Read(size, _P);
375 fr.Close();
376 ::DeleteFile(m_readFile);
377 return r;
378 }
379 DWORD e = ::GetLastError();
380 return (e == ERROR_FILE_NOT_FOUND) ? 0 : INVALID_SIZE;
381 }
382
390 virtual size_t Write(size_t size, LPCVOID P)
391 {
392 CFileWriter fw;
393 if ( fw.New(m_writeFile, false) )
394 {
395 try
396 {
397 fw.Write(size, P);
398 return size;
399 }
400 catch ( CWriteFailureException& e )
401 {
402 e.OnCatch();
403 }
404 }
405 return INVALID_SIZE;
406 }
407
414 virtual bool Purge(void)
415 {
416 ::DeleteFile(m_writeFile);
417 BOOL r = ::DeleteFile(m_readFile + _T("__"));
418 r &= ::DeleteFile(m_readFile);
419 return !! r;
420 }
421
422protected:
423
426};
427
428
429
430}; // TNB
通信関係のヘッダ
ファイル関係のヘッダ
ファイル通信ワーカークラス
virtual size_t Read(size_t size, LPVOID _P)
[取得] 読み込み対象オープン.
bool SetFileName(LPCTSTR lpszReadFile, LPCTSTR lpszWriteFile)
[設定] 対象ファイル名設定.
CStr m_readFile
読み込み対象ファイル名
virtual bool Purge(void)
[処理] パージ.
virtual bool OnOpen(void)
[処理] オープン.
CStr m_writeFile
書き込み対象ファイル名
virtual size_t Write(size_t size, LPCVOID P)
[取得] 書き込み対象オープン.
ファイル通信クラス
virtual EState Check(void) const
[確認] チェック.
IWorker * m_pWorker
ワーカー
virtual bool SetReceiveTimeout(DWORD to)
[設定] 受信待ち時間設定.
virtual bool Open(void)
[処理] オープン.
void SetWorker(IWorker *pWorker)
[設定] ワーカーの指定.
virtual bool CanSend(void) const
[確認] 送信可能確認.
CFileCommunicator(void)
コンストラクタ
TProperty m_property
本クラスの性能
virtual void Purge(void)
[処理] パージ.
void SetSendTimeout(DWORD to)
[設定] 送信待ち時間設定.
virtual void Close(void)
[処理] クローズ.
DWORD m_sendTimeout
送信タイムアウト
virtual bool CanReceive(void) const
[確認] 受信可能確認.
virtual bool IsOpened(void) const
[確認] オープン確認.
virtual size_t Receive(size_t size, LPVOID _P)
[処理] 受信.
virtual ~CFileCommunicator(void)
デストラクタ
virtual const TProperty & GetProperty(void) const
[取得] 性能取得.
virtual size_t GetReceivingDataSize(void) const
[確認] 受信データ確認.
virtual size_t Send(size_t size, LPCVOID P)
[処理] 送信.
ファイル読み込みクラス
Definition: TnbFile.h:338
virtual size_t Read(size_t size, LPVOID _P) const
[取得] ファイル読み込み
Definition: TnbFile.h:420
bool Open(LPCTSTR lpszName, bool boIsShare=true, bool boDummy=false)
[操作] オープン
Definition: TnbFile.h:364
virtual void Close(void)
[操作] クローズ
Definition: TnbFile.h:351
ファイル書き込みクラス
Definition: TnbFile.h:475
bool New(LPCTSTR lpszName, bool boIsShare=true)
[操作] 新規オープン.
Definition: TnbFile.h:501
virtual void Write(size_t size, LPCVOID P)
[保存] ファイル書き込み
Definition: TnbFile.h:628
bool IsEmpty(void) const
[確認] 空チェック
Definition: TnbStr.h:528
経過時間管理クラス
Definition: TnbTickCount.h:57
bool IsPassed(DWORD dwTime) const
[確認] 経過確認.
Definition: TnbTickCount.h:114
void OnCatch(void) const
[表示] 内容表示
Definition: TnbException.h:69
書き込み失敗発生例外
Definition: TnbException.h:255
TNB Library
Definition: TnbDoxyTitle.txt:2
ファイル通信ワーカーインターフェース.
virtual size_t Read(size_t size, LPVOID _P)=0
[処理] 読み込み.
virtual bool Purge(void)=0
[処理] パージ.
virtual ~IWorker(void)
デストラクタ
virtual bool OnOpen(void)=0
[処理] オープン.
virtual size_t Write(size_t size, LPCVOID P)=0
[処理] 書き込み.
性能プロパティ型.
DWORD receiveTimeout
受信待ち時間。 INFINITE ならブロックされる。
通信インターフェース
virtual bool IsConnect(void) const
[確認] 接続確認.
@ CONNECTING
オープン&接続状態
@ CLOSED
クローズ状態