locationtriggering/ltserver/ltserverlogic/src/lbttriggerfirehandler.cpp
changeset 0 667063e416a2
child 39 3efc7a0e8755
equal deleted inserted replaced
-1:000000000000 0:667063e416a2
       
     1 /*
       
     2 * Copyright (c) 2006,2007 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:  Implementation to fire triggers, both session and startup
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include <e32std.h>	// For RProcess
       
    21 #include <lbtstartuptrigger.h>
       
    22 #include <lbttriggerentry.h>
       
    23 #include <lbttriggerfilterbyattribute.h>
       
    24 #include "lbttriggerfirehandler.h"
       
    25 #include "lbtserverconsts.h"
       
    26 #include "lbtglobal.h"
       
    27 #include "lbtstartuptrigger.h"
       
    28 #include "lbtcontainer.h"
       
    29 #include "lbtcontainertriggerentry.h"
       
    30 #include "lbttriggerfiltercomposite.h"
       
    31 #include "lbtcontainerextendedtriggerinfo.h"
       
    32 #include "lbtnotificationmap.h"
       
    33 #include "lbtlogger.h"
       
    34 
       
    35 
       
    36 // ===================== MEMBER FUNCTIONS =====================
       
    37 
       
    38 // ---------------------------------------------------------------------------
       
    39 // CLbtTriggerFireHandler::NewL
       
    40 // Symbian Two - phase constructor
       
    41 // ---------------------------------------------------------------------------
       
    42 //
       
    43 CLbtTriggerFireHandler* CLbtTriggerFireHandler::NewL( CLbtNotificationMap& aNotificationMap,
       
    44 			    									  CLbtContainer& aContainer )
       
    45 	{
       
    46 	FUNC_ENTER("CLbtTriggerFireHandler::NewL");
       
    47 	CLbtTriggerFireHandler* self = new (ELeave) CLbtTriggerFireHandler(aNotificationMap,
       
    48 																	   aContainer);
       
    49 	CleanupStack::PushL(self);
       
    50 	self->ConstructL();
       
    51 	CleanupStack::Pop(); // self
       
    52 	return self;
       
    53 	}
       
    54 
       
    55 // ---------------------------------------------------------------------------
       
    56 // CLbtTriggerFireHandler::~CLbtTriggerFireHandler
       
    57 // Destructor
       
    58 // ---------------------------------------------------------------------------
       
    59 //
       
    60 CLbtTriggerFireHandler::~CLbtTriggerFireHandler()
       
    61 	{
       
    62 	FUNC_ENTER("CLbtTriggerFireHandler::~CLbtTriggerFireHandler");
       
    63 	Cancel();
       
    64 	iFireInfoArray.Reset();
       
    65 	iTriggerArray.ResetAndDestroy();
       
    66 	}
       
    67 
       
    68 // ---------------------------------------------------------------------------
       
    69 // CLbtTriggerFireHandler::CLbtTriggerFireHandler
       
    70 // C++ Default constructor
       
    71 // ---------------------------------------------------------------------------
       
    72 //
       
    73 CLbtTriggerFireHandler::CLbtTriggerFireHandler( CLbtNotificationMap& aNotificationMap,	    									    
       
    74 	    									    CLbtContainer& aContainer )
       
    75 	: CActive( EPriorityHigh ), iNotificationMap(aNotificationMap),iContainer(aContainer)
       
    76 	{
       
    77 	
       
    78 	}
       
    79 
       
    80 // ---------------------------------------------------------------------------
       
    81 // CLbtTriggerFireHandler::FireTriggerL
       
    82 // ---------------------------------------------------------------------------
       
    83 //
       
    84 void CLbtTriggerFireHandler::FireTriggerL(TLbtTriggerFireInfo aFireInfo)
       
    85 	{
       
    86 	FUNC_ENTER("CLbtTriggerFireHandler::FireTriggerL");
       
    87 	// queue the fire info into the array;
       
    88 	iFireInfoArray.Append(aFireInfo);
       
    89 	
       
    90 	if(!IsActive())
       
    91 		{
       
    92 		// Add this active object to the active scheduler
       
    93 		CActiveScheduler::Add(this);
       
    94 		
       
    95 		// Fire this trigger
       
    96 		FireNextTrigger();
       
    97 		}
       
    98 	}
       
    99 	
       
   100 // ---------------------------------------------------------------------------
       
   101 // CLbtTriggerFireHandler::ConstructL
       
   102 // ---------------------------------------------------------------------------
       
   103 //
       
   104 void CLbtTriggerFireHandler::ConstructL()
       
   105 	{
       
   106 
       
   107 	}
       
   108 
       
   109 // ---------------------------------------------------------------------------
       
   110 // CLbtTriggerFireHandler::RunL
       
   111 // ---------------------------------------------------------------------------
       
   112 //
       
   113 void CLbtTriggerFireHandler::RunL()
       
   114 	{
       
   115 	FUNC_ENTER("CLbtTriggerFireHandler::RunL");
       
   116 	// Got the response for List Triggers from container
       
   117 	if(iStatus.Int() == KErrNone)
       
   118 		{
       
   119         // Notify the client that this trigger is fired.
       
   120         NotifyTriggerFired();
       
   121         
       
   122     	// Start the client process if the trigger is an start up trigger
       
   123     	CLbtTriggerEntry* triggerEntry = iTriggerArray[0]->TriggerEntry();
       
   124 
       
   125     	// If the trigger is a startup trigger then start the trigger
       
   126     	// handling process
       
   127     	if(triggerEntry->Type() == CLbtTriggerEntry::ETypeStartup)
       
   128     		{
       
   129     		StartTriggerHandlingProcess(triggerEntry);
       
   130     		}
       
   131 		}
       
   132 	else
       
   133 	    {
       
   134         // Nothing to do in case the List Triggers returns error.
       
   135         // So we just log this error case.
       
   136         LBT_TRACE(KLbtLogError|KLbtLogServerLogic, __FILE__, __LINE__, "Error %d in List Triggers. Hence trigger %d not fired", iStatus.Int(),iFireInfoArray[0].iTriggerId);
       
   137 	    }
       
   138 
       
   139 	// Removed the fired trigger from the fire info queue
       
   140 	iFireInfoArray.Remove(0);
       
   141 	
       
   142 	// If there are any more trigger fire requests then fire the next trigger
       
   143 	if(iFireInfoArray.Count())
       
   144 		{
       
   145 		FireNextTrigger();
       
   146 		}
       
   147 	else
       
   148 		{
       
   149 		// No trigger to be fired, so remove this AO from the 
       
   150 		// active scheduler queue
       
   151 		Deque();
       
   152 		}
       
   153 	}
       
   154 
       
   155 // ---------------------------------------------------------------------------
       
   156 // CLbtTriggerFireHandler::RunError
       
   157 // ---------------------------------------------------------------------------
       
   158 //
       
   159 TInt CLbtTriggerFireHandler::RunError( TInt /*aError*/ )
       
   160     {
       
   161     return KErrNone;
       
   162     }
       
   163     
       
   164 // ---------------------------------------------------------------------------
       
   165 // CLbtTriggerFireHandler::FireNextTrigger
       
   166 // ---------------------------------------------------------------------------
       
   167 //
       
   168 void CLbtTriggerFireHandler::FireNextTrigger()
       
   169 	{
       
   170 	FUNC_ENTER("CLbtTriggerFireHandler::FireNextTrigger");
       
   171 	// Check if any trigger is in the process of being fired	
       
   172 	if(!IsActive())
       
   173 		{
       
   174 		// Clear the array before it can be used again
       
   175 		iTriggerArray.ResetAndDestroy();
       
   176 		
       
   177 		// Get the trigger entry from container
       
   178 		RArray<TLbtTriggerId> triggerId;
       
   179 		triggerId.Append( iFireInfoArray[0].iTriggerId );
       
   180 		iContainer.GetTriggers( triggerId, 
       
   181 								iTriggerArray, 
       
   182 								iAOIdentificationNum,
       
   183 								iStatus);
       
   184 		SetActive();
       
   185 		
       
   186 		triggerId.Close();		
       
   187 		}
       
   188 	}
       
   189 
       
   190 // ---------------------------------------------------------------------------
       
   191 // CLbtTriggerFireHandler::DoCancel
       
   192 // ---------------------------------------------------------------------------
       
   193 //
       
   194 void CLbtTriggerFireHandler::DoCancel()
       
   195 	{
       
   196 	FUNC_ENTER("CLbtTriggerFireHandler::DoCancel");
       
   197 	iContainer.CancelAsyncOperation(iAOIdentificationNum);
       
   198 	}
       
   199 
       
   200 // ---------------------------------------------------------------------------
       
   201 // CLbtTriggerFireHandler::NotifyTriggerFired
       
   202 // ---------------------------------------------------------------------------
       
   203 //
       
   204 void CLbtTriggerFireHandler::NotifyTriggerFired()
       
   205     {
       
   206     FUNC_ENTER("CLbtTriggerFireHandler::NotifyTriggerFired");
       
   207 	// Search the message array if the process has registered for 
       
   208 	// trigger fire notification
       
   209 	RMessage2 message;
       
   210 	CLbtContainerTriggerEntry* trigger = iTriggerArray[0];
       
   211 
       
   212     // Write the trigger fire info in the message
       
   213     TPckg<TLbtTriggerFireInfo> fireInfo(iFireInfoArray[0]);
       
   214 
       
   215 	while( !iNotificationMap.Retreive(message,trigger->ExtendedTriggerInfo()->OwnerSid(),
       
   216                        ELbtNotifyTriggerFired) )
       
   217 	    {
       
   218         TInt retVal = LbtGlobal::Write(message, KParamTriggerFireInfo, fireInfo);
       
   219         // Complete the message with the error code.
       
   220         LbtGlobal::RequestComplete(message, retVal);
       
   221 	    }
       
   222     }
       
   223 
       
   224 // ---------------------------------------------------------------------------
       
   225 // CLbtTriggerFireHandler::StartTriggerHandlingProcess
       
   226 // ---------------------------------------------------------------------------
       
   227 //
       
   228 void CLbtTriggerFireHandler::StartTriggerHandlingProcess(
       
   229     CLbtTriggerEntry* aTriggerEntry)
       
   230     {
       
   231     FUNC_ENTER("CLbtTriggerFireHandler::StartTriggerHandlingProcess");
       
   232 	CLbtStartupTrigger* startupTrigger = 
       
   233 	                        static_cast<CLbtStartupTrigger*>(aTriggerEntry);
       
   234     
       
   235 	TSecureId secureId;
       
   236 	TFileName fileName;
       
   237 	startupTrigger->GetProcessId(fileName, secureId);
       
   238 	
       
   239 	RProcess proc;
       
   240 	TInt retVal = proc.Create(fileName, startupTrigger->CommandLine());
       
   241 	if(retVal == KErrNone)
       
   242 		{
       
   243 		proc.Resume();
       
   244 		}
       
   245 	proc.Close();
       
   246 	}
       
   247 
       
   248 
       
   249 // end of file