diff -r 000000000000 -r 094583676ce7 IMPSengine/impswatcher/Src/ImpsPushHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IMPSengine/impswatcher/Src/ImpsPushHandler.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,309 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: ECOM plugin .dll for handling IMPS related WAP push messages. +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include "ImpsPushHandler.h" + +// CONSTANTS + +_LIT8( KWVID, "WVCI*" ); + +// ECOM framework related +const TImplementationProxy ImplementationTable[] = + { +#ifdef __EABI__ + IMPLEMENTATION_PROXY_ENTRY(0x101F4696, CImpsPushHandler::NewL) +#else + {{0x101F4696}, CImpsPushHandler::NewL} +#endif + }; + +// ============================= LOCAL FUNCTIONS =============================== +#ifdef _IMPS_LOGGING_ON_ +const TInt KLogBufferLength = 256; +_LIT(KLogDir, "impswatcher"); +_LIT(KLogFile, "impspushhandlerplugin.txt"); + +void CWatcherLogger::Log(TRefByValue aFmt,...) + { + VA_LIST list; + VA_START(list, aFmt); + + // Print to log file + TBuf buf; + buf.FormatList(aFmt, list); + + // Write to log file + RFileLogger::Write(KLogDir, KLogFile, EFileLoggingModeAppend, buf); + } +#endif + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CImpsPushHandler::New +// 1st phase constructor +// Returns: : +// ----------------------------------------------------------------------------- +// +CImpsPushHandler* CImpsPushHandler::NewL( ) + { +#ifdef _IMPS_LOGGING_ON_ + CWatcherLogger::Log( KNewL ); +#endif + CImpsPushHandler* self = new( ELeave ) CImpsPushHandler( ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CImpsPushHandler::CImpsPushHandler +// ----------------------------------------------------------------------------- +// +CImpsPushHandler::CImpsPushHandler( ) + :CPushHandlerBase() + { + } + +// ----------------------------------------------------------------------------- +// CImpsPushHandler::ConstructL +// Adds the AO to the Active Scheduler. +// ----------------------------------------------------------------------------- +// +void CImpsPushHandler::ConstructL( ) + { + // Add plugin to AS +#ifndef _DOUNITTEST + CActiveScheduler::Add( this ); +#endif + } + +// ----------------------------------------------------------------------------- +// CImpsPushHandler::~CImpsPushHandler +// ----------------------------------------------------------------------------- +// +CImpsPushHandler::~CImpsPushHandler( ) + { +#ifdef _IMPS_LOGGING_ON_ + CWatcherLogger::Log( KDestructor ); +#endif + + // AO's destructor always calls Cancel() + Cancel( ); + + delete iPushMsg; + + } + +// ----------------------------------------------------------------------------- +// CImpsPushHandler::HandleMessageL +// Starts the message handling procedure asynchronously. +// This is not used in CL messages +// ----------------------------------------------------------------------------- +// +void CImpsPushHandler::HandleMessageL( + CPushMessage* aPushMsg, + TRequestStatus& aStatus ) + { +#ifdef _IMPS_LOGGING_ON_ + CWatcherLogger::Log( KHandleMessageAsync ); +#endif + + // We take ownership of this object and delete it ourself + iPushMsg = aPushMsg; + SetConfirmationStatus( aStatus ); + SignalConfirmationStatus( KErrNotSupported ); + iPluginKiller->KillPushPlugin( ); + } + +// ----------------------------------------------------------------------------- +// CImpsPushHandler::HandleMessageL +// Synchronous version of the HandleMessageL(). See asynchronous version's +// description. +// ----------------------------------------------------------------------------- +// +void CImpsPushHandler::HandleMessageL( CPushMessage* aPushMsg ) + { +#ifdef _IMPS_LOGGING_ON_ + CWatcherLogger::Log( KHandleMessageSync ); +#endif + + // We take ownership of this object and delete it ourself + iPushMsg = aPushMsg; + + // Do sanity checks + if( PerformCheck( ) == KErrNone ) + { + TransferMessage( ); + } + + // Finish up + iPluginKiller->KillPushPlugin( ); + } + +// ----------------------------------------------------------------------------- +// CImpsPushHandler::CancelHandleMessage +// Cancels the pending asynchronous HandleMessageL. +// This is not used in CL messages +// ----------------------------------------------------------------------------- +// +void CImpsPushHandler::CancelHandleMessage( ) + { +#ifdef _IMPS_LOGGING_ON_ + CWatcherLogger::Log( KCancelHandleMessage ); +#endif + Cancel( ); + } + +// ----------------------------------------------------------------------------- +// CImpsPushHandler::DoCancel +// Cancels the operation. +// This is not used in CL messages +// ----------------------------------------------------------------------------- +// +void CImpsPushHandler::DoCancel( ) + { +#ifdef _IMPS_LOGGING_ON_ + CWatcherLogger::Log( KDoCancel ); +#endif + } + +// ----------------------------------------------------------------------------- +// CImpsPushHandler::RunL +// Basically all the work is done from/through this method. +// This is not used in CL messages +// ----------------------------------------------------------------------------- +// +void CImpsPushHandler::RunL( ) + { +#ifdef _IMPS_LOGGING_ON_ + CWatcherLogger::Log( KRun ); +#endif + + } + +// ----------------------------------------------------------------------------- +// CImpsPushHandler::RunError +// Called by ActiveScheduler in case RunL leaves. Currently does nothing. +// Returns: : +// This is not used in CL messages +// ----------------------------------------------------------------------------- +// +TInt CImpsPushHandler::RunError(TInt /*aError*/) + { +#ifdef _IMPS_LOGGING_ON_ + CWatcherLogger::Log( KRunError ); +#endif + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CImpsPushHandler::CPushHandlerBase_Reserved1 +// Reserved for future expansion. +// ----------------------------------------------------------------------------- +// +void CImpsPushHandler::CPushHandlerBase_Reserved1( ) + { +#ifndef _DOUNITTEST + User::Panic( KNotSupported, KErrNotSupported ); +#endif + } + +// ----------------------------------------------------------------------------- +// CImpsPushHandler::CPushHandlerBase_Reserved2 +// Reserved for future expansion. +// ----------------------------------------------------------------------------- +// +void CImpsPushHandler::CPushHandlerBase_Reserved2( ) + { +#ifndef _DOUNITTEST + User::Panic( KNotSupported, KErrNotSupported ); +#endif + } + +// ----------------------------------------------------------------------------- +// CImpsPushHandler::PerformCheck +// Returns: : KErrCorrupt if the message has invalid format +// ----------------------------------------------------------------------------- +// +TInt CImpsPushHandler::PerformCheck( ) + { + TInt error = KErrNone; + + TPtrC8 messageBodyPtr; + TBool bodyPresent = EFalse; + bodyPresent = iPushMsg->GetMessageBody( messageBodyPtr ); + // Check that the message begins with WVCI keyword + if ( ( !bodyPresent ) || ( messageBodyPtr.Match( KWVID ) == KErrNotFound ) ) + { +#ifdef _IMPS_LOGGING_ON_ + CWatcherLogger::Log( KMessageWasCorrupt ); +#endif + error = KErrCorrupt; + } + + return error; + } + +// ----------------------------------------------------------------------------- +// CImpsPushHandler::TransferMessage +// ----------------------------------------------------------------------------- +// +void CImpsPushHandler::TransferMessage( ) + { +#ifdef _IMPS_LOGGING_ON_ + CWatcherLogger::Log( KTransferMessage ); +#endif + TInt serverRunning = iWatchClient.Register( ); + if( serverRunning == KErrNone ) + { + TPtrC8 messageBodyPtr; + TBool bodyPresent = iPushMsg->GetMessageBody( messageBodyPtr ); + if( bodyPresent ) + { + iWatchClient.SendCIR( messageBodyPtr ); + } + iWatchClient.UnRegister( ); + } + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// ImplementationGroupProxy +// Returns: TImplementationProxy*: Implementation table to the ECOM framework +// ----------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + + return ImplementationTable; + } + + +// End of File +