--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/IMPSengine/client/src/impsimcommand.cpp Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,462 @@
+/*
+* 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:
+* commander class for im.
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32std.h>
+
+#include "impsimcli.h"
+#include "impsimcommand.h"
+#include "impsfields.h"
+#include "impspacked.h"
+#include "impsutils.h"
+#include "impsdataaccessor.h"
+#include "impscdatautils.h"
+#include "impsdetailed.h"
+
+// MACROS
+#ifndef _DEBUG
+#define _NO_IMPS_LOGGING_
+#endif
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ----------------------------------------------------------------------------
+// CImpsImCommand2::CImpsImCommand2
+// ----------------------------------------------------------------------------
+CImpsImCommand2::CImpsImCommand2(
+ TInt aPriority,
+ RImpsImClient2& aClient ) :
+ CActive( aPriority ), iClient( aClient )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsImCommand2::NewL
+// ----------------------------------------------------------------------------
+CImpsImCommand2* CImpsImCommand2::NewL( RImpsImClient2& aClient )
+ {
+
+ // Perform the construction.
+ CImpsImCommand2* self = new (ELeave)
+ CImpsImCommand2( EPriorityUserInput, aClient);
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop(1); // self
+
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsImCommand2::ConstructL
+// ----------------------------------------------------------------------------
+void CImpsImCommand2::ConstructL( )
+ {
+ iDetailed = new (ELeave) CImpsDetailed(1);
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsImCommand2::~CImpsImCommand2
+// ----------------------------------------------------------------------------
+CImpsImCommand2::~CImpsImCommand2()
+ {
+ // Cancel any outstanding requests
+ Cancel();
+ delete iMessageStream;
+ delete iDetailed;
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsImCommand2::StartRunL
+// ----------------------------------------------------------------------------
+void CImpsImCommand2::StartRunL(
+ TInt aOpId,
+ TImpsServRequest aType )
+ {
+ iOpId = aOpId;
+ iType = aType;
+ iState = 0;
+
+ if ( IsActive() )
+ {
+ User::Leave( KErrServerBusy );
+ }
+
+ // Set this active object active
+ iStatus = KRequestPending;
+ SetActive();
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsImCommand2::SetParametersL
+// version for newtextmessage
+// ----------------------------------------------------------------------------
+void CImpsImCommand2::SetParametersL(
+ const TDesC* aSenderSn,
+ const MDesCArray* aUserIds,
+ const TDesC* aGroupId,
+ const MDesCArray* aScreenNames,
+ const TDesC& aContent,
+ TBool aDeliveryReportWanted )
+ {
+
+ // Generate one flat message presentation
+ if ( IsActive() )
+ {
+ User::Leave( KErrServerBusy );
+ }
+
+ if ( !iMessageStream )
+ {
+ iMessageStream = HBufC8::NewL( KImpsStreamSize );
+ }
+ *iMessageStream = KNullDesC8;
+
+ // Initialize internal structure
+ CImpsFields* fields = CImpsFields::NewL();
+ CleanupStack::PushL( fields ); // <<< fields
+ fields->SetMessageType( EImpsSendMessageReq );
+
+ CImpsDataAccessor* myAccess = CImpsDataAccessor::NewL( fields );
+ CleanupStack::PushL( myAccess ); // <<< myAccess
+ CImpsKey* myKey = CImpsKey::NewLC(); // <<< myKey
+
+ CPtrC16Array* grs = new (ELeave) CPtrC16Array(4);
+ CleanupStack::PushL( grs ); // <<< grs
+
+ CPtrC16Array* grns = new (ELeave) CPtrC16Array(4);
+ CleanupStack::PushL( grns ); // <<< grns
+
+ TImpsCDataUtils::AddValuesFromArrayL(
+ myKey,
+ KSendMessageElements,
+ sizeof( KSendMessageElements ) /
+ sizeof( KSendMessageElements[0] ) );
+
+ // add delivery report
+ myKey->AddL( CREATEKEY( EImpsKeyDeliveryReport, 0 ) );
+ myAccess->StoreBooleanL( myKey, aDeliveryReportWanted );
+ myKey->PopL();
+
+ if ( aScreenNames )
+ {
+ TInt count = aScreenNames->MdcaCount();
+ for ( TInt i = 0; i < count ; i++ )
+ {
+ grns->AppendL( *aGroupId );
+ }
+ // GroupID is used as Recipient( Group ( GroupID ) ) also
+ // if aScreenNames is empty
+ if ( count == 0 && aGroupId )
+ {
+ grs->AppendL( *aGroupId );
+ }
+ }
+ // GroupID is used as Recipient( Group ( GroupID ) ) if
+ // aScreenNames is omitted.
+ else if ( aGroupId )
+ {
+ grs->AppendL( *aGroupId );
+ }
+
+ myKey->AddL( CREATEKEY( EImpsKeyMessageInfo, 0 ) );
+
+ TImpsCDataUtils::SetRecipientsL(
+ myKey,
+ myAccess,
+ grs,
+ aUserIds,
+ grns, // ScreenName( GroupId )
+ aScreenNames ); // ScreenName( SName );
+
+ TImpsCDataUtils::SetSenderL(
+ myKey,
+ myAccess,
+ aSenderSn,
+ NULL );
+
+ myKey->PopL();
+
+ // notice: MessageInfo:ContentType is default now
+ // Add actual ContentData
+ TImpsCDataUtils::SetContentDataL(
+ myKey, myAccess, aContent );
+ // Set sender
+ // This is a "fuzzy" logic.
+ // aSenderSn + aGroupId -> Sender ( ScreenName( SName, GroupID ) )
+ // !aSenderSn + !aGroupId -> Sender ( User ( UserID )) added by engine!
+ // aSenderSn + !aGroupId -> Sender ( User ( UserID ))
+ // !aSenderSn + aGroupId -> Sender ( Group ( GroupID ))
+
+ CleanupStack::PopAndDestroy(4); // >>> grns, grs, myKey, myAccess
+
+ // pack, or actullay serialize the message data
+ TImpsPackedEntity packedMessage( iMessageStream );
+ TInt myError = packedMessage.PackEntity( *fields );
+
+ // Allocate more memory if needed
+ if ( ( myError != KErrNone ) &&
+ ( iMessageStream->Des().Size() < fields->Size() ) )
+ {
+ // notice: consider how to shrink buffer later
+ // increase the size of the buffer and try again
+ iMessageStream->Des().SetLength(0); // to avoid copying contents
+ iMessageStream = iMessageStream->ReAllocL( fields->Size() + 10 );
+ myError = packedMessage.PackEntity( *fields );
+ User::LeaveIfError( myError );
+ }
+
+ CleanupStack::PopAndDestroy( 1 ); // fields
+
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsImCommand2::SetParametersL
+// version for newcontentmessage
+// ----------------------------------------------------------------------------
+void CImpsImCommand2::SetParametersL(
+ const TDesC* aSenderSn,
+ const MDesCArray* aUserIds,
+ const TDesC* aGroupId,
+ const MDesCArray* aScreenNames,
+ const TDesC& aContentType,
+ const TDesC8& aContent,
+ TBool aDeliveryReportWanted )
+ {
+
+ // Generate one flat message presentation
+ if ( IsActive() )
+ {
+ User::Leave( KErrServerBusy );
+ }
+
+ if ( !iMessageStream )
+ {
+ iMessageStream = HBufC8::NewL( KImpsStreamSize );
+ }
+ *iMessageStream = KNullDesC8;
+
+ // Initialize internal structure
+ CImpsFields* fields = CImpsFields::NewL();
+ CleanupStack::PushL( fields ); // <<< fields
+ fields->SetMessageType( EImpsSendMessageReq );
+
+ CImpsDataAccessor* myAccess = CImpsDataAccessor::NewL( fields );
+ CleanupStack::PushL( myAccess ); // <<< myAccess
+ CImpsKey* myKey = CImpsKey::NewLC(); // <<< myKey
+
+ CPtrC16Array* grs = new (ELeave) CPtrC16Array(4);
+ CleanupStack::PushL( grs ); // <<< grs
+
+ CPtrC16Array* grns = new (ELeave) CPtrC16Array(4);
+ CleanupStack::PushL( grns ); // <<< grns
+
+ TImpsCDataUtils::AddValuesFromArrayL(
+ myKey,
+ KSendMessageElements,
+ sizeof( KSendMessageElements ) /
+ sizeof( KSendMessageElements[0] ) );
+
+ // add delivery report
+ myKey->AddL( CREATEKEY( EImpsKeyDeliveryReport, 0 ) );
+ myAccess->StoreBooleanL( myKey, aDeliveryReportWanted );
+ myKey->PopL();
+
+ if ( aScreenNames )
+ {
+ TInt count = aScreenNames->MdcaCount();
+ for ( TInt i = 0; i < count ; i++ )
+ {
+ grns->AppendL( *aGroupId );
+ }
+ // GroupID is used as Recipient( Group ( GroupID ) ) also
+ // if aScreenNames is empty
+ if ( count == 0 && aGroupId )
+ {
+ grs->AppendL( *aGroupId );
+ }
+ }
+ // GroupID is used as Recipient( Group ( GroupID ) ) only if
+ // aScreenNames is omitted.
+ else if ( aGroupId )
+ {
+ grs->AppendL( *aGroupId );
+ }
+
+ myKey->AddL( CREATEKEY( EImpsKeyMessageInfo, 0 ) );
+
+ TImpsCDataUtils::SetRecipientsL(
+ myKey,
+ myAccess,
+ grs,
+ aUserIds,
+ grns, // ScreenName( GroupId )
+ aScreenNames ); // ScreenName( SName );
+
+ TImpsCDataUtils::SetSenderL(
+ myKey,
+ myAccess,
+ aSenderSn,
+ NULL );
+
+ TPtrC myContentType( aContentType );
+ TImpsCDataUtils::SetContentTypeL( myAccess, myContentType );
+
+ TImpsCDataUtils::SetBinaryContentDataL(
+ myKey, myAccess, aContent );
+ // Set sender
+ // This is a "fuzzy" logic.
+ // aSenderSn + aGroupId -> Sender ( ScreenName( SName, GroupID ) )
+ // !aSenderSn + !aGroupId -> Sender ( User ( UserID )) added by engine!
+ // aSenderSn + !aGroupId -> Sender ( User ( UserID ))
+ // !aSenderSn + aGroupId -> Sender ( Group ( GroupID ))
+
+ CleanupStack::PopAndDestroy(4); // >>> grns, grs, myKey, myAccess
+
+ // pack, or actullay serialize the message data
+ TImpsPackedEntity packedMessage( iMessageStream );
+ TInt myError = packedMessage.PackEntity( *fields );
+
+ // Allocate more memory if needed
+ if ( ( myError != KErrNone ) &&
+ ( iMessageStream->Des().Size() < fields->Size() ) )
+ {
+ // notice: consider how to shrink buffer later
+ // increase the size of the buffer and try again
+ iMessageStream->Des().SetLength(0); // to avoid copying contents
+ iMessageStream = iMessageStream->ReAllocL( fields->Size() + 10 );
+ myError = packedMessage.PackEntity( *fields );
+ User::LeaveIfError( myError );
+ }
+
+ CleanupStack::PopAndDestroy( 1 ); // fields
+
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsImCommand2::SetParametersL
+// ----------------------------------------------------------------------------
+void CImpsImCommand2::SetParametersL(
+ const MDesCArray* aBlockEntity,
+ const MDesCArray* aUnBlockEntity,
+ TBool aBlockedListInUse,
+ const MDesCArray* aGrantedEntityList,
+ const MDesCArray* aUnGrantEntity,
+ TBool aGrantedListInUse )
+ {
+
+ // Generate one flat message presentation
+
+ if ( IsActive() )
+ {
+ User::Leave( KErrServerBusy );
+ }
+
+ if ( !iMessageStream )
+ {
+ iMessageStream = HBufC8::NewL( KImpsStreamSize );
+ }
+ *iMessageStream = KNullDesC8;
+
+ // Initialize internal structure
+ CImpsFields* fields = CImpsFields::NewL();
+ CleanupStack::PushL( fields ); // <<< fields
+ fields->SetMessageType( EImpsBlockEntityReq );
+
+ CImpsDataAccessor* myAccess = CImpsDataAccessor::NewL( fields );
+ CleanupStack::PushL( myAccess ); // <<< myAccess
+ CImpsKey* myKey = CImpsKey::NewLC(); // <<< myKey
+
+ TImpsCDataUtils::SetBlockedListRequestL(
+ myKey,
+ myAccess,
+ aBlockEntity,
+ aUnBlockEntity,
+ aBlockedListInUse,
+ aGrantedEntityList,
+ aUnGrantEntity,
+ aGrantedListInUse );
+
+ CleanupStack::PopAndDestroy(2); // >>> myKey, myAccess
+
+ // pack, or actullay serialize the message data
+ TImpsPackedEntity packedMessage( iMessageStream );
+ TInt myError = packedMessage.PackEntity( *fields );
+
+ // Allocate more memory if needed
+ if ( ( myError != KErrNone ) &&
+ ( iMessageStream->Des().Size() < fields->Size() ) )
+ {
+ // notice: consider how to shrink buffer later
+ // increase the size of the buffer and try again
+ iMessageStream->Des().SetLength(0); // to avoid copying contents
+ iMessageStream = iMessageStream->ReAllocL( fields->Size() + 10 );
+ myError = packedMessage.PackEntity( *fields );
+ User::LeaveIfError( myError );
+ }
+
+ CleanupStack::PopAndDestroy( 1 ); // fields
+
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsImCommand2::RunL
+// ----------------------------------------------------------------------------
+
+void CImpsImCommand2::RunL()
+ {
+
+#ifndef _NO_IMPS_LOGGING_
+ CImpsClientLogger::Log(_L("CImpsImCommand2: RunL stat=%d h=%d cli=%d"),
+ iStatus.Int(), (TInt)this, (TInt)&iClient );
+#endif
+
+ MImpsErrorHandler2* ehandler = iClient.ErrorHandler();
+
+ // Errors are handled here only.
+ // Successful cases are handled by CImpsImHandler.
+ if ( iStatus == KErrNone )
+ {
+ return;
+ }
+
+ // Handler should be registered
+ if ( ehandler )
+ {
+ TInt err( KErrNone );
+ TRAP( err, ehandler->HandleErrorL(
+ iStatus.Int(),
+ iOpId,
+ NULL,
+ NULL,
+ *iClient.CspIdentifier() ));
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CImpsImCommand2::DoCancel
+// Before calling this the Cancel should have sent to the engine!
+// ----------------------------------------------------------------------------
+
+void CImpsImCommand2::DoCancel()
+ {
+ }
+
+// End of File
+