dosservices/dosserver/src/doseventmanagerbase.cpp
changeset 0 4e1aa6a622a0
equal deleted inserted replaced
-1:000000000000 0:4e1aa6a622a0
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *    Implementation for the CEventManagerBase class
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 #include <e32base.h>
       
    21 #include "doseventmanagerbase.h"
       
    22 #include "dosevent.h"
       
    23 #include "doswaitingevent.h"
       
    24 
       
    25 //
       
    26 // ---------------------------------------------------------
       
    27 // CDosEventManagerBase Constructor
       
    28 // ---------------------------------------------------------
       
    29 //  
       
    30 
       
    31 CEventManagerBase::CEventManagerBase() : iOrder(CDosEvent::Compare)
       
    32 {
       
    33 }
       
    34 
       
    35 //
       
    36 // ---------------------------------------------------------
       
    37 // CDosEventManagerBase Destructor
       
    38 // ---------------------------------------------------------
       
    39 //  
       
    40 
       
    41 CEventManagerBase::~CEventManagerBase()
       
    42 {
       
    43 	iEventArray.ResetAndDestroy();
       
    44 	iEventArray.Close();
       
    45 }
       
    46 
       
    47 //
       
    48 // ---------------------------------------------------------
       
    49 // CDosEventManagerBase::RaiseEvent 
       
    50 //
       
    51 // This version of the function is used by the derived
       
    52 // class.
       
    53 // ---------------------------------------------------------
       
    54 //  
       
    55 
       
    56 TInt CEventManagerBase::RaiseEvent(TUint aEvent,TAny* aParameter,TInt aParLength)
       
    57 {
       
    58 	CDosEvent* event=NULL;
       
    59 	TInt err=KErrNone;
       
    60 
       
    61 	LookForEventInArray(aEvent,event);
       
    62 	if(event)
       
    63 	{
       
    64 		//Create the waiting event
       
    65 
       
    66 		CDosWaitingEvent* waitingEvent = NULL;
       
    67 		waitingEvent = new CDosWaitingEvent;
       
    68 		if(waitingEvent)
       
    69 		{
       
    70 			TRAP(err,waitingEvent->SetParameterL(aParameter,aParLength));
       
    71 			if(!err)
       
    72 			{
       
    73 				event->InformListeners(waitingEvent);
       
    74 				if(!waitingEvent->IsQueued()) //If it hasn't been queued anywhere we delete it here.
       
    75 				{
       
    76 					delete waitingEvent;
       
    77 				}
       
    78 			}
       
    79 			else
       
    80 				{
       
    81 				delete waitingEvent;
       
    82 				}	
       
    83 			return err;
       
    84 		}
       
    85 		return KErrNoMemory;
       
    86 	}
       
    87 	//If the event is not in the array this call is ignored
       
    88 	return KErrNotFound;
       
    89 }
       
    90 
       
    91 //
       
    92 // ---------------------------------------------------------
       
    93 // CDosEventManagerBase::RaiseEvent
       
    94 //
       
    95 // This version is intended to be used by calls originated
       
    96 // by RDosEventSnd.
       
    97 // ---------------------------------------------------------
       
    98 //  
       
    99 
       
   100 TInt CEventManagerBase::RaiseEvent(const RMessage2& aMessage)
       
   101 {
       
   102 	CDosEvent* event=NULL;
       
   103 	TInt err=KErrNone;
       
   104 
       
   105 	LookForEventInArray((TInt32)aMessage.Ptr0(),event);
       
   106 	if(event)
       
   107 	{
       
   108 		//Create the waiting event
       
   109 
       
   110 		CDosWaitingEvent* waitingEvent = NULL;
       
   111 		waitingEvent = new CDosWaitingEvent;
       
   112 		if(waitingEvent)
       
   113 		{
       
   114 			TRAP(err,waitingEvent->SetParameterL(aMessage));
       
   115 			if(!err)
       
   116 			{
       
   117 				event->InformListeners(waitingEvent);
       
   118 				if(!waitingEvent->IsQueued()) //If it hasn't been queued anywhere we delete it here.
       
   119 				{
       
   120 					delete waitingEvent;
       
   121 				}
       
   122 			}
       
   123 			else
       
   124 				{
       
   125 				delete waitingEvent;
       
   126 				}
       
   127 			return err;
       
   128 		}
       
   129 		return KErrNoMemory;
       
   130 	}
       
   131 	//If the event is not in the array this call is ignored
       
   132 	return KErrNotFound;
       
   133 }
       
   134 
       
   135 //
       
   136 // ---------------------------------------------------------
       
   137 // CDosEventManagerBase::RegisterListenerL
       
   138 // ---------------------------------------------------------
       
   139 //  
       
   140 
       
   141 TInt CEventManagerBase::RegisterListenerL(CDosEventRcvService* aListener,TUint aEvent)
       
   142 {
       
   143 	//We look for the Event in the array.
       
   144 	CDosEvent* event=NULL;
       
   145 
       
   146 	LookForEventInArray(aEvent,event);
       
   147 	if(!event) 
       
   148 	{
       
   149 		//The Event didn't exist so we create it
       
   150 		event = CDosEvent::NewL(aEvent);
       
   151 
       
   152 		//We add it to iEventArray
       
   153 		iEventArray.InsertInOrder(event,iOrder);
       
   154 	}
       
   155 
       
   156 	//We add the listener to the Event's list
       
   157 	event->AddListener(aListener);
       
   158 
       
   159 	return KErrNone;
       
   160 }
       
   161 
       
   162 //
       
   163 // ---------------------------------------------------------
       
   164 // CDosEventManagerBase::LookForEventInArray
       
   165 // ---------------------------------------------------------
       
   166 //  
       
   167 
       
   168 void CEventManagerBase::LookForEventInArray(TUint aEventName,CDosEvent*& aEventPtr)
       
   169 {
       
   170 	for(TInt i=iEventArray.Count()-1;i>=0;i--) //it counts backwards for eficiency
       
   171 	{
       
   172 		if(iEventArray[i]->Event()==aEventName)
       
   173 		{
       
   174 			//Found
       
   175 			aEventPtr = iEventArray[i];
       
   176 			break;
       
   177 		}
       
   178 
       
   179 		if(iEventArray[i]->Event()<aEventName)
       
   180 		{
       
   181 			//Not found
       
   182 			aEventPtr = NULL;
       
   183 			break;
       
   184 		}
       
   185 	}
       
   186 }
       
   187 
       
   188 //
       
   189 // ---------------------------------------------------------
       
   190 // CDosEventManagerBase::UnRegisterListener
       
   191 // ---------------------------------------------------------
       
   192 //  
       
   193 
       
   194 TInt CEventManagerBase::UnRegisterListener(CDosEventRcvService* aListener, TUint aEvent)
       
   195 {
       
   196 	CDosEvent* event=NULL;
       
   197 
       
   198 	LookForEventInArray(aEvent,event);
       
   199 	if(!event)
       
   200 	{
       
   201 		//The event wasn't found on the Events array
       
   202 		return KErrNotFound;
       
   203 	}
       
   204 
       
   205 	//Remove the listener from the list
       
   206 	event->RemoveListener(aListener);
       
   207 
       
   208 	//Check if the event doesn't have anymore listeners.
       
   209 	if(event->ListenerCount()==0)
       
   210 	{
       
   211 		TInt index;
       
   212 		//No more Listeners. The event can be removed from the list
       
   213 		iEventArray.FindInOrder(event,index,iOrder);
       
   214 		iEventArray.Remove(index);
       
   215 		delete event;
       
   216 	}
       
   217 	return KErrNone;
       
   218 }
       
   219 
       
   220