亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? eventdispatcher.cpp

?? .net 方面的開發說明資料。
?? CPP
字號:
// ========================================================
// Event Dispatching
//
// Design and Implementation by Floris van den Berg
// ========================================================

#pragma warning (disable : 4275)
#pragma warning (disable : 4786)
#pragma warning (disable : 4200)

#include <stdio.h>
#include <assert.h>

#include <boost/thread/xtime.hpp>

#include "Utilities.h"
#include "Agent.h"
#include "OpenNet.h"
#include "EventDispatcher.h"
#include "Transport.h"

// --------------------------------------------------------

extern IAgent *s_agent_container;

// --------------------------------------------------------
// Main thread function for event dispatching
// --------------------------------------------------------

DispatchFunctor::DispatchFunctor(EventDispatcher *entry) :
m_entry(entry) {
}

bool
DispatchFunctor::operator()() {
	EpEventEx *event = NULL;

	// grab the next event from the queue

	{
		boost::mutex::scoped_lock scoped_lock(m_entry->m_mutex);

		if (!m_entry->m_event_list.empty()) {
			event = m_entry->m_event_list.front();
			m_entry->m_event_list.pop_front();
		}
	}

	// process the event

	if (event) {
		TransportEntry *plug_entry = s_agent_container->findPlugEntry((ITransport *)event->transport);

		if (plug_entry) {
			// send the event to the protocols that registered for it

			bool do_dispatch = DispatchEvent(plug_entry, event->event->protocol, event->event);

			// if the sessions didn't block this event, send it to user callback
			// note that system events can't be blocked...

			if (plug_entry->callback) {
				if (IsEqualGUID(event->event->protocol, CLSID_SYSTEM_PROTOCOL)) {
					if ((event->event->msg != SYSTEM_DATA_IN) && (event->event->msg != SYSTEM_DATA_OUT)) {
						plug_entry->callback(event->transport, event->event, plug_entry->data);
					} else if (plug_entry->m_enable_debug_events) {
						plug_entry->callback(event->transport, event->event, plug_entry->data);
					}
				} else if (do_dispatch) {
					plug_entry->callback(event->transport, event->event, plug_entry->data);
				}
			}
		}

		m_entry->destroyEventEntry(event);
		return true;
	}

	return false;	
}

bool
DispatchFunctor::DispatchEvent(TransportEntry *plug_entry, GUID &guid, EpEvent *event) {
	bool do_dispatch = true;

	// system event dispatching

	if (IsEqualGUID(event->protocol, CLSID_SYSTEM_PROTOCOL)) {
		switch(event->msg) {
			case SYSTEM_CONNECTED :
				EpCancelTimeout(plug_entry->transport, CLSID_SYSTEM_PROTOCOL, SYSTEM_CONNECT_TIMEOUT);
				break;

			case SYSTEM_DATA_IN :
			{
				if ((plug_entry->protocols_it = plug_entry->protocols.rbegin()) != plug_entry->protocols.rend())
					(*plug_entry->protocols_it)->protocol->receive((*plug_entry->protocols_it)->self, event->data, event->size);

				if (((!plug_entry->m_enable_debug_events) && (!plug_entry->protocols.empty())))
					return false;

				break;
			}

			case SYSTEM_DATA_OUT :
			{
				if (!plug_entry->m_enable_debug_events)
					return false;

				break;
			}
		};
	}

	// return true if this event may be sent to the general callback

	return do_dispatch;
}

// --------------------------------------------------------
// Event Dispatch Class
// --------------------------------------------------------

EventDispatcher::EventDispatcher() :
m_dispatch_functor(NULL),
m_mutex(),
m_event_list(),
m_time_stamp(EpGetTickCount()),
m_delay(0) {
	m_dispatch_functor = new DispatchFunctor(this);
}

EventDispatcher::~EventDispatcher() {
	delete m_dispatch_functor;
}

// --------------------------------------------------------

EpEventEx *
EventDispatcher::createEventEntry(TRANSPORT_HANDLE transport, EpEvent *event) {
	assert(event != NULL);

	EpEvent *clone = new EpEvent;
	clone->reference_id = event->reference_id;
	clone->protocol = event->protocol;
	clone->msg = event->msg;

	if ((event->data) && (event->size > 0)) {
		clone->size = event->size;
		clone->data = new unsigned char[event->size];
		memcpy(clone->data, event->data, event->size);
	} else {
		clone->size = 0;
		clone->data = NULL;
	}

	EpEventEx *entry = new EpEventEx;
	entry->transport = transport;
	entry->event = clone;
	return entry;
}

void
EventDispatcher::destroyEventEntry(EpEventEx *event) {
	if (event->event->data)
		delete [] event->event->data;

	delete event->event;
	delete event;
}

void
EventDispatcher::pushEventEntry(EpEventEx *event) {
	boost::mutex::scoped_lock scoped_lock(m_mutex);

	m_event_list.push_back(event);
}

bool
EventDispatcher::heartBeat() {
	DWORD tick = EpGetTickCount();

	// correct tick when gettickcount wraps to 0

	if (m_time_stamp <= tick)
		tick -= m_time_stamp;
	else
		tick = (0xFFFFFFFF - m_time_stamp) + tick;

	// first check for changed connections

	if (tick >= m_delay) {
		m_time_stamp = EpGetTickCount();

		// dispatch the next events on the queue
		// the functor returns true if it processed an event,
		// or false if there weren't any events on the queue

		m_delay = (*m_dispatch_functor)() ? 0 : 10;
		return (m_delay == 0);
	}

	return false;
}

void
EventDispatcher::clearPendingEventEntries(EventList &list) {
	boost::mutex::scoped_lock scoped_lock(m_mutex);

	EventList::iterator i = list.begin();

	while (i != list.end()) {
		destroyEventEntry(*i);
		i = list.erase(i);
	}
}

void
EventDispatcher::clearPendingEventEntries() {
	boost::mutex::scoped_lock scoped_lock(m_mutex);

	clearPendingEventEntries(m_event_list);
}

void
EventDispatcher::clearPendingEventEntries(TRANSPORT_HANDLE transport, EventList &list) {
	boost::mutex::scoped_lock scoped_lock(m_mutex);

	EventList::iterator i = list.begin();

	while (i != list.end()) {
		if ((*i)->transport == transport) {
			destroyEventEntry(*i);

			i = list.erase(i);

			continue;
		}

		++i;
	}
}

void
EventDispatcher::clearPendingEventEntries(TRANSPORT_HANDLE transport) {
	boost::mutex::scoped_lock scoped_lock(m_mutex);

	clearPendingEventEntries(transport, m_event_list);
}

void
EventDispatcher::clearPendingEventEntries(TRANSPORT_HANDLE transport, CLSID protocol, EventList &list) {
	boost::mutex::scoped_lock scoped_lock(m_mutex);

	EventList::iterator i = list.begin();

	while (i != list.end()) {
		if ((*i)->transport == transport) {
			if (IsEqualGUID((*i)->event->protocol, protocol)) {
				destroyEventEntry(*i);

				i = list.erase(i);

				continue;
			}
		}

		++i;
	}
}

void
EventDispatcher::clearPendingEventEntries(TRANSPORT_HANDLE transport, CLSID protocol) {
	boost::mutex::scoped_lock scoped_lock(m_mutex);

	clearPendingEventEntries(transport, protocol, m_event_list);
}

// --------------------------------------------------------
// Singleton implementation
// --------------------------------------------------------

EventDispatcher *EventDispatcher::instance = NULL;

EventDispatcher *
EventDispatcher::getInstance() {
	if (!isInstantiated())
		EventDispatcher::instance = new EventDispatcher;

	return EventDispatcher::instance;
}

void
EventDispatcher::destroyInstance() {
	if (isInstantiated()) {
		delete EventDispatcher::instance;

		EventDispatcher::instance = NULL;
	}
}

bool
EventDispatcher::isInstantiated() {
	return (EventDispatcher::instance != NULL);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜日韩在线电影| 亚洲妇熟xx妇色黄| 亚洲综合色网站| 狠狠色丁香九九婷婷综合五月| 成人高清在线视频| 欧美一区二区成人| 亚洲欧美综合在线精品| 蜜臀久久99精品久久久画质超高清| 国产剧情av麻豆香蕉精品| 欧美午夜精品久久久久久超碰| 欧美国产一区在线| 玖玖九九国产精品| 欧美日韩国产高清一区二区三区| 国产精品热久久久久夜色精品三区| 欧美aa在线视频| 精品视频一区二区不卡| 亚洲特黄一级片| 2019国产精品| 亚洲无人区一区| 丁香激情综合五月| 亚洲精品一区二区三区精华液| 亚洲男人电影天堂| 成人福利视频在线| 中日韩av电影| 国产精品99久久久久久似苏梦涵| 91精品国产综合久久精品性色| 亚洲美女免费视频| 91一区在线观看| 国产视频视频一区| 成人午夜免费av| 国产农村妇女精品| 高清在线成人网| 久久久久国产免费免费| 国产一级精品在线| 精品理论电影在线| 精品一区二区av| 日韩免费一区二区三区在线播放| 奇米色一区二区三区四区| 欧美一二三区在线| 蜜桃av一区二区在线观看| 欧美一区二区成人| 黑人巨大精品欧美黑白配亚洲| 日韩精品一区二区三区在线播放| 美日韩一区二区三区| 久久综合久久99| 国产麻豆欧美日韩一区| 国产欧美在线观看一区| 成人免费看片app下载| 国产精品蜜臀av| 日本高清视频一区二区| 亚洲va中文字幕| 欧美大肚乱孕交hd孕妇| 国产成人综合精品三级| 国产精品国产三级国产aⅴ中文| 成人av集中营| 五月开心婷婷久久| 26uuu精品一区二区在线观看| 岛国精品一区二区| 亚洲乱码中文字幕| 欧美一卡在线观看| 成人自拍视频在线观看| 亚洲综合图片区| wwwwww.欧美系列| 成人av在线播放网址| 依依成人综合视频| 精品久久久久久久久久久久久久久 | 奇米色777欧美一区二区| 日韩你懂的在线播放| 成人精品国产福利| 一区2区3区在线看| 精品黑人一区二区三区久久| www.亚洲国产| 午夜成人免费电影| 国产日韩v精品一区二区| 欧美亚洲精品一区| 国产激情91久久精品导航| 一区二区三区高清不卡| 久久蜜桃香蕉精品一区二区三区| 色视频一区二区| 韩国精品主播一区二区在线观看 | 欧美一二三区在线| 成人黄页在线观看| 视频一区视频二区中文| 欧美国产激情一区二区三区蜜月| 色av一区二区| 高清不卡一区二区| 日韩成人精品在线| 亚洲精品一二三| 日本一区二区三区dvd视频在线| 在线亚洲免费视频| 国产成人av一区二区三区在线| 亚洲电影第三页| 2019国产精品| 一区二区三区四区国产精品| 91在线免费视频观看| 99久久精品国产观看| 亚洲视频在线一区二区| 久久综合九色欧美综合狠狠| 欧美精品久久一区二区三区| 99re热视频这里只精品| 国产精品亚洲视频| 日本一道高清亚洲日美韩| 伊人性伊人情综合网| 国产精品国产三级国产普通话99 | 丝瓜av网站精品一区二区| 中文字幕一区二区三区在线播放| 亚洲精品在线观看视频| 日韩精品一区二区三区在线观看 | 丝袜亚洲另类丝袜在线| 亚洲综合在线视频| 国产精品成人免费在线| 中文无字幕一区二区三区| 久久综合九色综合欧美98| 精品久久人人做人人爱| 精品国产露脸精彩对白 | 欧美一二三四区在线| 欧美精品1区2区3区| 欧美精品色一区二区三区| 一本一道久久a久久精品综合蜜臀| 成人午夜免费视频| 99久久精品情趣| 91免费在线播放| 在线一区二区三区四区五区| 在线看国产日韩| 337p亚洲精品色噜噜噜| 日韩网站在线看片你懂的| 日韩欧美久久久| 日韩免费福利电影在线观看| xfplay精品久久| 国产三级精品视频| 亚洲色图一区二区| 亚洲午夜电影在线| 琪琪一区二区三区| 国产精品羞羞答答xxdd| 色婷婷av一区二区三区软件| 成人一级片在线观看| 国产91精品免费| 91色在线porny| 欧美精品xxxxbbbb| 久久久久国产成人精品亚洲午夜| 国产区在线观看成人精品| 日韩一区在线看| 午夜精品免费在线| 国模套图日韩精品一区二区| thepron国产精品| 欧美在线免费播放| 2023国产精品| 中文字幕中文在线不卡住| 午夜精品一区二区三区三上悠亚| 久久成人免费电影| 成人美女视频在线观看18| 欧美在线不卡视频| 久久久天堂av| 亚洲一区欧美一区| 国产一区二区三区观看| 色综合天天天天做夜夜夜夜做| 欧美久久久久久蜜桃| 国产精品丝袜在线| 日本欧美一区二区在线观看| 粉嫩欧美一区二区三区高清影视| 在线观看欧美黄色| 久久久精品tv| 日韩在线一二三区| av欧美精品.com| 日韩一区二区三区免费观看| 亚洲精品中文在线观看| 国产曰批免费观看久久久| 欧美日韩视频在线观看一区二区三区 | av午夜一区麻豆| 欧美r级在线观看| 亚洲一区二区黄色| proumb性欧美在线观看| 欧美精品一区二区三区高清aⅴ| 一区二区在线观看视频| 国产河南妇女毛片精品久久久| 欧美日本乱大交xxxxx| 中文字幕一区二区在线观看 | 国产一区二区在线看| 欧美综合一区二区三区| 国产精品久久影院| 国产成人av福利| 日韩三级视频中文字幕| 玉米视频成人免费看| 成人性生交大合| 日韩亚洲电影在线| 亚洲丝袜制服诱惑| 国产69精品一区二区亚洲孕妇| 欧美一区二区网站| 水蜜桃久久夜色精品一区的特点 | 亚洲欧美日韩国产手机在线| 精品中文字幕一区二区小辣椒| 56国语精品自产拍在线观看| 日韩久久一区二区| 国产精品一区二区果冻传媒| 精品毛片乱码1区2区3区| 日韩高清国产一区在线| 在线观看日产精品| 亚洲一区二区三区激情| 一本到不卡精品视频在线观看| 久久精品一区八戒影视|