diff -r 000000000000 -r 094583676ce7 wvuing/ImUtils/Src/IMUtils.cpp --- /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 +#include +#include +#include + +#include // wv error codes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "PublicEngineDefinitions.h" + +////401-1815 Ease of Instant Messaging branding +//Code added for the above requirment +#include "VariantKeys.h" +#include + + + +// 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 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