⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clientimpleventmanager.cpp

📁 270的linux说明
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		EnterCriticalSection(&m_cs);	try	{		MapObserversOnSameEvent::iterator it = m_mapObserversOnSameEvent.find(hEvent);		if(it != m_mapObserversOnSameEvent.end())		{			CObserversOnSameEvent *pObserversOnSameEvent = (*it).second;			bRtn = pObserversOnSameEvent->SetTheEvent(pTheEvent);		}		else		{			//			// No hHandle exists			bRtn = false;		}	}	catch(...)	{		LeaveCriticalSection(&m_cs);		bRtn = false;  		IntelMobileException ex( IntelMobileText("Operation Error"), IntelMobileText("CClientImplEventManager"), IntelMobileText("UpdateEventOfHandle") );        throw( ex ); 	}	LeaveCriticalSection(&m_cs);    return bRtn;}//add ObserverImpl *pObserver to Observe on CEventBind & eb//return false if try to monitor more than 63 eventsbool CClientImplEventManager::AddObserver(CEventBind & eb,ObserverImpl *pObserver){	bool bRtn = true;	HANDLE hEvent = eb.GetHandle();	Event *pTheEvent = eb.GetTheEvent();	EnterCriticalSection(&m_cs);	try	{		MapObserversOnSameEvent::iterator it = m_mapObserversOnSameEvent.find(hEvent);		if(it != m_mapObserversOnSameEvent.end())		{			//the event handle exist,add the observer to its observer_list			(*it).second->AddObserver(pObserver);		}		else		{			//the event handle not exist			//create a new CObserversOnSameEvent,add the observer to its observer_list, 			CObserversOnSameEvent *pObserversOnSameEvent = new CObserversOnSameEvent(*pTheEvent);			m_mapObserversOnSameEvent.insert(it, 				pair<HANDLE, CObserversOnSameEvent * >(hEvent, pObserversOnSameEvent));			pObserversOnSameEvent->AddObserver(pObserver);			//Set add flag and set special event to notify monitoring thread//			m_nThreadCtrlFlag = nADD_EVENT_FOR_MONITOR;							//event handle is added / removed only by main thread			bRtn = (bool)AddEvent2Monitor(hEvent);//return false if try to monitor more than 63 events//cout<<"bfsh1\n";			if(bRtn)			{//cout<<"brtn1"<<bRtn<<endl;				//only when add event successed, need to notify monitor thread				SetEvent(m_hCtrlEvent);			}//cout<<"brtn2"<<bRtn<<endl;		}	}	catch(...)	{		LeaveCriticalSection(&m_cs);		bRtn = false;  		IntelMobileException ex( IntelMobileText("Operation Error"), IntelMobileText("CClientImplEventManager"), IntelMobileText("AddObserver") );        throw( ex ); 	}	LeaveCriticalSection(&m_cs);    return bRtn;}/*fix scr255:Previously happen event is recieved when register an event.tan li2004-10-18add parameter bRemoveEvent: return bRemoveEvent to indicate whether the observer_list for this event handle is empty and if so remove the event handle so that the server layer won't check this event again*/bool CClientImplEventManager::RemoveObserver(HANDLE hEvent, ObserverImpl *pObserver, BOOL &bRemoveEvent){		bool bRtn = true;	bRemoveEvent = FALSE;			EnterCriticalSection(&m_cs);	try	{		MapObserversOnSameEvent::iterator it = m_mapObserversOnSameEvent.find(hEvent);		if(it != m_mapObserversOnSameEvent.end())		{			//the event handle exist,remove the observer from its observer_list			CObserversOnSameEvent *pObserversOnSameEvent = (*it).second;			pObserversOnSameEvent->RemoveObserver(pObserver);			if(0 == pObserversOnSameEvent->GetObservCount())			{				//the observer_list is empty				//Set delete flag and set special event to notify monitoring thread				bRemoveEvent = TRUE;				m_mapObserversOnSameEvent.erase(it);				delete pObserversOnSameEvent;//				m_nThreadCtrlFlag = nDELETE_EVENT_FROM_MONITOR;				//event handle is added / removed only by main thread				DeleteEventFromMonitor(hEvent);				SetEvent(m_hCtrlEvent);			}		}	}	catch(...)	{		LeaveCriticalSection(&m_cs);		bRtn = false;  		IntelMobileException ex( IntelMobileText("Operation Error"), IntelMobileText("CClientImplEventManager"), IntelMobileText("RemoveObserver") );        throw( ex ); 	}	LeaveCriticalSection(&m_cs);    return bRtn;}DWORD CClientImplEventManager::WaitForEvents(){	return WaitForMultipleObjects(m_nEventCount, m_arrayEventHandle, FALSE, INFINITE);}/*DWORD WINAPI NotifyThreadProc(LPVOID lpParam){	CObserversOnSameEvent *pObserversOnSameEvent = (CObserversOnSameEvent *)lpParam;	pObserversOnSameEvent->NotifyAllObservers();	return 0;}*///notify all observers on this Underlaying eventbool CClientImplEventManager::OnUnderlayingEvent(int nEventIndex){	bool bRtn = true;			EnterCriticalSection(&m_cs);	try	{			HANDLE hEvent = m_arrayEventHandle[nEventIndex];				MapObserversOnSameEvent::iterator it = m_mapObserversOnSameEvent.find(hEvent);		if(it != m_mapObserversOnSameEvent.end())		{						CObserversOnSameEvent *pObserversOnSameEvent = (*it).second;/*			HANDLE hThread = CreateThread(NULL, 0, NotifyThreadProc, (void*)pObserversOnSameEvent, 0, 0);			if(hThread != NULL)						CloseHandle(hThread);*/			pObserversOnSameEvent->NotifyAllObservers();		}	}	catch(...)	{		LeaveCriticalSection(&m_cs);		bRtn = false;  		IntelMobileException ex( IntelMobileText("Operation Error"), IntelMobileText("CClientImplEventManager"), IntelMobileText("OnUnderlayingEvent") );        throw( ex ); 	}	LeaveCriticalSection(&m_cs);    return bRtn;}//to remove an event From Monitorvoid CClientImplEventManager::DeleteEventFromMonitor(HANDLE hEvent){	EnterCriticalSection(&m_cs);	for(int i = 0; i < m_nEventCount; i++)	{		if(hEvent == m_arrayEventHandle[i])		{			for(int j = i; j < m_nEventCount - 1; j++)				m_arrayEventHandle[j] = m_arrayEventHandle[j + 1];			m_arrayEventHandle[--m_nEventCount] = 0;			break;		}	}	LeaveCriticalSection(&m_cs);}//given [(ServerObject *) + Event::EventType], find respondent (CEventBind *),//if not exist, create it//EventClientImpl * is not persistent while the underlying ServerObject * isCEventBind *CClientImplEventManager::GetEventBind(EventClientImpl *pEvtCltImp, 												  Event::EventType eType, BOOL bCreateNoneExist/* = TRUE*/){	CEventBind *pEb = NULL;	EnterCriticalSection(&m_cs);	try	{		pEb = m_CltEventMapMgr.GetEventBind(pEvtCltImp, eType, bCreateNoneExist);	}	catch(...)	{		LeaveCriticalSection(&m_cs);		IntelMobileException ex( IntelMobileText("Operation Error"), IntelMobileText("CClientImplEventManager"), IntelMobileText("GetEventBind") );        throw( ex ); 	}	LeaveCriticalSection(&m_cs);	return pEb;}void CClientImplEventManager::RemoveEventBind(EventClientImpl *pEvtCltImp, Event::EventType eType){	EnterCriticalSection(&m_cs);	try	{		m_CltEventMapMgr.RemoveEventBind(pEvtCltImp, eType);	}	catch(...)	{		LeaveCriticalSection(&m_cs);		IntelMobileException ex( IntelMobileText("Operation Error"), IntelMobileText("CClientImplEventManager"), IntelMobileText("RemoveEventBind") );        throw( ex ); 	}	LeaveCriticalSection(&m_cs);}bool CClientImplEventManager::HasAddedObserver(void *pSvrObj, Event::EventType eType){	bool bRtn = false;	EnterCriticalSection(&m_cs);	try	{		bRtn = m_CltEventMapMgr.HasAddedObserver(pSvrObj, eType);	}	catch(...)	{		LeaveCriticalSection(&m_cs);		IntelMobileException ex( IntelMobileText("Operation Error"), IntelMobileText("CClientImplEventManager"), IntelMobileText("HasAddedObserver") );        throw( ex ); 	}	LeaveCriticalSection(&m_cs);	return bRtn;}CClientImplEventManager & CClientImplEventManager::GetClientImplEventManagerInst(){	return s_ClientImplEventManagerInst;}//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CEventBind::CEventBind(EventClientImpl *pCltImpl, Event::EventType eType){	m_hEvent = CreateEvent (NULL,  // No security attributes                               FALSE,  // Manual-reset event                               FALSE,  // Initial state is signaled                               NULL);	m_pTheEvent = pCltImpl->CreateClassEvent(eType);}CEventBind::~CEventBind(){	delete m_pTheEvent;	m_pTheEvent = NULL;	CloseHandle(m_hEvent);}bool   CEventBind::SetTheEvent(Event & event){	try	{		m_pTheEvent->SetObjectType(event.GetObjectType());		m_pTheEvent->SetObjectKey(event.GetObjectKey());		m_pTheEvent->SetClassType(event.GetClassType());		m_pTheEvent->SetParentKey(event.GetParentKey());	}	catch (...)	{		return false;	}	return true;}Event* CEventBind::GetTheEvent(){	return m_pTheEvent;}HANDLE CEventBind::GetHandle(){	return m_hEvent;}//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CObserversOnSameEvent::CObserversOnSameEvent(Event &theEvent)	: m_theEvent(theEvent){	InitializeCriticalSection(&m_csProtectList);}CObserversOnSameEvent::~CObserversOnSameEvent(){	DeleteCriticalSection(&m_csProtectList);}void CObserversOnSameEvent::AddObserver(ObserverImpl *pObserver){	EnterCriticalSection(&m_csProtectList);	m_lstObservers.push_back(pObserver);	LeaveCriticalSection(&m_csProtectList);}void CObserversOnSameEvent::RemoveObserver(ObserverImpl *pObserver, 										   BOOL bOnce /*= TRUE*/){	EnterCriticalSection(&m_csProtectList);	if(bOnce)	{		//for(ListObservers::iterator itr = m_lstObservers.begin(); itr != m_lstObservers.end(); itr++)		ListObservers::iterator itr = find(m_lstObservers.begin(), m_lstObservers.end(), pObserver);		if(itr != m_lstObservers.end())			m_lstObservers.erase(itr);	}	else		m_lstObservers.remove(pObserver);	LeaveCriticalSection(&m_csProtectList);}void CObserversOnSameEvent::RemoveObservers(){	EnterCriticalSection(&m_csProtectList);	m_lstObservers.clear();	LeaveCriticalSection(&m_csProtectList);}int CObserversOnSameEvent::GetObservCount(){	int nCnt = 0;	EnterCriticalSection(&m_csProtectList);	nCnt = m_lstObservers.size();	LeaveCriticalSection(&m_csProtectList);	return nCnt;}const ObserverImpl* CObserversOnSameEvent::GetObserver(unsigned int nIndex){	unsigned int iCount;	EnterCriticalSection(&m_csProtectList);	ListObservers::iterator it;	for(it = m_lstObservers.begin(),iCount=0; it != m_lstObservers.end(), iCount<nIndex; it++, iCount++) ;		if (it!=m_lstObservers.end())	{		LeaveCriticalSection(&m_csProtectList);		return *it;	}	LeaveCriticalSection(&m_csProtectList);	return NULL;	}bool   CObserversOnSameEvent::SetTheEvent(Event & event){	try	{		m_theEvent.SetObjectType(event.GetObjectType());		m_theEvent.SetObjectKey(event.GetObjectKey());		m_theEvent.SetClassType(event.GetClassType());		m_theEvent.SetParentKey(event.GetParentKey());	}	catch (...)	{		return false;	}	return true;}bool CObserversOnSameEvent::NotifyAllObservers(){	bool bRtn = true;	EnterCriticalSection(&m_csProtectList);			try	{	//	SYSTEMTIME st;	//	GetLocalTime(&st);		time_t t = ::time(NULL);		/*fix SCR #314 SYSTEMTIME range: from year 1601 to year 30827 (on Windows Server 2003, Windows XP)time_t range: from midnight, January 1, 1970 to Tue Jan 19 03:14:07 2038, sub-set of SYSTEMTIME rangeif the input SYSTEMTIME or FILETIME is out of the range of time_t, FileTime2UnixTime and SystemTime2UnixTime return FALSE*/	/*	 if(!CTimeHelper::SystemTime2UnixTime(&st, &t))			bRtn = false;		else	*/	{			m_theEvent.SetTimestamp( t );			ListObservers::iterator it;			for(it = m_lstObservers.begin(); it != m_lstObservers.end(); it++)			{					(*it)->Notify(m_theEvent);						}		}	}	catch(...)	{		LeaveCriticalSection(&m_csProtectList);		bRtn = false;  		return bRtn;		//IntelMobileException ex( IntelMobileText("Operation Error"), IntelMobileText("CObserversOnSameEvent"), IntelMobileText("NotifyAllObservers") );        //throw( ex ); 	}	LeaveCriticalSection(&m_csProtectList);	return bRtn;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -