TNB Library
TnbQueueingReporter.h
[詳解]
1#pragma once
13#include "TnbReport.h"
14#include "TnbQueue.h"
15
16
17
18//TNB Library
19namespace TNB
20{
21
22
23
85{
86public:
87
99 struct IListener
100 {
102 virtual ~IListener(void) {}
103
111 virtual bool OnReportEvent(const CReportEvent& ev) = 0;
112
120 virtual size_t OnReportData(bool boIsLast, const IConstCollectionT<BYTE>& c) = 0;
121
127 virtual void OnReportDustyData(BYTE b) {}
128 };
129
134 explicit CQueueingReporter(int iQueueSize = 10000) : m_in(iQueueSize)
135 {
136 }
137
140 {
142 }
143
151 void SetEnvironment(IReport* pReport, IListener* pListener)
152 {
153 Purge();
154 m_in.m_pListener = pListener;
155 m_in.m_pReport = pReport;
156 if ( m_in.m_pReport != NULL )
157 {
158 m_in.m_pReport->SetListener(&m_in);
159 }
160 }
161
164 {
165 if ( m_in.m_pReport != NULL )
166 {
167 m_in.m_pReport->SetListener(NULL);
168 m_in.m_pListener = NULL;
169 m_in.m_pReport = NULL;
170 }
171 }
172
180 void SetAliveTime(DWORD time = DWORD_MAX)
181 {
182 m_in.m_aliveTime = time;
183 m_in.m_tearminalTime = DWORD_MAX;
184 }
185
192 void SetTearminalTime(DWORD time = DWORD_MAX)
193 {
194 m_in.m_tearminalTime = time;
195 m_in.m_aliveTime = DWORD_MAX;
196 }
197
204 bool IsAlive(void) const
205 {
206 if ( m_in.m_pReport != NULL )
207 {
208 return m_in.m_pReport->IsAlive();
209 }
210 return false;
211 }
212
218 bool IsConnect(void) const
219 {
220 if ( m_in.m_pReport != NULL )
221 {
222 return m_in.m_pReport->IsConnect();
223 }
224 return false;
225 }
226
235 bool Send(size_t dataSize, LPCVOID lpcData)
236 {
237 if ( m_in.m_pReport != NULL )
238 {
239 return m_in.m_pReport->Send(dataSize, lpcData);
240 }
241 return false;
242 }
243
248 void Purge(void)
249 {
250 m_in.m_queueData.RemoveAll(); //RAW情報のみ削除
251 }
252
257 size_t GetQueueFreeSize(void) const
258 {
259 return m_in.m_queueData.GetFreeSize();
260 }
261
267 {
268 return m_in.m_pReport;
269 }
270
275 const IReport* ReferReport(void) const
276 {
277 return m_in.m_pReport;
278 }
279
280private:
282 class CInner : public IReport::IListener
283 {
284 DEFPARENTLISTENER(CQueueingReporter, IParentListener);
285 public:
287 CInner(int queueSize = 10000)
288 : m_queueData(queueSize), m_pListener(NULL), m_pReport(NULL), m_aliveTime(DWORD_MAX), m_tearminalTime(DWORD_MAX)
289 {
290 }
292 virtual bool OnReportEvent(const CReportEvent& ev)
293 {
294 if ( m_pListener == NULL )
295 {
296 return true;
297 }
298 if ( ev.HasData() )
299 {
300 EXCLUSIVE( &m_queueData );
301 //== データあり
302 size_t size = ev.GetDataSize();
303 const BYTE* B = ev.GetData();
304 while ( size > 0 )
305 {
306 size_t freeSize = m_queueData.GetFreeSize();
307 if ( freeSize == 0 )
308 {
309 ASSERT0( false, "CQueueingReporter", "キューがあふれました。" );
310 break;
311 }
312 size_t l = size;
313 if ( l > freeSize )
314 {
315 l = freeSize;
316 }
317 m_queueData.AddElements(l, B);
318 if ( m_tearminalTime == DWORD_MAX )
319 {
320 m_OnDeseri(false);
321 }
322 else
323 {
324 m_pReport->SetIdleEventMode(m_tearminalTime);
325 }
326 B += l;
327 size -= l;
328 }
329 return true;
330 }
331 //== イベントあり
332 switch ( ev.GetEvent() )
333 {
335 m_OnDeseri(true);
336 m_queueData.RemoveAll(); //RAW情報のみ削除
337 break;
338 case ReportEvent_Idle:
339 if ( m_aliveTime != DWORD_MAX )
340 {
341 EXCLUSIVE( &m_queueData );
342 BYTE b;
343 if ( m_queueData.TakeElements(1, &b) == 1 )
344 {
345 m_pListener->OnReportDustyData(b);
346 }
347 m_pReport->SetIdleEventMode(0);
348 m_OnDeseri(false);
349 }
350 if ( m_tearminalTime != DWORD_MAX )
351 {
352 m_OnDeseri(false);
353 m_pReport->SetIdleEventMode(0);
354 }
355 break;
356 default:
357 break;
358 }
359 return m_pListener->OnReportEvent(ev);
360 }
361
362 CRingQueueT<BYTE> m_queueData;
363 IParentListener* m_pListener;
364 IReport* m_pReport;
365 DWORD m_aliveTime;
366 DWORD m_tearminalTime;
367
368 protected:
370 void m_OnDeseri(bool boIsLast)
371 {
372 while ( ! m_queueData.IsEmpty() )
373 {
374 size_t r = m_pListener->OnReportData(boIsLast, m_queueData);
375 if ( r == 0 )
376 {
377 if ( boIsLast )
378 {
379 m_queueData.RemoveAll();
380 }
381 else
382 {
383 if ( m_aliveTime != DWORD_MAX )
384 {
385 m_pReport->SetIdleEventMode(m_aliveTime);
386 }
387 }
388 return;
389 }
390 m_queueData.EraseElements(r);
391 }
392 }
393 };
394 CInner m_in;
395};
396
397
398
399}; // TNB
400
キュー型情報管理関係のヘッダ
通信報告関係のヘッダ
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
キューイングレポートクラス
void Purge(void)
[消去] キューバッファクリア.
void SetEnvironment(IReport *pReport, IListener *pListener)
[設定] 環境設定
void SetTearminalTime(DWORD time=DWORD_MAX)
[設定] 終端時間設定.
bool Send(size_t dataSize, LPCVOID lpcData)
[送信] データ送信.
void SetAliveTime(DWORD time=DWORD_MAX)
[設定] キュー有効時間設定.
~CQueueingReporter(void)
デストラクタ
bool IsAlive(void) const
[確認] Aliveチェック.
void ResetEnvironment(void)
[設定] 環境リセット
bool IsConnect(void) const
[確認] 接続チェック
size_t GetQueueFreeSize(void) const
[取得] キュー空きサイズ取得.
CQueueingReporter(int iQueueSize=10000)
コンストラクタ
const IReport * ReferReport(void) const
[取得] レポータ取得
IReport * ReferReport(void)
[取得] レポータ取得
通信受信イベント管理クラス
Definition: TnbReport.h:70
size_t GetDataSize(void) const
[取得] データ長取得
Definition: TnbReport.h:139
const BYTE * GetData(void) const
[取得] データアドレス取得
Definition: TnbReport.h:148
EReportEvent GetEvent(void) const
[取得] イベントコード取得
Definition: TnbReport.h:157
bool HasData(void) const
[確認] Dataを持っているか
Definition: TnbReport.h:120
virtual bool RemoveAll(void)
[削除] データ全削除.
Definition: TnbQueue.h:322
#define EXCLUSIVE(CLS)
簡易排他制御マクロ.
Definition: TnbSync.h:788
TNB Library
Definition: TnbDoxyTitle.txt:2
@ ReportEvent_Disconnect
切断.
Definition: TnbReport.h:34
@ ReportEvent_Idle
アイドル.
Definition: TnbReport.h:30
キューイングレポートのリスナーインターフェース
virtual size_t OnReportData(bool boIsLast, const IConstCollectionT< BYTE > &c)=0
[通知] データ受信通知
virtual ~IListener(void)
デストラクタ
virtual bool OnReportEvent(const CReportEvent &ev)=0
[通知] イベント発生通知
virtual void OnReportDustyData(BYTE b)
[通知] ゴミデータ化通知.
bool IsEmpty(void) const
[確認] 要素の有無確認.
virtual size_t EraseElements(size_t size)
[削除] 要素削除.
Definition: TnbQueue.h:103
通信のリスナーインターフェース
Definition: TnbReport.h:243
通信アクセスインターフェース
Definition: TnbReport.h:227
virtual void SetIdleEventMode(int iInterval=0)=0
[設定] アイドルイベント設定