imstutils/imconversationview/imcvuiengine/src/cimcvenginestoragelistener.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:33:36 +0100
branchRCL_3
changeset 23 9a48e301e94b
parent 0 5e5d6b214f4f
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2008-2009 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:  active object class for interacting with servicetab for link and Display Name
*
*/

// INCLUDE FILES

#include "cimcvenginestoragelistener.h"
#include "cimcvenginemessagehandler.h"
#include "imcvlogger.h"

//system includes

// ================= MEMBER FUNCTIONS =======================

// --------------------------------------------------------------------------
// CIMCVEngineStorageListener::CIMCVEngineStorageListener
// --------------------------------------------------------------------------
//
CIMCVEngineStorageListener::CIMCVEngineStorageListener(MIMCVEngineStorageObserver& aObserver )
    : CActive( CActive::EPriorityStandard ),
    iObserver( aObserver )
    {
    CActiveScheduler::Add( this );
    }


// --------------------------------------------------------------------------
// CIMCVEngineStorageListener::ConstructL
// --------------------------------------------------------------------------
//
void CIMCVEngineStorageListener::ConstructL()
    {
    IM_CV_LOGS(TXT("CIMCVEngineStorageListener::ConstructL : start"));
    TInt err = RProperty::Define(KConvViewUID,KXspIdServiceIDKey,RProperty::EText);
    if(KErrAlreadyExists != err && KErrNone != err )
        {
        User::LeaveIfError(err);
        }
    //define properties that engine will publish.
    err = RProperty::Define(KConvViewUID,KContactLinkDisplayNameKey,RProperty::ELargeText);
    if(KErrAlreadyExists != err && KErrNone != err )
        {
        User::LeaveIfError(err);
        }
   //Attaching iProperty with the property published by engine to get contact link and display name.
    err = iProperty.Attach(KConvViewUID,KContactLinkDisplayNameKey);
    User::LeaveIfError(err);
    IM_CV_LOGS(TXT("CIMCVEngineStorageListener::ConstructL : end"));
    }
// --------------------------------------------------------------------------
// CIMCVEngineStorageListener::NewL
// --------------------------------------------------------------------------
//
CIMCVEngineStorageListener* CIMCVEngineStorageListener::NewL(MIMCVEngineStorageObserver& aObserver)
    {
    CIMCVEngineStorageListener* self = new(ELeave) CIMCVEngineStorageListener( aObserver );
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    return self;
    }
// --------------------------------------------------------------------------
// CIMCVEngineStorageListener::GetContactLinkInfoL
// --------------------------------------------------------------------------
//
void CIMCVEngineStorageListener::GetContactLinkInfoL(TInt aServiceId, const TDesC& aXspID)
    {
    IM_CV_LOGS(TXT("CIMCVEngineStorageListener::GetContactLinkInfoL : start"));
    IM_CV_LOGS(TXT("CIMCVEngineStorageListener::GetContactLinkInfoL aServiceId= %d"),aServiceId );
    IM_CV_LOGS(TXT("CIMCVEngineStorageListener::GetContactLinkInfoL aXspID= %S"),&aXspID );
    StartListening();
    
    TInt length = KMaxServiceIdLength + aXspID.Length() + KDelimiter().Length();
    HBufC* userDetails = HBufC::NewLC(length);
    
    TPtr userDetailsPtr = userDetails->Des();
    userDetailsPtr.Zero();
    userDetailsPtr.AppendNum(aServiceId);
    userDetailsPtr.Append(KDelimiter());
    userDetailsPtr.Append(aXspID);
    
    RProperty::Set(KConvViewUID,KXspIdServiceIDKey,userDetails->Des());
    if( !iWait.IsStarted() )
      {
      // codescanner warning can be ignored, we are not starting an active object but 
      // CActiveSchedulerWait.
      iWait.Start();
      }
    CleanupStack::PopAndDestroy(userDetails);
    IM_CV_LOGS(TXT("CIMCVEngineStorageListener::GetContactLinkInfoL : end"));
    }

// ---------------------------------------------------------
// CIMCVEngineStorageListener::~CIMCVEngineStorageListener()
// C++ Destructor 
// ---------------------------------------------------------
//
CIMCVEngineStorageListener::~CIMCVEngineStorageListener()
    {
    if( iWait.IsStarted() )
         {
         // codescanner warning can be ignored, we are not starting an active object but 
         // this is CActiveSchedulerWait.
         iWait.AsyncStop();  
         }
    StopListening(); // Cancel any request, if outstanding
    // delete the earlier defined property
    RProperty::Delete(KConvViewUID,KXspIdServiceIDKey);
    RProperty::Delete(KConvViewUID,KContactLinkDisplayNameKey);
    iProperty.Close(); // Destroy the property object
    }

// ---------------------------------------------------------
// CIMCVEngineStorageListener::RunL()
// ---------------------------------------------------------
//
void CIMCVEngineStorageListener::RunL()
    {
    IM_CV_LOGS(TXT("CIMCVEngineStorageListener::RunL : start"));
    if( iStatus.Int() == KErrNone )
        {
        // TBuf <KMaxDisplayNameContactLinkLength> servId_usrId_name_link;
        HBufC16* servId_usrId_name_link = HBufC16::New(KMaxDisplayNameContactLinkLength);
        TPtr servId_usrId_name_linkPtr( servId_usrId_name_link->Des() );
        //Get the property in "ServiceId:UserId:Name:ContactLink" formate
        iProperty.Get(KConvViewUID,KContactLinkDisplayNameKey,servId_usrId_name_linkPtr );

        IM_CV_LOGS(TXT("CIMCVEngineStorageListener::RunL received property = %S"),&servId_usrId_name_linkPtr );

        TInt posOfDelimiter  = servId_usrId_name_link->Find(KDelimiter);
        if(KErrNotFound != posOfDelimiter )
            {
            TInt serviceId;
            HBufC16* userID = NULL;
            HBufC16* contactLink = NULL;
            HBufC16* displayName = NULL;

            TBuf<KMaxServiceIdLength> serviceIdBuf;
            TPtrC ptr(servId_usrId_name_link->Left(posOfDelimiter));
            serviceIdBuf = ptr;
            TLex16 lex(serviceIdBuf);
            lex.Val(serviceId);

            TPtrC usrId_name_link = servId_usrId_name_link->Right(servId_usrId_name_link->Length() - (posOfDelimiter+ 1) );
            posOfDelimiter = usrId_name_link.Find(KDelimiter);
            //extracting user id
            if(KErrNotFound != posOfDelimiter )
                {
                userID = (usrId_name_link.Left(posOfDelimiter)).AllocLC();
                }

            //extracting display name.
            TPtrC name_link = usrId_name_link.Right(usrId_name_link.Length() - (posOfDelimiter+ 1) );
            posOfDelimiter = name_link.Find(KDelimiter);
            if(KErrNotFound != posOfDelimiter   )
                {
                displayName = (name_link.Left(posOfDelimiter)).AllocLC();
                }

            //extracting contact link
            TPtrC link = name_link.Right(name_link.Length() - (posOfDelimiter+ 1) );
            contactLink = link.AllocLC();

            HBufC8* convertedLink = NULL;

            if(contactLink)
                {
                convertedLink = HBufC8::NewLC(contactLink->Length());
                TPtr8 convertedLinkPtr = convertedLink->Des();
                convertedLinkPtr.Copy(*contactLink);
                }
            if( !convertedLink )
                {
                convertedLink = KNullDesC8().AllocLC();
                }

            if(convertedLink && userID && displayName)
                {
                iObserver.HandleServiceBuddyDetailsFetchedL( serviceId,*userID,*convertedLink,*displayName);

                IM_CV_LOGS(TXT("storage listener RunL userID = %S"),&(*userID) );
                IM_CV_LOGS(TXT("storage listener RunL convertedLink = %S"),&(*convertedLink) );
                IM_CV_LOGS(TXT("storage listener RunL displayName = %S"),&(*displayName) );

                }
            delete (servId_usrId_name_link);
            //delete all alocated memory
            if(convertedLink)
                {
                CleanupStack::PopAndDestroy(convertedLink);
                }
            if(contactLink)
                {
                CleanupStack::PopAndDestroy(contactLink);
                }
            if(displayName)
                {
                CleanupStack::PopAndDestroy(displayName);
                }
            if(userID)
                {
                CleanupStack::PopAndDestroy(userID);
                }
            }
        }
    if( iWait.IsStarted() )
          {
          // codescanner warning can be ignored, we are not starting an active object but 
          // this is CActiveSchedulerWait.
          iWait.AsyncStop();  
          }
    
    IM_CV_LOGS(TXT("CIMCVEngineStorageListener::RunL : end"));
    }

// ---------------------------------------------------------
// CIMCVEngineStorageListener::RunL()
// ---------------------------------------------------------
//
void CIMCVEngineStorageListener::DoCancel()
    {    
    iProperty.Cancel();
    }

// ---------------------------------------------------------
// CIMCVEngineStorageListener::StartListening()
// ---------------------------------------------------------
//
void CIMCVEngineStorageListener::StartListening()
    {
    if( !IsActive() )
        {
        iProperty.Subscribe(iStatus);
        SetActive(); // Tell scheduler a request is active  
        }
    }

// ---------------------------------------------------------
// CIMCVEngineStorageListener::StopListening()
// ---------------------------------------------------------
//
void CIMCVEngineStorageListener::StopListening()
    {
    if( IsActive() )
        {
        Cancel(); // Cancel any request, if outstanding
        }
    }

// ---------------------------------------------------------
// CIMCVEngineStorageListener::StopListening()
// ---------------------------------------------------------
//
TInt CIMCVEngineStorageListener::RunError( TInt aError )
    {
    IM_CV_LOGS(TXT("CIMCVEngineStorageListener::RunError : start"));
    IM_CV_LOGS(TXT("CIMCVEngineStorageListener::RunError : end"));
    if( iWait.IsStarted() )
         {
         // codescanner warning can be ignored, we are not starting an active object but 
         // this is CActiveSchedulerWait.
         iWait.AsyncStop();  
         }
    return aError;
    }

    		         
//  End of File