diff -r 000000000000 -r 094583676ce7 IMPSengine/client/src/impsimhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IMPSengine/client/src/impsimhandler.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,366 @@ +/* +* Copyright (c) 2002-2005 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: +* handler class for im client. +* +*/ + +// INCLUDE FILES +#include +#include +#include "impsimcli.h" +#include "impsimhandler.h" +#include "impsfields.h" +#include "impsservercommon.h" +#include "impserrors.h" +#include "impsutils.h" +#include "impsdataaccessor.h" +#include "impscdatautils.h" +#include "impsliterals.h" + +// MACROS +#ifndef _DEBUG +#define _NO_IMPS_LOGGING_ +#endif + +// ================= MEMBER FUNCTIONS ======================= + +// ---------------------------------------------------------------------------- +// CImpsImHandler2::CImpsImHandler2 +// ---------------------------------------------------------------------------- +CImpsImHandler2::CImpsImHandler2( + TInt aPriority, + RImpsImClient2& aClient ) : + // The base class adds this to the scheduler + CImpsHandler2( aPriority, aClient ) + { + } + +// ---------------------------------------------------------------------------- +// CImpsImHandler2::NewL +// ---------------------------------------------------------------------------- +CImpsImHandler2* CImpsImHandler2::NewL( + RImpsImClient2& aClient, + TInt aPriority ) + { + + // Perform the construction. + CImpsImHandler2* self = new (ELeave) + CImpsImHandler2( aPriority, aClient); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ---------------------------------------------------------------------------- +// CImpsImHandler2::~CImpsImHandler2() +// ---------------------------------------------------------------------------- + CImpsImHandler2::~CImpsImHandler2() + { + + } + +// ---------------------------------------------------------------------------- +// CImpsImHandler2::ConstructL +// ---------------------------------------------------------------------------- +void CImpsImHandler2::ConstructL() + { + CImpsHandler2::ConstructL(); + } + +// ---------------------------------------------------------------------------- +// CImpsImHandler2::HandleEventL() +// ---------------------------------------------------------------------------- + +void CImpsImHandler2::HandleEventL( CImpsFields* aErrorFields ) + { + // get the event data from server thread. + SImpsEventData* event = (SImpsEventData*)iEventData.Ptr(); + +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log(_L("CImpsImHandler2::HandleEventL opid=%d cli=%d"), + event->iOpCode, (TInt)&iClient ); +#endif + + if ( event->iStatus != ( Imps_ERROR_BASE - 200 ) && + event->iStatus != KErrNone ) + { + HandleErrorEventL( event->iOpCode, event->iStatus, aErrorFields ); + } + // Call regular observer + // iStatus is error code or message size + else if ( iStatus >= 0 ) + { + HandleImEventL( ); + } + } + +// ---------------------------------------------------------------------------- +// CImpsImHandler2::HandleImEventL() +// ---------------------------------------------------------------------------- +void CImpsImHandler2::HandleImEventL( ) + { + SImpsEventData* event = (SImpsEventData*)iEventData.Ptr(); + RImpsImClient2& client = (RImpsImClient2&)iClient; + MImpsImHandler2* imhandler = client.Handler(); + MImpsBlockingHandler2* blockhandler = client.BlockHandler(); + + TInt err( KErrNone ); + + // Check incoming message type + TInt myType = event->iMessageType; + + CImpsDataAccessor* myAccess = CImpsDataAccessor::NewLC( iFields ); // << + CImpsKey* myKey = CImpsKey::NewLC(); // <<< myKey + + switch ( myType ) + { + case EImpsNewMessage: + { + if ( !imhandler ) + { + break; + } + + // get messageID + TPtrC msgId = TPtrC( KNullDesC ); + (void)TImpsCDataUtils::GetNewMessageIdL( + myKey, myAccess, msgId ); + + myKey->Reset(); + + // arrays + // notice: optimize creation of arrays + CPtrC16Array* users = new ( ELeave )CPtrC16Array( 4 ); + CleanupStack::PushL( users ); // <<< users + CPtrC16Array* sns = new ( ELeave )CPtrC16Array( 4 ); + CleanupStack::PushL( sns ); // <<< sns + CPtrC16Array* grs = new ( ELeave )CPtrC16Array( 4 ); + CleanupStack::PushL( grs ); // <<< grs + CPtrC16Array* sng = new (ELeave) CPtrC16Array(5); + CleanupStack::PushL( sng ); // <<< grs + + TImpsCDataUtils::AddValuesFromArrayL( + myKey, + KNewMessageElements, + sizeof( KNewMessageElements ) / + sizeof( KNewMessageElements[0] ) ); + myKey->AddL( CREATEKEY( EImpsKeyMessageInfo, 0 ) ); + TPtrC mySender; + TPtrC myGroup; + TImpsCDataUtils::GetSenderL( myKey, myAccess, + mySender, myGroup ); + TImpsCDataUtils::GetRecipientsL( myKey, myAccess, + grs, users, sng, sns ); + + myKey->PopL(); + + TPtrC myType; + TImpsCDataUtils::GetContentTypeL( myAccess, myType ); + + // !!!! Fix for JKIO-6PAGQ3 !!!! + // Check whether the content type starts with "text/plain" + if ( !myType.Left(KImpsContentType().Length()).CompareF( KImpsContentType ) || myType.Length() == 0 ) + { + TPtrC myContent; + TImpsCDataUtils::GetContentDataL( myKey, myAccess, myContent ); + + // Call API observer method +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log(_L("CImpsImHandler2::call HandleNewTextMessageL opid=%d"), event->iOpCode ); +#endif + TRAP( err, imhandler->HandleNewTextMessageL( + event->iOpCode, + msgId, + mySender, + myGroup, + *users, + *sns, + myContent, + *iClient.CspIdentifier() )); + } + else + { + TPtrC8 myContent; + TInt inCleanup(0); + TDesC8* content; + myKey->Reset(); + TImpsCDataUtils::AddValuesFromArrayL( + myKey, + KNewMessageElements, + sizeof( KNewMessageElements ) / + sizeof( KNewMessageElements[0] ) ); + + myKey->AddL( CREATEKEY( EImpsKeyContentData, 0 ) ); + if ( myAccess->RestoreDesc8L( myKey, content ) ) + { + TInt encoding (-1); + TImpsCDataUtils::GetContentEncodingL( myAccess, encoding); + if ( encoding == EImpsBASE64 ) + { + // allocate buffer for decoding + HBufC8* contentBuf = HBufC8::NewLC( content->Length() ); // << contentBuf + inCleanup++; + // BASE64 decoding + TImCodecB64 codec; + codec.Initialise(); + TPtr8 ptr( contentBuf->Des() ); + codec.Decode( *content , ptr ); + myContent.Set(*contentBuf); + } + else + { + myContent.Set( *content ); + } + } + else + { + myContent.Set( KNullDesC8 ); + } + // Call API observer method +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log(_L("CImpsImHandler2::HandleNewContentMessageL opid=%d length=%d"), event->iOpCode, myContent.Length() ); + +#endif + TRAP( err, imhandler->HandleNewContentMessageL( + event->iOpCode, + msgId, + mySender, + myGroup, + *users, + *sns, + myType, + myContent, + *iClient.CspIdentifier() )); + if ( inCleanup > 0 ) + { + CleanupStack::PopAndDestroy( inCleanup ); // >>> contentBuf + } + myKey->PopL(); + + } + CleanupStack::PopAndDestroy(4); // >>> users, sns, grs, sng + } + break; + + case EImpsDeliveryReportReq: + { + if ( !imhandler ) + { + break; + } + TImpsCDataUtils::AddValuesFromArrayL( + myKey, + KTransContentElements, + sizeof( KTransContentElements ) / + sizeof( KTransContentElements[0] ) ); + myKey->AddL( CREATEKEY( EImpsKeyDeliveryReport_Request, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyMessageInfo, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyMessageID, 0 ) ); + TDesC* msgId; + myAccess->RestoreDescL( myKey, msgId ); + myKey->PopL( 2 ); + + myKey->AddL( CREATEKEY( EImpsKeyResult, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyCode, 0 ) ); + TInt result( 0 ); + myAccess->RestoreIntegerL( myKey, result ); + myKey->PopL(); + + myKey->AddL( CREATEKEY( EImpsKeyDescription, 0 ) ); + TDesC* description; + myAccess->RestoreDescL( myKey, description ); + + TRAP( err, imhandler->HandleDeliveryReportL( + *msgId, result, description, *iClient.CspIdentifier() ) ); + + // myKey->ResetL( ); + } + break; + + case EImpsGetBlockedListRes: + if ( blockhandler ) + { + + TBool blockedInUse( EFalse ); + TBool grantedInUse( EFalse ); + + CPtrC16Array* blockedList = new ( ELeave )CPtrC16Array( 4 ); + CleanupStack::PushL( blockedList ); // <<< blockedList + + CPtrC16Array* grantedList = new ( ELeave )CPtrC16Array( 4 ); + CleanupStack::PushL( grantedList ); // <<< grantedList + + // Get data from internal data format to API method + TImpsCDataUtils::GetBlockedListResponseL( + myKey, myAccess, + blockedList, + blockedInUse, + grantedList, + grantedInUse ); + +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log(_L("CImpsImHandler2::call GetBlockedListResponseL opid=%d"), event->iOpCode ); +#endif + // Call API observer method + TRAP( err, blockhandler->GetBlockedListResponseL( + blockedList, + blockedInUse, + grantedList, + grantedInUse, + *client.CspIdentifier() ) ); + + CleanupStack::PopAndDestroy(2); // >> blockedList, grantedlist + + } + break; + + + default: // responses + if ( event->iReqMesType == EImpsBlockEntityReq && blockhandler) + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log(_L("CImpsImHandler2::call HandleCompleteL opid=%d"), event->iOpCode ); +#endif + TRAP( err, blockhandler->HandleCompleteL( event->iOpCode, /*event->iStatus,*/ *iClient.CspIdentifierL() )); + } + else if ( event->iReqMesType == EImpsSendMessageReq && imhandler) + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log(_L("CImpsImHandler2::call HandleSendCompleteL opid=%d"), event->iOpCode ); +#endif + TRAP( err, imhandler->HandleSendCompleteL( + event->iOpCode, EFalse, *iClient.CspIdentifier())); + } + else + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log(_L("CImpsImHandler2:: ERROR CORRUPTED ***** opid=%d"), event->iOpCode ); +#endif + __ASSERT_DEBUG( 0 == 1, + User::Panic( KImpsPanicCategory, + EImpsCorrupted ) ); + User::Leave( KErrNotSupported ); + } + break; + } // switch + + CleanupStack::PopAndDestroy(2); // myKey, myAccess + + } + +// End of File