vpnengine/eventmediator/src/eventmediator.cpp
branchRCL_3
changeset 44 735de8341ce4
parent 0 33413c0669b9
child 49 5960d2d03390
equal deleted inserted replaced
41:e06095241a65 44:735de8341ce4
    21  * @file eventmediator.cpp
    21  * @file eventmediator.cpp
    22  *
    22  *
    23  * This module contains eventmediator and the services of it.
    23  * This module contains eventmediator and the services of it.
    24  *
    24  *
    25  */
    25  */
    26 #include <es_sock.h>
       
    27 #include "eventmediator.h"
    26 #include "eventmediator.h"
       
    27 #include "eventmediatorsession.h"
       
    28 #include "eventmediatorclientservercommon.h"
    28 #include "eventlogger.h"
    29 #include "eventlogger.h"
    29 #include "eventmediatordefs.h"
       
    30 #include "sit.h"
    30 #include "sit.h"
    31 #include "log_em.h"
    31 #include "log_em.h"
       
    32 
    32 
    33 
    33 #define FIRST_ARGUMENT 0
    34 #define FIRST_ARGUMENT 0
    34 #define SECOND_ARGUMENT 1
    35 #define SECOND_ARGUMENT 1
    35 #define THIRD_ARGUMENT 2
    36 #define THIRD_ARGUMENT 2
    36 #define FOURTH_ARGUMENT 3
    37 #define FOURTH_ARGUMENT 3
    37 
    38 
       
    39 
    38 // ============================= CEventMediatorServer =============================
    40 // ============================= CEventMediatorServer =============================
    39 
    41 
    40 const TUint CEventMediatorServer::iRangeCount = 2;
    42 const TUint CEventMediatorServer::iRangeCount = 2;
    41     
    43     
    42 const TInt CEventMediatorServer::iRanges[iRangeCount] = 
    44 const TInt CEventMediatorServer::iRanges[iRangeCount] = 
    43     {
    45     {
    44     CEventMediatorSession::KEventMediatorListen,
    46     KEventMediatorListen,
    45     CEventMediatorSession::KEventMediatorClearEventLog+1
    47     KEventMediatorClearEventLog+1
    46     };
    48     };
    47 
    49 
    48 const TUint8 CEventMediatorServer::iElementIndex[iRangeCount] = 
    50 const TUint8 CEventMediatorServer::iElementIndex[iRangeCount] = 
    49     {
    51     {
    50     0,
    52     0,
    72     }
    74     }
    73 
    75 
    74 CEventMediatorServer* CEventMediatorServer::NewL()
    76 CEventMediatorServer* CEventMediatorServer::NewL()
    75     {
    77     {
    76     LOG(Log::Printf(_L("CEventMediatorServer::NewL - begin\n")));
    78     LOG(Log::Printf(_L("CEventMediatorServer::NewL - begin\n")));
    77     CEventMediatorServer* server = CEventMediatorServer::NewLC();
    79     
    78     CleanupStack::Pop(); // server
    80     CEventMediatorServer* self = CEventMediatorServer::NewLC();
       
    81     CleanupStack::Pop(self); // server
    79     LOG(Log::Printf(_L("CEventMediatorServer::NewL - end\n")));
    82     LOG(Log::Printf(_L("CEventMediatorServer::NewL - end\n")));
    80     return server;
    83     
       
    84     return self;
    81     }
    85     }
    82 
    86 
    83 CEventMediatorServer* CEventMediatorServer::NewLC()
    87 CEventMediatorServer* CEventMediatorServer::NewLC()
    84     {
    88     {
    85     LOG(Log::Printf(_L("CEventMediatorServer::NewLC - begin\n")));
    89     LOG(Log::Printf(_L("CEventMediatorServer::NewLC - begin\n")));
    86     CEventMediatorServer* server = new (ELeave) CEventMediatorServer();
    90     
    87     CleanupStack::PushL(server); 
    91     CEventMediatorServer* self = new (ELeave) CEventMediatorServer();
    88     server->ConstructL(server);
    92     CleanupStack::PushL(self); 
       
    93     self->ConstructL();
       
    94     
    89     LOG(Log::Printf(_L("CEventMediatorServer::NewLC - end\n")));
    95     LOG(Log::Printf(_L("CEventMediatorServer::NewLC - end\n")));
    90     return server;
    96     return self;
    91     }
    97     }
    92 
    98 
    93 void CEventMediatorServer::ConstructL(CEventMediatorServer* aServer)
    99 void CEventMediatorServer::ConstructL()
    94     {
   100     {
    95     RFs fs;
   101     RFs fs;
    96     User::LeaveIfError(fs.Connect());
   102     User::LeaveIfError(fs.Connect());
    97     CleanupClosePushL(fs);
   103     CleanupClosePushL(fs);
    98 
   104 
   103     iEventLogFileName.Copy(privateDir);
   109     iEventLogFileName.Copy(privateDir);
   104     iEventLogFileName.Append(KEventLogFile);
   110     iEventLogFileName.Append(KEventLogFile);
   105     
   111     
   106     CleanupStack::PopAndDestroy(); // fs
   112     CleanupStack::PopAndDestroy(); // fs
   107     
   113     
   108     aServer->iLogger = CEventLogger::NewL(this);
   114     iLogger = CEventLogger::NewL(this);
   109     iSit = new (ELeave) CSit(this);
   115     iSit = new (ELeave) CSit(this);
   110     StartL(KEventMediatorServer);
   116     StartL(KEventMediatorServer);
   111     }
   117     }
   112 
   118 
   113 CEventMediatorServer::~CEventMediatorServer(void)
   119 CEventMediatorServer::~CEventMediatorServer(void)
   126     delete iLogger;
   132     delete iLogger;
   127 
   133 
   128     delete iSit;
   134     delete iSit;
   129     }
   135     }
   130 
   136 
   131 // ----------------------------------------------------------------------------
       
   132 // CEventMediatorServer::StopEventMediator
       
   133 // Stops Event Mediator service if there are no sessions left.
       
   134 // ----------------------------------------------------------------------------
       
   135 //
       
   136 void CEventMediatorServer::StopEventMediator(void)
       
   137     {
       
   138     if (iSessionCount == 0) 
       
   139         {
       
   140         LOG(Log::Printf(_L("CEventMediatorServer::StopEventMediator - session count 0, stopping scheduler and thus the server\n")));
       
   141         CActiveScheduler::Stop();   
       
   142         }   
       
   143     }
       
   144 
   137 
   145 TInt CEventMediatorServer::RunError(TInt aError)
   138 TInt CEventMediatorServer::RunError(TInt aError)
   146     {
   139     {
   147     LOG(Log::Printf(_L("CEventMediatorServer::RunError - error = %d\n"), aError));
   140     LOG(Log::Printf(_L("CEventMediatorServer::RunError - error = %d\n"), aError));
   148     Message().Complete(aError);
   141     Message().Complete(aError);
   170     if (iShuttingDown)
   163     if (iShuttingDown)
   171         {
   164         {
   172         User::Leave(KErrServerTerminated);
   165         User::Leave(KErrServerTerminated);
   173         }
   166         }
   174     
   167     
   175     CSession2* session = CEventMediatorSession::NewL(CONST_CAST(CEventMediatorServer*, this), aMessage);
   168     
       
   169     CSession2* session = CEventMediatorSession::NewL(const_cast<CEventMediatorServer&>(*this), 
       
   170                                                      IsClientTheSitL(aMessage));
       
   171     iSessionCount++;
   176     return session;
   172     return session;
       
   173     }
       
   174 
       
   175 void CEventMediatorServer::SessionDeleted(TBool aIsSitSession)
       
   176     {
       
   177     TInt normalSessionCount = NormalSessionCount();
       
   178 
       
   179     // If this too is a normal session and is dying,
       
   180     // decrement the normal session count by one
       
   181     if (!aIsSitSession)
       
   182         {
       
   183         normalSessionCount--;        
       
   184         }
       
   185 
       
   186     if (normalSessionCount == 0)
       
   187         {
       
   188         // If "normal" (non-sit) sessions are no longer present,
       
   189         // we complete the task arrival observation request, thus
       
   190         // causing the SIT to terminate and close its connection
       
   191         // to this server. This should be the last connection whose
       
   192         // closing will cause this server to terminate.
       
   193         // NOTE. KErrCancel cannot be used here as the Event Mediator 
       
   194         // does not report it to the caller
       
   195         LOG(Log::Printf(_L("CEventMediatorServer::SessionDeleted - normal session count = 0\n")));
       
   196         CompleteListener(ETaskArrivedEvent, NULL, KErrAbort);
       
   197 
       
   198         // Set the server state to "shutting down". This will
       
   199         // cause the server to discard any new connect requests
       
   200         // with KErrServerTerminated.
       
   201         iShuttingDown = ETrue;
       
   202         }
       
   203 
       
   204     __ASSERT_DEBUG(iSessionCount > 0, User::Invariant());
       
   205     iSessionCount--;
       
   206     if (iSessionCount == 0) 
       
   207         {
       
   208         LOG(Log::Printf(_L("CEventMediatorServer::SessionDeleted - session count 0, stopping scheduler and thus the server\n")));
       
   209         CActiveScheduler::Stop();   
       
   210         }       
   177     }
   211     }
   178 
   212 
   179 void CEventMediatorServer::ReportEventL(const TEventType aType, TDesC8* aSpec,
   213 void CEventMediatorServer::ReportEventL(const TEventType aType, TDesC8* aSpec,
   180                                         TDesC8* aData, TInt aStatus)
   214                                         TDesC8* aData, TInt aStatus)
   181     {
   215     {
   202         TEventContainer* container = new (ELeave) TEventContainer(listenerCount, aData);
   236         TEventContainer* container = new (ELeave) TEventContainer(listenerCount, aData);
   203         CleanupStack::PushL(container);
   237         CleanupStack::PushL(container);
   204         iStoredEvents.AppendL(container);
   238         iStoredEvents.AppendL(container);
   205         CleanupStack::Pop();
   239         CleanupStack::Pop();
   206         }
   240         }
       
   241     
   207     // Write event to log
   242     // Write event to log
   208     if (aType == ELogEvent && iLogger)
   243     __ASSERT_DEBUG(iLogger != NULL, User::Invariant());
       
   244     
       
   245     if (aType == ELogEvent)
   209         {
   246         {
   210         LOG(Log::Printf(_L("CEventMediatorServer::ReportEventL - calling iLogger->LogEvent\n")));
   247         LOG(Log::Printf(_L("CEventMediatorServer::ReportEventL - calling iLogger->LogEvent\n")));
   211         iLogger->LogEvent(*aData);
   248         iLogger->LogEvent(*aData);
   212         }
   249         }
   213 
   250 
   255         delete iStoredEvents.At(aIndex);
   292         delete iStoredEvents.At(aIndex);
   256         iStoredEvents.Delete(aIndex);
   293         iStoredEvents.Delete(aIndex);
   257         }
   294         }
   258     }
   295     }
   259 
   296 
   260 TBool CEventMediatorServer::IsClientTheSitL(const RMessage2& aMessage)
   297 TBool CEventMediatorServer::IsClientTheSitL(const RMessage2& aMessage) const
   261     {
   298     {
   262     LOG(Log::Printf(_L("CEventMediatorServer::IsClientTheSitL\n")));
   299     LOG(Log::Printf(_L("CEventMediatorServer::IsClientTheSitL\n")));
   263     TBool isClientTheSit = EFalse;
   300     TBool isClientTheSit = EFalse;
   264     
   301     
   265     RThread clientThread;
   302     RThread clientThread;
   557         {
   594         {
   558         session->CompleteTaskRequests(aStatus);
   595         session->CompleteTaskRequests(aStatus);
   559         session = (CEventMediatorSession*) iSessionIter++;
   596         session = (CEventMediatorSession*) iSessionIter++;
   560         }
   597         }
   561     }
   598     }
   562 
       
   563 void CEventMediatorServer::SetShuttingDown(TBool aShuttingDown)
       
   564     {
       
   565     iShuttingDown = aShuttingDown;
       
   566     }
       
   567 
       
   568 // ============================= CEventMediatorSession =============================     
       
   569 
       
   570 CEventMediatorSession* CEventMediatorSession::NewL(CEventMediatorServer* aServer, const RMessage2& aMessage)
       
   571     {
       
   572     LOG(Log::Printf(_L("CEventMediatorSession::NewL - begin\n")));
       
   573     CEventMediatorSession* self;
       
   574     self = new (ELeave) CEventMediatorSession(aServer);
       
   575     CleanupStack::PushL(self);
       
   576 
       
   577     // Marks the session as a "SIT session"
       
   578     // if the client is the SIT thread
       
   579     self->iIsSitSession = aServer->IsClientTheSitL(aMessage);
       
   580 
       
   581     aServer->iSessionCount++;
       
   582 
       
   583     if ( !self->IsASitSession() )
       
   584         {
       
   585         User::LeaveIfError(self->iFs.Connect()); // For EventLog
       
   586         self->iEventLogFileOpen = EFalse;
       
   587         }
       
   588 
       
   589     CleanupStack::Pop(); // self
       
   590 
       
   591     LOG(Log::Printf(_L("CEventMediatorSession::NewL - end\n")));
       
   592     return self;
       
   593     }
       
   594 
       
   595 CEventMediatorSession::CEventMediatorSession(CEventMediatorServer* aServer)
       
   596     : iListenedEvents(2), iServer(aServer)
       
   597     {
       
   598     }
       
   599 
       
   600 CEventMediatorSession::~CEventMediatorSession(void)
       
   601     {
       
   602     LOG(Log::Printf(_L("CEventMediatorSession::~CEventMediatorSession\n")));
       
   603     CancelAll();
       
   604     if (iServer)
       
   605         {        
       
   606         TInt normalSessionCount = iServer->NormalSessionCount();
       
   607 
       
   608         // If this too is a normal session and is dying,
       
   609         // decrement the normal session count by one
       
   610         if (!IsASitSession())
       
   611             {
       
   612             normalSessionCount--;
       
   613             
       
   614             if (iEventLogFileOpen)
       
   615                 {
       
   616                 iEventLogFile.Close();
       
   617                 iEventLogFileOpen = EFalse;
       
   618                 }
       
   619             iFs.Close(); // For EventLog
       
   620             
       
   621             }
       
   622 
       
   623         if (normalSessionCount == 0)
       
   624             {
       
   625             // If "normal" (non-sit) sessions are no longer present,
       
   626             // we complete the task arrival observation request, thus
       
   627             // causing the SIT to terminate and close its connection
       
   628             // to this server. This should be the last connection whose
       
   629             // closing will cause this server to terminate.
       
   630             // NOTE. KErrCancel cannot be used here as the Event Mediator 
       
   631             // does not report it to the caller
       
   632             LOG(Log::Printf(_L("CEventMediatorSession::~CEventMediatorSession - normal session count = 0\n")));
       
   633             iServer->CompleteListener(ETaskArrivedEvent, NULL, KErrAbort);
       
   634 
       
   635             // Set the server state to "shutting down". This will
       
   636             // cause the server to discard any new connect requests
       
   637             // with KErrServerTerminated.
       
   638             iServer->SetShuttingDown(ETrue);
       
   639             }
       
   640 
       
   641         if (iServer->iSessionCount)
       
   642             {
       
   643             iServer->iSessionCount--;
       
   644             }
       
   645 
       
   646         iServer->StopEventMediator();
       
   647         }
       
   648     }
       
   649 
       
   650 void CEventMediatorSession::ServiceL(const RMessage2& aMessage)
       
   651     {
       
   652     TInt status = 0;
       
   653 
       
   654     switch (aMessage.Function())
       
   655         {
       
   656         case KEventMediatorListen:
       
   657             ListenToEventL(aMessage);
       
   658             break;
       
   659 
       
   660         case KEventMediatorListenWithSpec:
       
   661             ListenToEventWithSpecL(aMessage);
       
   662             break;
       
   663 
       
   664         case KEventMediatorCancel:
       
   665             CancelListening(aMessage);        
       
   666             aMessage.Complete(KErrNone);
       
   667             break;
       
   668 
       
   669         case KEventMediatorCancelWithSpec:
       
   670             CancelListeningWithSpecL(aMessage);        
       
   671             aMessage.Complete(KErrNone);
       
   672             break;
       
   673 
       
   674         case KEventMediatorCancelAll:
       
   675             CancelAll();        
       
   676             aMessage.Complete(KErrNone);
       
   677             break;
       
   678 
       
   679         case KEventMediatorReportEvent:
       
   680             ReportEventL(aMessage);
       
   681             aMessage.Complete(KErrNone);
       
   682             break;
       
   683 
       
   684         case KEventMediatorReportEventWithSpec:
       
   685             ReportEventWithSpecL(aMessage);
       
   686             aMessage.Complete(KErrNone);
       
   687             break;
       
   688 
       
   689         case KEventMediatorFetchData:
       
   690             status = FetchDataL(aMessage);
       
   691             aMessage.Complete(status);
       
   692             break;
       
   693 
       
   694         case KEventMediatorReportLogEvent:
       
   695             ReportLogEventL(aMessage);
       
   696             aMessage.Complete(KErrNone);
       
   697             break;
       
   698 
       
   699         case KEventMediatorNewEventSpecId:
       
   700             NewEventSpecIdL(aMessage);
       
   701             aMessage.Complete(KErrNone);
       
   702             break;
       
   703         case KEventMediatorDeletePrivateFiles:
       
   704             status = DeletePrivateFiles();
       
   705             aMessage.Complete(status);
       
   706             break;
       
   707 
       
   708         case KEventMediatorGetEventLogSize:
       
   709             status = GetEventLogSize(aMessage);
       
   710             aMessage.Complete(status);
       
   711             break;
       
   712 
       
   713         case KEventMediatorGetEventLogHeader:
       
   714             status = GetEventLogHeader(aMessage);
       
   715             aMessage.Complete(status);
       
   716             break;
       
   717         case KEventMediatorGetEventLogData:
       
   718             status = GetEventLogData(aMessage);
       
   719             aMessage.Complete(status);
       
   720             break;
       
   721         case KEventMediatorClearEventLog:
       
   722             status = ClearEventLog();
       
   723             aMessage.Complete(status);
       
   724             break;
       
   725         default:
       
   726             aMessage.Complete(KErrGeneral);
       
   727             break;
       
   728         }
       
   729     }
       
   730 
       
   731 TInt CEventMediatorSession::ListenToEventL(const RMessage2& aMessage)
       
   732     {
       
   733     CListenerContainer* listener = new (ELeave) CListenerContainer(aMessage, NULL, iServer);
       
   734     CleanupStack::PushL(listener);
       
   735 
       
   736     iListenedEvents.AppendL(listener);
       
   737     CleanupStack::Pop(); // listener
       
   738 
       
   739     listener->AnalyzeRequestL();
       
   740 
       
   741     return KErrNone;
       
   742     }
       
   743 
       
   744 TInt CEventMediatorSession::ListenToEventWithSpecL(const RMessage2& aMessage)
       
   745     {
       
   746     HBufC8* specBuf = NULL;
       
   747 
       
   748     // Read specification
       
   749     specBuf = ReadSpecificationFromClientL(aMessage);
       
   750     CleanupStack::PushL(specBuf);
       
   751 
       
   752     // Ownership of specBuf is given to listener
       
   753     CListenerContainer* listener = new (ELeave) CListenerContainer(aMessage, specBuf, iServer);
       
   754     CleanupStack::Pop(); // specBuf
       
   755     CleanupStack::PushL(listener);
       
   756         
       
   757     iListenedEvents.AppendL(listener);
       
   758     CleanupStack::Pop(); // listener
       
   759 
       
   760     listener->AnalyzeRequestL();
       
   761 
       
   762     return KErrNone;
       
   763     }
       
   764 
       
   765 void CEventMediatorSession::CancelListening(const RMessage2& aMessage)
       
   766     {
       
   767     TInt index;
       
   768     
       
   769     while (FindListenerMsg((TEventType)aMessage.Int0(), index))
       
   770         {
       
   771         CompleteListener(index, KErrCancel);
       
   772         }
       
   773     }
       
   774 
       
   775 void CEventMediatorSession::CancelListeningWithSpecL(const RMessage2& aMessage)
       
   776     {
       
   777     HBufC8* specBuf = NULL;
       
   778     TInt index;
       
   779     
       
   780     // Read specification
       
   781     specBuf = ReadSpecificationFromClientL(aMessage);
       
   782     CleanupStack::PushL(specBuf);
       
   783 
       
   784     // Cancel listeners
       
   785     while (FindListenerMsg((TEventType)aMessage.Int0(), specBuf, index))
       
   786         {
       
   787         CompleteListener(index, KErrCancel);
       
   788         }
       
   789     CleanupStack::PopAndDestroy(); // specBuf
       
   790     }
       
   791 
       
   792 void CEventMediatorSession::CancelAll()
       
   793     {
       
   794     TInt nEvents = iListenedEvents.Count();
       
   795     for (TInt i = 0; i < nEvents; i++)  
       
   796         {
       
   797         iListenedEvents.At(i)->Complete(KErrCancel);
       
   798         delete iListenedEvents.At(i);
       
   799         iListenedEvents.At(i) = NULL;
       
   800         }
       
   801     iListenedEvents.Reset();
       
   802     }
       
   803 
       
   804 void CEventMediatorSession::ReportEventL(const RMessage2& aMessage)
       
   805     {
       
   806     TEventType eventType = (TEventType)aMessage.Int0();
       
   807     LOG(Log::Printf(_L("CEventMediatorSession::ReportEventL - event type = %d\n"), eventType));
       
   808     // Read data
       
   809     HBufC8* dataBuf = ReadEventDataFromClientL(aMessage);
       
   810     CleanupStack::PushL(dataBuf);
       
   811     // Report event to server
       
   812     iServer->ReportEventL(eventType, NULL, dataBuf);
       
   813     CleanupStack::Pop();
       
   814     }
       
   815 
       
   816 void CEventMediatorSession::ReportEventWithSpecL(const RMessage2& aMessage)
       
   817     {
       
   818     TEventType eventType=(TEventType) aMessage.Int0();
       
   819     LOG(Log::Printf(_L("CEventMediatorSession::ReportEventWithSpecL - event type = %d\n"), eventType));
       
   820     // Read data
       
   821     HBufC8* dataBuf = ReadEventDataFromClientL(aMessage);
       
   822     CleanupStack::PushL(dataBuf);
       
   823     // Read specification
       
   824     HBufC8* specBuf = ReadSpecificationFromClientL(aMessage);
       
   825     CleanupStack::PushL(specBuf);
       
   826     // Report event to server
       
   827     iServer->ReportEventL(eventType, specBuf, dataBuf);
       
   828     CleanupStack::PopAndDestroy(); // specBuf
       
   829     CleanupStack::Pop(); // dataBuf 
       
   830     }
       
   831 
       
   832 void CEventMediatorSession::ReportLogEventL(const RMessage2& aMessage)
       
   833     {
       
   834     LOG(Log::Printf(_L("CEventMediatorSession::ReportLogEventL\n")));
       
   835     // Read event
       
   836     TLogEvent event;
       
   837     TPckg<TLogEvent> eventPckg(event);
       
   838     aMessage.ReadL(FIRST_ARGUMENT, eventPckg);
       
   839 
       
   840     // Create one buffer to contain put everything in a normal buffer and
       
   841     TInt lengthsDesLth = event.iDesCount * sizeof(TInt);
       
   842     TInt position = eventPckg.Length();
       
   843     TInt dataLength = position + lengthsDesLth + aMessage.Int2();
       
   844     HBufC8* dataBuf = HBufC8::NewLC(dataLength);
       
   845     TPtr8 dataPtr = dataBuf->Des();
       
   846 
       
   847     // Copy event to buffer
       
   848     dataPtr.Append(eventPckg);
       
   849     // Read lengths to buffer
       
   850     TPtr8 tmpPtr(&dataPtr[position], 0, dataLength - position);
       
   851     aMessage.ReadL(SECOND_ARGUMENT, tmpPtr);
       
   852     // Read descriptors to the buffer
       
   853     position= dataPtr.Length();
       
   854     tmpPtr.Set(&dataPtr[position], 0, dataLength - position);
       
   855     aMessage.ReadL(THIRD_ARGUMENT, tmpPtr);
       
   856 
       
   857     // Report event to server
       
   858     iServer->ReportEventL(ELogEvent, NULL, dataBuf);
       
   859     CleanupStack::Pop();
       
   860     }
       
   861 
       
   862 TInt CEventMediatorSession::FetchDataL(const RMessage2& aMessage)
       
   863     {
       
   864     LOG(Log::Printf(_L("CEventMediatorSession::FetchDataL\n")));
       
   865     return iServer->CopyEventDataL(aMessage);
       
   866     }
       
   867 
       
   868 TInt CEventMediatorSession::CheckEventL(const TEventType aType, const TDesC8* aSpec,
       
   869                                         const TDesC8* aData, TInt aStatus)
       
   870     {
       
   871     TInt index;
       
   872     TInt listenerCount = 0;
       
   873     TInt dataLth = 0;
       
   874     // Some events don't not have data
       
   875     if (aData)
       
   876         {
       
   877         dataLth = aData->Length();
       
   878         }
       
   879     TPckg<TInt> lengthpckg(dataLth);
       
   880     TPckgC<const TAny*> ptrpckg(aData);
       
   881 
       
   882     while (FindListenerMsg(aType, aSpec, index))
       
   883         {
       
   884         RMessage2& listener = iListenedEvents.At(index)->Message();
       
   885 
       
   886         if (aStatus == KErrNone)
       
   887             {
       
   888             // Write info about data
       
   889             listener.WriteL(SECOND_ARGUMENT, lengthpckg);
       
   890             listener.WriteL(THIRD_ARGUMENT, ptrpckg);
       
   891 
       
   892             // Complete listener
       
   893             listener.Complete(KErrNone);
       
   894             }
       
   895         else
       
   896             {
       
   897             listener.Complete(aStatus);
       
   898             }
       
   899         
       
   900         delete iListenedEvents.At(index);
       
   901         iListenedEvents.Delete(index);
       
   902         listenerCount++;    
       
   903         }
       
   904 
       
   905     return listenerCount;
       
   906     }
       
   907 
       
   908 TBool CEventMediatorSession::FindListenerMsg(const TEventType aType, TInt& index)
       
   909     {
       
   910     for (TInt i = 0; i < iListenedEvents.Count(); i++)
       
   911         {
       
   912         if (iListenedEvents.At(i)->Type() == aType)
       
   913             {
       
   914             index=i;
       
   915             return ETrue;
       
   916             }
       
   917         }
       
   918     return EFalse;
       
   919     }
       
   920 
       
   921 TBool CEventMediatorSession::FindListenerMsg(const TEventType aType, const TDesC8* aSpec, TInt& index)
       
   922     {
       
   923     for (TInt i = 0; i < iListenedEvents.Count(); i++)
       
   924         {
       
   925         if (iListenedEvents.At(i)->HandlesEvent(aType, aSpec))
       
   926             {
       
   927             index = i;
       
   928             return ETrue;
       
   929             }
       
   930         }
       
   931     return EFalse;
       
   932     }
       
   933 
       
   934 TBool CEventMediatorSession::FindTaskRequestListenerMsg(TInt& index)
       
   935     {
       
   936     for (TInt i = 0; i < iListenedEvents.Count(); i++)
       
   937         {
       
   938         if (CSit::EventRequiresSit(iListenedEvents.At(i)->Type()))
       
   939             {
       
   940             index = i;
       
   941             return ETrue;
       
   942             }
       
   943         }
       
   944     return EFalse;
       
   945     }
       
   946     
       
   947 HBufC8* CEventMediatorSession::ReadSpecificationFromClientL(const RMessage2& aMessage)
       
   948     {
       
   949     HBufC8* specBuf;
       
   950     // Read specification descriptor length from client, create specification buffer
       
   951     const TAny* desPtr = aMessage.Ptr3();
       
   952     if (desPtr == NULL)
       
   953         {
       
   954         return NULL;
       
   955         }
       
   956     TInt specLength = aMessage.GetDesLength(FOURTH_ARGUMENT);
       
   957     // Create spcification buffer
       
   958     specBuf = HBufC8::NewLC(specLength);
       
   959     TPtr8 ptr = specBuf->Des();
       
   960     // Read specification
       
   961     aMessage.ReadL(FOURTH_ARGUMENT, ptr);
       
   962     CleanupStack::Pop(); // specBuf
       
   963     return specBuf;
       
   964     }
       
   965 
       
   966 HBufC8* CEventMediatorSession::ReadEventDataFromClientL(const RMessage2& aMessage)
       
   967     {
       
   968     HBufC8* dataBuf = NULL;
       
   969     TInt desLength = aMessage.Int1();
       
   970     
       
   971     if (desLength != 0) // Some events have no data 
       
   972         {
       
   973         dataBuf = HBufC8::NewLC(desLength);
       
   974         TPtr8 ptr = dataBuf->Des();
       
   975         aMessage.ReadL(THIRD_ARGUMENT, ptr);
       
   976         CleanupStack::Pop(); // dataBuf
       
   977         }
       
   978     return dataBuf;
       
   979     }
       
   980 
       
   981 CListenerContainer* CEventMediatorSession::FindWaitingTaskRequest()
       
   982     {
       
   983     CListenerContainer* listener = NULL;
       
   984     
       
   985     for (TInt i = 0; i < iListenedEvents.Count(); i++)
       
   986         {
       
   987         if (iListenedEvents.At(i)->WaitingForFulfilling())
       
   988             {
       
   989             listener = iListenedEvents.At(i);
       
   990             break;
       
   991             }
       
   992         }
       
   993 
       
   994     return listener;
       
   995     }
       
   996 
       
   997 CListenerContainer* CEventMediatorSession::FindListener(TEventType aEventType,
       
   998                                                         TInt aEventSpecId)
       
   999     {
       
  1000     CListenerContainer* listener = NULL;
       
  1001     
       
  1002     for (TInt i = 0; i < iListenedEvents.Count(); i++)
       
  1003         {
       
  1004         if (iListenedEvents.At(i)->Type() == aEventType)
       
  1005             {
       
  1006             TEventSpec* eventSpec = (TEventSpec*)(iListenedEvents.At(i)->Specification()->Ptr());
       
  1007 
       
  1008             if (eventSpec->iId == aEventSpecId)
       
  1009                 {
       
  1010                 listener = iListenedEvents.At(i);
       
  1011                 break;
       
  1012                 }
       
  1013             }
       
  1014         }
       
  1015 
       
  1016     return listener;
       
  1017     }
       
  1018     
       
  1019 CListenerContainer* CEventMediatorSession::FindListener(TEventType aEventType,
       
  1020                                                         const TDesC8* aEventSpec)
       
  1021     {
       
  1022     CListenerContainer* listener = NULL;
       
  1023     
       
  1024     for (TInt i = 0; i < iListenedEvents.Count(); i++)
       
  1025         {
       
  1026         if (iListenedEvents.At(i)->HandlesEvent(aEventType, aEventSpec))
       
  1027             {
       
  1028             listener = iListenedEvents.At(i);
       
  1029             break;
       
  1030             }
       
  1031         }
       
  1032 
       
  1033     return listener;
       
  1034     }
       
  1035 
       
  1036 void CEventMediatorSession::CompleteListener(TEventType aEventType,
       
  1037                                              const TDesC8* aEventSpec,
       
  1038                                              TInt aStatus)
       
  1039     {
       
  1040     TInt index;
       
  1041     while (FindListenerMsg(aEventType, aEventSpec, index))
       
  1042         {
       
  1043         CompleteListener(index, aStatus);
       
  1044         }
       
  1045     }
       
  1046         
       
  1047 void CEventMediatorSession::CompleteListener(TInt aIndex, TInt aStatus)
       
  1048     {
       
  1049     iListenedEvents.At(aIndex)->Complete(aStatus);
       
  1050     delete iListenedEvents.At(aIndex);
       
  1051     iListenedEvents.Delete(aIndex);
       
  1052     }
       
  1053 
       
  1054 void CEventMediatorSession::CompleteTaskRequests(TInt aStatus)
       
  1055     {
       
  1056     LOG(Log::Printf(_L("CEventMediatorSession::CompleteTaskRequests\n")));
       
  1057     TInt index;
       
  1058     while (FindTaskRequestListenerMsg(index))
       
  1059         {
       
  1060         CompleteListener(index, aStatus);
       
  1061         }
       
  1062     }
       
  1063 
       
  1064 TBool CEventMediatorSession::IsASitSession()
       
  1065     {
       
  1066     return iIsSitSession;
       
  1067     }
       
  1068 
       
  1069 void CEventMediatorSession::NewEventSpecIdL(const RMessage2& aMessage)
       
  1070     {
       
  1071     TInt newEventSpecId = iServer->NewEventSpecId();
       
  1072     TPckg<TInt> newEventSpecIdDes(newEventSpecId);
       
  1073     aMessage.WriteL(FIRST_ARGUMENT, newEventSpecIdDes);
       
  1074     }
       
  1075 
       
  1076 TInt CEventMediatorSession::DeletePrivateFiles()
       
  1077     {
       
  1078     TRAPD(err, DeletePrivateFilesL());
       
  1079     if ( err )
       
  1080         {
       
  1081         LOG(Log::Printf(_L("DeletePrivateFilesL() leave error %d\n"), err));
       
  1082         return err;
       
  1083         }
       
  1084 
       
  1085     return KErrNone;
       
  1086     }
       
  1087 
       
  1088 void CEventMediatorSession::DeletePrivateFilesL()
       
  1089     {
       
  1090     LOG(Log::Printf(_L("DeletePrivateFilesL() called\n")));
       
  1091 
       
  1092     CFileMan* fileMan = CFileMan::NewL(iFs);
       
  1093     CleanupStack::PushL(fileMan);
       
  1094 
       
  1095     TPath privateDir;
       
  1096     User::LeaveIfError(iFs.PrivatePath(privateDir));
       
  1097 
       
  1098     TInt err = fileMan->RmDir(privateDir);
       
  1099     if (err != KErrNone && err != KErrPathNotFound && err != KErrNotFound)
       
  1100         {
       
  1101         User::Leave(err);
       
  1102         }
       
  1103     CleanupStack::PopAndDestroy(); //fileMan
       
  1104     }
       
  1105 
       
  1106 TInt CEventMediatorSession::GetEventLogSize(
       
  1107     const RMessage2& aMessage)
       
  1108     {
       
  1109     if ( iEventLogFileOpen )
       
  1110         {
       
  1111         iEventLogFile.Close();
       
  1112         iEventLogFileOpen = EFalse;
       
  1113         }
       
  1114 
       
  1115     TInt err = iEventLogFile.Open(iFs, iServer->EventLogFileName(), EFileRead | EFileShareAny);
       
  1116     if ( err )
       
  1117         return err;
       
  1118 
       
  1119     TInt size(0);
       
  1120     err = iEventLogFile.Size(size);
       
  1121     if ( err )
       
  1122         {
       
  1123         iEventLogFile.Close();
       
  1124         return err;
       
  1125         }
       
  1126     
       
  1127     TPckg<TInt> sizePckg(size);
       
  1128     err = aMessage.Write(FIRST_ARGUMENT, sizePckg);
       
  1129     if ( err )
       
  1130         {
       
  1131         iEventLogFile.Close();
       
  1132         return err;
       
  1133         }
       
  1134 
       
  1135     iEventLogFileOpen = ETrue;
       
  1136     
       
  1137     return KErrNone;
       
  1138     }
       
  1139 
       
  1140 TInt CEventMediatorSession::GetEventLogHeader(
       
  1141     const RMessage2& aMessage)
       
  1142     {
       
  1143     TInt err(0);
       
  1144     
       
  1145     if ( !iEventLogFileOpen )
       
  1146         {
       
  1147         err = iEventLogFile.Open(iFs, iServer->EventLogFileName(), EFileRead | EFileShareAny);
       
  1148         if ( err )
       
  1149             return err;
       
  1150         iEventLogFileOpen = ETrue;
       
  1151         }
       
  1152     
       
  1153     TInt position = 0;
       
  1154     err = iEventLogFile.Seek(ESeekStart, position);     
       
  1155     if (err != KErrNone)
       
  1156         return err;
       
  1157 
       
  1158     TBuf8<EVENTLOG_FILE_HEADER_LTH> fileHeaderBuf;
       
  1159     err = iEventLogFile.Read(fileHeaderBuf, EVENTLOG_FILE_HEADER_LTH);
       
  1160     if (err != KErrNone)
       
  1161         return err;
       
  1162 
       
  1163     TRAP(err, aMessage.WriteL(FIRST_ARGUMENT, fileHeaderBuf));
       
  1164     if ( err )
       
  1165         return err;
       
  1166 
       
  1167     return KErrNone;
       
  1168     }
       
  1169     
       
  1170 TInt CEventMediatorSession::GetEventLogData(
       
  1171     const RMessage2& aMessage)
       
  1172     {
       
  1173     TInt err(0);
       
  1174 
       
  1175     if ( !iEventLogFileOpen )
       
  1176         {
       
  1177         err = iEventLogFile.Open(iFs, iServer->EventLogFileName(), EFileRead | EFileShareAny);
       
  1178         if ( err )
       
  1179             return err;
       
  1180         iEventLogFileOpen = ETrue;
       
  1181         }
       
  1182     
       
  1183     TInt size(0);
       
  1184     err = iEventLogFile.Size(size);
       
  1185     if ( err )
       
  1186         return err;
       
  1187 
       
  1188     if ( size < EVENTLOG_FILE_HEADER_LTH )
       
  1189         return KErrNotFound;
       
  1190 
       
  1191     HBufC8* eventLogFileBuf = NULL;
       
  1192     TRAP(err, eventLogFileBuf = HBufC8::NewL(size));
       
  1193     if ( err )
       
  1194         {
       
  1195         return err;
       
  1196         }
       
  1197     
       
  1198     TPtr8 eventLogDataPtr(eventLogFileBuf->Des());
       
  1199     TInt position(0);
       
  1200     err = iEventLogFile.Seek(ESeekStart, position);
       
  1201     if ( err )
       
  1202         {
       
  1203         delete eventLogFileBuf;
       
  1204         return err;
       
  1205         }
       
  1206     err = iEventLogFile.Read(eventLogDataPtr); // iLogFileSize);
       
  1207     if ( err )
       
  1208         {
       
  1209         delete eventLogFileBuf;
       
  1210         return err;
       
  1211         }
       
  1212     
       
  1213     TRAP( err, aMessage.WriteL(FIRST_ARGUMENT, eventLogDataPtr));
       
  1214     if ( err )
       
  1215         {
       
  1216         delete eventLogFileBuf;
       
  1217         return err;
       
  1218         }
       
  1219 
       
  1220     delete eventLogFileBuf;
       
  1221     eventLogFileBuf = NULL;
       
  1222     
       
  1223     return KErrNone;
       
  1224     }
       
  1225     
       
  1226 TInt CEventMediatorSession::ClearEventLog()
       
  1227     {
       
  1228     if ( iEventLogFileOpen )
       
  1229         {
       
  1230         iEventLogFile.Close();
       
  1231         iEventLogFileOpen = EFalse;
       
  1232         }
       
  1233 
       
  1234     TInt err = iFs.Delete(iServer->EventLogFileName());
       
  1235 
       
  1236     return err;
       
  1237     }
       
  1238 
       
  1239 
       
  1240     
   599     
  1241 // ============================= CEventMediatorServer =============================    
   600 // ============================= CEventMediatorServer =============================    
  1242 
   601 
  1243 CListenerContainer::CListenerContainer(const RMessage2& aMessage, TDesC8* aSpec,
   602 CListenerContainer::CListenerContainer(const RMessage2& aMessage, TDesC8* aSpec,
  1244                                        CEventMediatorServer* aServer)
   603                                        CEventMediatorServer& aServer)
  1245     : iSpec(aSpec), iMessage(aMessage), iServer(aServer)
   604     : iSpec(aSpec), iMessage(aMessage), iServer(aServer)
  1246     {
   605     {
  1247     iEventType = Type();
   606     iEventType = Type();
  1248     }
   607     }
  1249 
   608 
  1251     {
   610     {
  1252     LOG(Log::Printf(_L("CListenerContainer::AnalyzeRequestL\n")));
   611     LOG(Log::Printf(_L("CListenerContainer::AnalyzeRequestL\n")));
  1253     if (CSit::EventRequiresSit(iEventType))
   612     if (CSit::EventRequiresSit(iEventType))
  1254         {
   613         {
  1255         LOG(Log::Printf(_L("CListenerContainer::AnalyzeRequestL - event type = %d, requires SIT\n"), iEventType));
   614         LOG(Log::Printf(_L("CListenerContainer::AnalyzeRequestL - event type = %d, requires SIT\n"), iEventType));
  1256         iServer->MakeSureSitIsRunningL();
   615         iServer.MakeSureSitIsRunningL();
  1257         iServer->TaskRequestArrivedL(this);
   616         iServer.TaskRequestArrivedL(this);
  1258         }
   617         }
  1259 
   618 
  1260     // If this event listening request is the one
   619     // If this event listening request is the one
  1261     // made by the SIT task arrival observer...
   620     // made by the SIT task arrival observer...
  1262     if (iEventType == ETaskArrivedEvent)
   621     if (iEventType == ETaskArrivedEvent)
  1263         {
   622         {
  1264         iServer->SetTaskArrivalListenerL(this);
   623         iServer.SetTaskArrivalListenerL(this);
  1265         iServer->TaskArrivalObservationRequestArrivedL();
   624         iServer.TaskArrivalObservationRequestArrivedL();
  1266         }
   625         }
  1267 
   626 
  1268     // If this event listening request is one
   627     // If this event listening request is one
  1269     // made by a SIT TH to fetch a task...
   628     // made by a SIT TH to fetch a task...
  1270     if (iEventType == EFetchTaskInfoEvent)
   629     if (iEventType == EFetchTaskInfoEvent)
  1271         {
   630         {
  1272         iServer->TaskRequestEventSpecFetchingRequestArrivedL(this);
   631         iServer.TaskRequestEventSpecFetchingRequestArrivedL(this);
  1273         }
   632         }
  1274 
   633 
  1275     // If the event listening request is one
   634     // If the event listening request is one
  1276     // made by a SIT TH to listen to the cancellation
   635     // made by a SIT TH to listen to the cancellation
  1277     // of the task request it is handling
   636     // of the task request it is handling
  1278     if (CSit::IsTaskCancellationObservationRequest(iEventType))
   637     if (CSit::IsTaskCancellationObservationRequest(iEventType))
  1279         {
   638         {
  1280         iServer->TaskCancellationObservationRequestArrivedL(this);
   639         iServer.TaskCancellationObservationRequestArrivedL(this);
  1281         }
   640         }
  1282     }
   641     }
  1283     
   642     
  1284 CListenerContainer::~CListenerContainer()
   643 CListenerContainer::~CListenerContainer()
  1285     {
   644     {
  1286     delete iSpec;
   645     delete iSpec;
  1287 
   646 
  1288     if (iServer->TaskArrivalListener() == this)
   647     if (iServer.TaskArrivalListener() == this)
  1289         {
   648         {
  1290         iServer->ClearTaskArrivalListener();
   649         iServer.ClearTaskArrivalListener();
  1291         }
   650         }
  1292     }
   651     }
  1293 
   652 
  1294 TBool CListenerContainer::HandlesEvent(TEventType aEventType, const TDesC8* aEventSpec)
   653 TBool CListenerContainer::HandlesEvent(TEventType aEventType, const TDesC8* aEventSpec)
  1295     {
   654     {
  1322         
   681         
  1323         if (cancelEventType != EUnfoundEvent)
   682         if (cancelEventType != EUnfoundEvent)
  1324             {
   683             {
  1325             // Complete the task request cancellation
   684             // Complete the task request cancellation
  1326             // observation, if found
   685             // observation, if found
  1327             iServer->CompleteListener(cancelEventType, iSpec, KErrNone);
   686             iServer.CompleteListener(cancelEventType, iSpec, KErrNone);
  1328             }
   687             }
  1329         }
   688         }
  1330     
   689     
  1331     iMessage.Complete(status);
   690     iMessage.Complete(status);
  1332     }
   691     }