wvuing/ImUtils/Src/IMUtils.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/ImUtils/Src/IMUtils.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,598 @@
+/*
+* Copyright (c) 2006 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:  General utility class
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "IMUtils.h"
+#include    "CAExternalInterface.h"
+#include    "chatdefinitions.h"
+#include    "ChatDebugPrint.h"
+#include    "CAUtils.h"
+#include    "IMPrivateCRKeys.h"
+
+#include    "CCAWaitNote.h"
+#include    "IMDialogUtils.h"
+#include    <ChatNG.rsg>
+#include    <hlplch.h>
+#include    <csxhelp/imng.hlp.hrh>
+#include    <eikmenup.h>
+
+#include    <PEngWVPresenceErrors2.h>   // wv error codes
+#include    <IMPSServiceSettingsUINGInternalCRKeys.h>
+#include    <CentralRepository.h>
+#include    <barsread.h>
+#include    <gulutil.h>
+#include    <gulicon.h>
+#include	<StringLoader.h>
+#include    <sysutil.h>
+#include    <caf/content.h>
+#include    <caf/manager.h>
+#include    <oma2agent.h>
+#include    <collate.h>
+#include	"PublicEngineDefinitions.h"
+
+////401-1815 Ease of Instant Messaging branding
+//Code added for the above requirment
+#include 	"VariantKeys.h"
+#include 	<CAVariationNG.rsg>
+
+
+
+// LOCAL CONSTANTS AND MACROS
+_LIT( KPanicCategory, "IMUtilsNG" );
+
+
+#define 	KLibNotInitialized		KErrBadLibraryEntryPoint
+//End of code for CR 401-1815
+
+
+// ---------------------------------------------------------
+// IMUtils::PopulateFormattedOnlineListL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void IMUtils::PopulateFormattedOnlineListL( const MDesCArray& aRawOnlineList,
+                                                     CDesCArray& aFormattedOnlineList )
+    {
+    // Add formatted data to second list
+    const TInt onlineCount( aRawOnlineList.MdcaCount() );
+    HBufC* formattedWVID = HBufC::NewLC( KWVUserIDMaxLength + KIconTabulator().Size() );
+    TPtr formattedWVIDPtr( formattedWVID->Des() );
+
+    for ( TInt i( 0 ); i < onlineCount; ++i )
+        {
+        formattedWVIDPtr.Append( KIconTabulator );
+        formattedWVIDPtr.Append( aRawOnlineList.MdcaPoint( i ) );
+        aFormattedOnlineList.AppendL( *formattedWVID );
+        formattedWVIDPtr.Zero();
+        }
+
+    CleanupStack::PopAndDestroy( formattedWVID );
+    }
+
+// ---------------------------------------------------------
+// IMUtils::LaunchHelpL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void IMUtils::LaunchHelpL( const TDesC& aContext )
+    {
+    //make context array
+    //granurality 1 is ok cos there is added just one item
+    CArrayFix< TCoeHelpContext >* cntx = new( ELeave ) CArrayFixFlat< TCoeHelpContext >( 1 );
+    CleanupStack::PushL( cntx );
+
+    cntx->AppendL( TCoeHelpContext( KUidChatClient, aContext ) );
+    CleanupStack::Pop( cntx );
+
+    //and launch help - takes ownership of context array
+    HlpLauncher::LaunchHelpApplicationL( CEikonEnv::Static()->WsSession(), cntx );
+    }
+
+// ---------------------------------------------------------
+// IMUtils::WVSettingsChatLoginValue()
+// (other items were commented in a header).
+// Central Repository version
+// ---------------------------------------------------------
+//
+EXPORT_C TInt IMUtils::WVSettingsChatLoginValue( )
+    {
+    CHAT_DP( D_CHAT_LIT( "CCAUISessionManager::LoginType" ) );
+
+    TInt readValue( KErrCouldNotConnect ); // initialize to an error value
+
+    // get the login type from central repository
+    CRepository* repository = NULL;
+    TRAPD( err, repository = CRepository::NewL( KWVSettingsCenRepUid ) );
+
+    if ( err )
+        {
+        // problems, return the error
+        return err;
+        }
+
+    err = repository->Get( KIMPSCRChatLogin, readValue );
+
+    delete repository;
+
+    if ( err != KErrNone )
+        {
+        // there was an error
+        return err;
+        }
+
+    return readValue;
+    }
+
+// ---------------------------------------------------------
+// IMUtils::NeutralFind
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt IMUtils::NeutralFind( const MDesCArray& aUserList, const TDesC& aUserId )
+    {
+    TInt count( aUserList.MdcaCount() );
+    for ( TInt i( 0 ); i < count; ++i )
+        {
+        if ( CAUtils::NeutralCompare( aUserList.MdcaPoint( i ),
+                                      aUserId ) == 0 )
+            {
+            return i;
+            }
+        }
+    return KErrNotFound;
+    }
+
+// ---------------------------------------------------------
+// IMUtils::IntResourceValueL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt IMUtils::IntResourceValueL( TInt aResourceId )
+    {
+
+    TInt val( 0 );
+    TInt err ( KErrNone );
+    ////401-1815 Ease of Instant Messaging branding
+    //Code added for the above requirment
+
+    //get the exact cenrep id for the aResourceId
+    TInt key = aResourceId + KIMStartVariationID;
+
+    err = TlsData()->RepositoryInstance().Get( key, val );
+
+    if ( err != KErrNone )
+        {
+        val = IntResourceValueFromRssL( RSC_CRRSS_CHAT_VARIATION_START_ID + aResourceId );
+        }
+    // end of code for 401-1815 Ease of Instant Messaging Branding.
+    return val;
+    }
+
+
+
+////401-1815 Ease of Instant Messaging branding
+//Code added for the above requirment
+// ---------------------------------------------------------
+// IMUtils::IntResourceValueFromRssL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt IMUtils::IntResourceValueFromRssL( TInt aResourceId )
+    {
+
+    TInt val( 0 );
+
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC( reader, aResourceId );
+
+    val = ResourceUtils::ReadTInt32L( reader );
+    CleanupStack::PopAndDestroy(); // reader
+
+    return val;
+    }
+// end of code for 401-1815 Ease of Instant Messaging Branding.
+
+
+// ---------------------------------------------------------
+// IMUtils::MaxMsgLength
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TInt IMUtils::MaxMsgLength()
+    {
+    TInt maxLength( 0 );
+    TRAPD( err, maxLength = IntResourceValueL( RSC_CHAT_VARIATION_MESSAGE_MAX_LENGTH ) );
+    if ( err != KErrNone )
+        {
+        CActiveScheduler::Current()->Error( err );
+        }
+    if ( maxLength <= 0 )
+        {
+        // if the resource value was invalid, assign default value
+        maxLength = KDefaultMsgLength;
+        }
+
+    return maxLength;
+    }
+
+
+// ---------------------------------------------------------
+// IMUtils::GetCRKeyL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TUint32 IMUtils::CRKeyL( TUid aUid, TUint32 aKey )
+    {
+    TInt val( 0 );
+
+    TRAPD( err,
+           CRepository* rep = CRepository::NewL( aUid );
+           rep->Get( aKey, val );
+           delete rep;
+         );
+
+    if ( err != KErrNotFound && err != KErrPathNotFound )
+        {
+        // "Not found" errors are ignored, because it's ok to
+        // return zero if key is not found
+        User::LeaveIfError( err );
+        }
+
+    return val;
+    }
+
+
+// ---------------------------------------------------------
+// IMUtils::AddMenuItemL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C void IMUtils::AddMenuItemL( TBool aAdd, CEikMenuPane& aMenuPane, TInt aTextResourceId,
+                                     TInt aCommandId, TInt aCascadeId /*= 0*/ )
+    {
+    if ( aAdd )
+        {
+        HBufC* text = CCoeEnv::Static()->AllocReadResourceLC( aTextResourceId );
+
+        CEikMenuPaneItem::SData data;
+        data.iCommandId = aCommandId;
+        data.iCascadeId = aCascadeId;
+        data.iFlags = 0;
+        data.iText.Copy( text->Des().Left( CEikMenuPaneItem::SData::ENominalTextLength ) );
+        data.iExtraText.Zero();
+        aMenuPane.AddMenuItemL( data );
+
+        CleanupStack::PopAndDestroy( text );
+        }
+    }
+
+// ---------------------------------------------------------
+// IMUtils::SetIcon
+// ---------------------------------------------------------
+//
+EXPORT_C void IMUtils::SetIcon( CGulIcon& aTarget, CGulIcon& aSource )
+    {
+    aTarget.SetBitmap( aSource.Bitmap() );
+    aTarget.SetMask( aSource.Mask() );
+    aTarget.SetBitmapsOwnedExternally( aSource.BitmapsOwnedExternally() );
+    if ( !aSource.BitmapsOwnedExternally() )
+        {
+        aSource.SetBitmapsOwnedExternally( ETrue );
+        }
+    }
+
+// ---------------------------------------------------------
+// IMUtils::UpdateIcon
+// ---------------------------------------------------------
+//
+EXPORT_C void IMUtils::UpdateIcon( CGulIcon*& aTarget, CGulIcon* aSource )
+    {
+    if ( aTarget )
+        {
+        IMUtils::SetIcon( *aTarget, *aSource );
+        CleanupStack::PopAndDestroy();
+        }
+    else
+        {
+        aTarget = aSource;
+        CleanupStack::Pop();
+        }
+
+    }
+// ---------------------------------------------------------
+// IMUtils::IgnoreOfflineStatusL()
+// ---------------------------------------------------------
+//
+EXPORT_C TInt IMUtils::IgnoreOfflineStatusL( const TDesC& aContactIdentification )
+    {
+    // These flags cannot be enabled simultaneously (UI spec.)
+    TInt ignoreOffline = IntResourceValueL(
+                             RSC_CHAT_VARIATION_SEND_MSG_IGNORE_OFFLINE );
+    TInt ignoreOfflineNotify = IntResourceValueL(
+                                   RSC_CHAT_VARIATION_SEND_MSG_IGNORE_OFFLINE_NOTIFY );
+
+    // If RSC_CHAT_VARIATION_SEND_MSG_IGNORE_OFFLINE flag is set
+    // offline state is ignored without any notifications
+    TInt result = EAknSoftkeyOk;
+
+    if ( !ignoreOffline )
+        {
+        if ( ignoreOfflineNotify )
+            {
+            // Show note about offline contact
+            HBufC* msg = StringLoader::LoadLC(
+                             R_QTN_CHAT_CONTACT_MAY_NOT_RECEIVE_MESSAGE,
+                             aContactIdentification );
+
+            result = IMDialogUtils::DisplayQueryDialogL(
+                         R_CHAT_CONTACT_MAY_NOT_RECEIVE_MESSAGE_DIALOG,
+                         msg->Des() );
+            CleanupStack::PopAndDestroy( msg );
+            }
+        else
+            {
+            // Logged in and contact not online,
+            // ignorance of offline state disabled
+            IMDialogUtils::DisplayInformationNoteL(
+                R_QTN_CHAT_FRIEND_OFFLINE );
+            result = EVariationDoesNotAllow;
+            }
+        }
+
+    if ( result == EAknSoftkeyOk )
+        {
+        return EIgnoredByUser;
+        }
+    else if ( result == 0 ) // Dialog returns 0 if cancelled by user
+        {
+        return EUserCanceled;
+        }
+    else
+        {
+        return result;
+        }
+    }
+
+// ---------------------------------------------------------
+// IMUtils::FFSSpaceBelowCriticalLevelL()
+// ---------------------------------------------------------
+//
+EXPORT_C void IMUtils::FFSSpaceBelowCriticalLevelL( TInt aRequestedSpace /*= 0*/
+                                                    , TBool
+#ifdef _DEBUG
+                                                    aEmulateMemOut /*= EFalse*/
+#endif // _DEBUG
+                                                  )
+    {
+#ifdef _DEBUG
+    if ( aEmulateMemOut )
+        {
+        User::Leave( KErrDiskFull );
+        }
+#endif // _DEBUG
+
+    // Check disk space
+    if ( SysUtil::FFSSpaceBelowCriticalLevelL(
+             &CEikonEnv::Static()->FsSession(), aRequestedSpace ) )
+        {
+        User::Leave( KErrDiskFull );
+        }
+    }
+
+// ---------------------------------------------------------
+// IMUtils::FileProtectedL()
+// ---------------------------------------------------------
+//
+EXPORT_C TBool IMUtils::FileProtectedL( const TFileName& aFileName )
+    {
+    TInt value( 0 );
+    ContentAccess::CContent* content = ContentAccess::CContent::NewL( aFileName );
+    TInt err( content->GetAttribute( ContentAccess::EIsProtected, value ) );
+    delete content;
+
+    return( err == KErrNone && value );
+    }
+
+// ---------------------------------------------------------
+// IMUtils::ContentProtectedL()
+// ---------------------------------------------------------
+//
+EXPORT_C TBool IMUtils::ContentProtectedL( const TDesC8& aContent )
+    {
+    // Note that if this method is needed often, the list
+    // of agents should be cached!
+
+    RArray<ContentAccess::TAgent> agents;
+    CleanupClosePushL( agents );
+    ContentAccess::TAgent agentDRM;
+
+    // get the list of agents
+    ContentAccess::CManager* manager = ContentAccess::CManager::NewLC();
+    manager->ListAgentsL( agents );
+
+    // find the DRM agent
+    TInt count( agents.Count() );
+    for ( TInt i( 0 ); i < count; ++i )
+        {
+        if ( agents[i].Name().Compare( KOmaDrm2AgentName ) == 0 )
+            {
+            agentDRM = agents[i];
+            break;
+            }
+        }
+
+    HBufC8* empty = HBufC8::NewLC( 1 );
+    TPtr8 output( empty->Des() );
+
+    // execute agent specific command for OMA2 agent
+    TInt ret( manager->AgentSpecificCommand( agentDRM, ContentAccess::EBufferContainsOma1Dcf,
+                                             aContent, output ) );
+
+    CleanupStack::PopAndDestroy( 3 ); // empty, manager, agents.Close()
+    return ( ret != KErrNotFound );
+    }
+
+// ---------------------------------------------------------
+// IMUtils::CombineStringFromResourceLC()
+// See header for details.
+// ---------------------------------------------------------
+//
+EXPORT_C HBufC* IMUtils::CombineStringFromResourceLC( TInt aResourceId1, TInt aResourceId2 )
+    {
+    // empty texts
+    _LIT ( KPSUIEmptyStringHeader, "%S\n%S" );
+    HBufC* emptyText = CCoeEnv::Static()->AllocReadResourceLC(
+                           aResourceId1 );
+
+    HBufC* emptyText2 = CCoeEnv::Static()->AllocReadResourceLC(
+                            aResourceId2 );
+
+    HBufC* emptyFinal = HBufC::NewLC(
+                            emptyText->Length() + emptyText2->Length() + 2 );// 2 is length of "\n"
+
+    CleanupStack::Pop( emptyFinal );
+
+    emptyFinal->Des().Format( KPSUIEmptyStringHeader, emptyText, emptyText2 );
+
+    CleanupStack::PopAndDestroy( 2 );// emptyText, emptyText2
+
+    CleanupStack::PushL( emptyFinal );
+
+    return emptyFinal;
+
+    }
+
+
+
+////401-1815 Ease of Instant Messaging branding
+//Code added for the above requirment
+// ---------------------------------------------------------
+// IMUtils::InitializeLibL()
+// See header for details.
+// ---------------------------------------------------------
+//
+EXPORT_C void IMUtils::InitializeLibL()
+    {
+    if ( !Dll::Tls() )
+        {
+        Dll::SetTls( CIMUtilsTlsData::NewL() );
+        }
+
+    }
+
+
+// ---------------------------------------------------------
+// IMUtils::UnInitializeLib()
+// See header for details.
+// ---------------------------------------------------------
+//
+EXPORT_C void IMUtils::UnInitializeLib()
+    {
+    if ( Dll::Tls() )
+        {
+        CIMUtilsTlsData* tlsData = TlsData();
+
+        if ( TlsData() )
+            {
+            delete tlsData;
+            Dll::SetTls( NULL );
+            }
+        }
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// IMUtils::TlsData()
+// -----------------------------------------------------------------------------
+//
+CIMUtilsTlsData* IMUtils::TlsData()
+    {
+    CIMUtilsTlsData* tlsData = STATIC_CAST( CIMUtilsTlsData*, Dll::Tls() );
+
+    __ASSERT_ALWAYS( tlsData,
+                     User::Panic( KPanicCategory, KLibNotInitialized ) );
+
+    return tlsData;
+    }
+
+
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CIMUtilsTlsData::CIMUtilsTlsData
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CIMUtilsTlsData::CIMUtilsTlsData()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CIMUtilsTlsData::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CIMUtilsTlsData::ConstructL()
+    {
+    iRepository = CRepository::NewL( KCRUidIMNG );
+    }
+
+// -----------------------------------------------------------------------------
+// CIMUtilsTlsData::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CIMUtilsTlsData* CIMUtilsTlsData::NewL()
+    {
+    CIMUtilsTlsData* self = new( ELeave ) CIMUtilsTlsData;
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+
+// Destructor
+CIMUtilsTlsData::~CIMUtilsTlsData()
+    {
+    delete 	iRepository;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CIMUtilsTlsData::RepositoryInstance
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+
+CRepository& CIMUtilsTlsData::RepositoryInstance()
+    {
+    return *iRepository;
+    }
+
+//// End of code for 401-1815 Ease of Instant Messaging brand
+
+//  End of File