--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uiservicetab/vimpstcmdprocess/src/cvimpstcmdprocessselectedcontact.cpp Wed Sep 01 12:33:36 2010 +0100
@@ -0,0 +1,255 @@
+/*
+* Copyright (c) 2008 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: command process for selected contact
+*
+*/
+
+
+//include files
+#include "cvimpstcmdprocessselectedcontact.h"
+
+#include <MVPbkStoreContact.h>
+#include <MVPbkFieldType.h>
+#include <MVPbkContactFieldTextData.h>
+#include <MVPbkContactFieldUriData.h>
+
+#include "vimpstcmd.hrh"
+#include "mvimpstcmdobserver.h"
+
+#include "uiservicetabtracer.h"
+
+#include <e32def.h>
+#include <MVPbkContactLinkArray.h>
+#include "mvimpstengine.h"
+
+#include "mvimpststorageserviceview.h"
+#include "cvimpststoragemanagerfactory.h"
+#include "mvimpstenginecontactmgmtextention.h"
+#include "tvimpstconsts.h"
+#include "mvimpstenginesubservice.h"
+#include "mvimpstenginepresencesubservice.h"
+
+// Constants
+_LIT( KListNameAllBuddy ,"buddylist" );
+
+// --------------------------------------------------------------------------
+// CVIMPSTCmdProcessSelectedContact::CVIMPSTCmdProcessSelectedContact
+// --------------------------------------------------------------------------
+//
+CVIMPSTCmdProcessSelectedContact::CVIMPSTCmdProcessSelectedContact( const TInt aCommandId ,
+ TVPbkSelectedData& aSelectedEntries,
+ MVIMPSTEngine& aEngine ):
+ iCommandId( aCommandId ),
+ iSelectedEntries( aSelectedEntries ),
+ iEngine(aEngine)
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CVIMPSTCmdProcessSelectedContact::~CVIMPSTCmdProcessSelectedContact
+// --------------------------------------------------------------------------
+//
+CVIMPSTCmdProcessSelectedContact::~CVIMPSTCmdProcessSelectedContact()
+ {
+
+ }
+
+// --------------------------------------------------------------------------
+// CVIMPSTCmdProcessSelectedContact::NewL
+// --------------------------------------------------------------------------
+//
+CVIMPSTCmdProcessSelectedContact* CVIMPSTCmdProcessSelectedContact::NewL( const TInt aCommandId,
+ TVPbkSelectedData& aSelectedEntries,
+ MVIMPSTEngine& aEngine )
+ {
+ CVIMPSTCmdProcessSelectedContact* self = new (ELeave ) CVIMPSTCmdProcessSelectedContact( aCommandId ,aSelectedEntries, aEngine);
+ self->ConstructL(); //use contsurctL if necessary
+ return self;
+ }
+// --------------------------------------------------------------------------
+// CVIMPSTCmdProcessSelectedContact::ConstructL
+// --------------------------------------------------------------------------
+//
+void CVIMPSTCmdProcessSelectedContact::ConstructL()
+ {
+ iError = KErrNone;
+ }
+
+// --------------------------------------------------------------------------
+// CVIMPSTCmdProcessSelectedContact::ExecuteLD
+// --------------------------------------------------------------------------
+//
+void CVIMPSTCmdProcessSelectedContact::ExecuteLD()
+ {
+
+ TRACER_AUTO;
+ //push to the cleanupstack
+ CleanupStack::PushL( this );
+ MVIMPSTStorageServiceView* storage = CVIMPSTStorageManagerFactory::ContactListInterfaceL( iEngine.ServiceId() ) ;
+ if(storage)
+ {
+ TBool localStore = storage->IsLocalStore();
+ //retrieve contact from links
+ TPtrC8 pacledLinks = iSelectedEntries.iPackedLinks->Des();
+ TInt count = storage->RetriveLinkXSPIdsL( pacledLinks );
+ if( !count )
+ {
+ iError = KErrGeneral;
+ }
+ if( (iCommandId == ECmdProcessSelectedContactNew ||
+ iCommandId == ECmdProcessSelectedContactExist )&&
+ iError == KErrNone )
+ {
+ MVIMPSTEngineExtentionFeatures* contactFeature = iEngine.ExtentionFeatures(TVIMPSTEnums::EContactManagement);
+ MVIMPSTEngineSubService* presenceService = iEngine.SubService(TVIMPSTEnums::EPresence);
+ for(TInt index = 0; index < count; index++ )
+ {
+ TPtrC xspIdPtr = storage->GetRetrieveXSPIdL( index ); // xspId is owned here
+ if( localStore )
+ {
+ iError = KErrNone;
+ if( xspIdPtr.Length() )
+ {
+ if( IsContactBlocked( xspIdPtr ) )
+ {
+ iError = EErrExistInBlockList;
+ }
+ else if( storage->FindContactByUserId( xspIdPtr ) )
+ {
+ iError = EErrExistInContactList;
+ }
+ else if( contactFeature )
+ {
+ // add to server and store if sucess
+ MVIMPSTEngineContactMgmtExtention& contactMgr =
+ MVIMPSTEngineContactMgmtExtention::Cast (*contactFeature);
+ iError = contactMgr.AddServerContactL( KListNameAllBuddy, xspIdPtr ,KNullDesC );
+ }
+ }
+ if(KErrNone == iError )
+ {
+ iError = storage->CreateNewContactFromRetrivedIdL( index );
+ }
+ else if( iCommandId == ECmdProcessSelectedContactNew )
+ {
+ // delete the contact which got created in phonebook but failed to add in servicetab
+ storage->DeleteNewContactFromRetrivedIdL( index );
+ }
+ }
+ else if( xspIdPtr.Length() )
+ {
+ // xspId ownership is transfered to iXSPList
+ iSelectedEntries.iXSPList.AppendL( xspIdPtr.AllocL() );
+ }
+ }
+ }
+ else if( ( iCommandId == ECmdProcessAcceptedContactNew ||
+ iCommandId == ECmdProcessAcceptedContactExist )&&
+ iError == KErrNone )// for accepted contact
+ {
+ // just add and return
+ // contact is already added in storage in RetrieveContactL
+ // if sucess ,storage will take ownership else we need to delete contact
+ iError = storage->CreateNewContactFromRetrivedIdL( 0 ); // for accepting invitation take the first contact which is retirved
+ if( iError != KErrNone && iCommandId == ECmdProcessAcceptedContactNew )
+ {
+ // delete the contact which got created in phonebook but failed to add in servicetab
+ storage->DeleteNewContactFromRetrivedIdL( 0 );
+ }
+ }
+ if( !localStore )
+ {
+ // in case of server we have a selection dialog
+ // so this error does not matter
+ // set to 0
+ iError = KErrNone;
+ }
+ }
+ else
+ {
+ iError = KErrGeneral;
+ }
+ if(iObserver)
+ {
+ iObserver->CommandFinishedL(*this);
+ }
+
+ CleanupStack::PopAndDestroy();
+
+ }
+
+
+// --------------------------------------------------------------------------
+// CVIMPSTCmdProcessSelectedContact::AddObserver
+// --------------------------------------------------------------------------
+//
+void CVIMPSTCmdProcessSelectedContact::AddObserver( MVIMPSTCmdObserver& aObserver )
+ {
+ // store the observer to notify the command completion
+ iObserver = &aObserver;
+ }
+
+
+// --------------------------------------------------------------------------
+// CVIMPSTCmdProcessSelectedContact::CommandId
+// --------------------------------------------------------------------------
+//
+TInt CVIMPSTCmdProcessSelectedContact::CommandId() const
+ {
+ return iCommandId;
+ }
+
+// --------------------------------------------------------------------------
+// CVIMPSTCmdProcessSelectedContact::Result
+// --------------------------------------------------------------------------
+//
+TInt CVIMPSTCmdProcessSelectedContact::Result() const
+ {
+ //return valid data regd the command operation
+ return iError;
+ }
+
+ // --------------------------------------------------------------------------
+// CVIMPSTCmdProcessSelectedContact::Result
+// --------------------------------------------------------------------------
+//
+// --------------------------------------------------------------------------
+// CVIMPSTCmdProcessSelectedContact::IsContactBlocked
+// --------------------------------------------------------------------------
+TBool CVIMPSTCmdProcessSelectedContact::IsContactBlocked(const TDesC& aUserId)
+ {
+ TRACER_AUTO;
+ MVIMPSTEngineSubService* subService =
+ (iEngine.SubService(TVIMPSTEnums::EPresence));
+ if(subService)
+ {
+ MVIMPSTEnginePresenceSubService& presence =
+ MVIMPSTEnginePresenceSubService::Cast (*subService);
+
+ RPointerArray<HBufC> *blockedlist = presence .GetBlockedList();
+
+ if(blockedlist)
+ {
+ for(TInt i=0; i<blockedlist->Count(); ++i)
+ {
+ if(0 == aUserId.CompareC((*blockedlist)[i]->Des()))
+ {
+ return ETrue;
+ }
+ }
+ }
+ }
+ return EFalse;
+ }
+// End of File