diff -r cad71a31b7fc -r e36f3802f733 srsf/vcommandhandler/src/vcfolderinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srsf/vcommandhandler/src/vcfolderinfo.cpp Wed Sep 01 12:29:17 2010 +0100 @@ -0,0 +1,259 @@ +/* +* 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: Implementation of the CVFolderInfo class +* +*/ + + +#include +#include +#include +#include +#include +#include +#include "rubydebug.h" + +/** + * File name to read icons from if icon file name is not specified + */ +_LIT( KDefaultIconFile, "Z:\\resource\\apps\\vcommand.mif" ); +const TInt KDefaultIconIndex = KMifIdFirst; // first image in the file + +/** +* The version of the streamed data protocol +* It is rather likely, that the format of the data streamed changes in the future. +* Using the protocol version, the code can check if it knows how to parse the +* input stream +*/ +const TInt32 KVCFolderInfoProtocolVersion = 2; + +static const TAknsItemID* const KIconId[] = + { + &KAknsIIDQgnPropFolderVcGeneral, + &KAknsIIDQgnPropFolderVcTools, + &KAknsIIDQgnPropFolderVcOrganiser, + &KAknsIIDQgnPropFolderVcMessage, + &KAknsIIDQgnPropFolderVcMedia, + &KAknsIIDQgnPropFolderVcProfiles + }; + +/** + * This object does not take an ownership of the passed descriptors, + * but makes own copies. + * + * @param aTitle Folder title. It is shown at the top of the screen, + * when the folder is opened in the VCommand application + * @param aListedName Version of a title shown when the folder is + * is displayed in the list of VCommands in the VCommand app + * @param aHelpTopicId Topic to open when help is requested for the + * given folder + * @param aIconIndex Index of the folder icon in the folder icons mbm file + * each index correspods to two images - the actual icon and its mask + * @param aIconFile Mbm file where the icons are obtained from. If KNullDesC, + * the default icon file is used + */ +EXPORT_C CVCFolderInfo* CVCFolderInfo::NewL( const TDesC& aTitle, + const TDesC& aListedName, TUint32 aHelpTopicId, TUint aIconIndex, + const TDesC& aIconFile ) + { + CVCFolderInfo* self = new (ELeave) CVCFolderInfo( aHelpTopicId, aIconIndex ); + CleanupStack::PushL( self ); + self->ConstructL( aTitle, aListedName, aIconFile ); + CleanupStack::Pop( self ); + return self; + } + +/** +* Copy the existing CVCFolderInfo +*/ +EXPORT_C CVCFolderInfo* CVCFolderInfo::NewL( const CVCFolderInfo& aOriginal ) + { + CVCFolderInfo* self = new (ELeave) CVCFolderInfo( aOriginal.HelpTopicId(), + aOriginal.IconIndex() ); + CleanupStack::PushL( self ); + self->ConstructL( aOriginal.Title(), aOriginal.ListedName(), aOriginal.IconFile() ); + CleanupStack::Pop( self ); + return self; + } + +/** + * Constructs the folder information from stream + * @leave KErrNotSupported if the stream data format is unsupported + */ + EXPORT_C CVCFolderInfo* CVCFolderInfo::NewL( RReadStream &aStream ) + { + CVCFolderInfo* self = new (ELeave) CVCFolderInfo; + CleanupStack::PushL( self ); + self->ConstructL( aStream ); + CleanupStack::Pop( self ); + return self; + } + +CVCFolderInfo::CVCFolderInfo( TUint32 aHelpTopicId, TUint aIconIndex ) : + iHelpTopicId( aHelpTopicId ), iIconIndex (aIconIndex ) + { + // empty + } + +void CVCFolderInfo::ConstructL( RReadStream &aStream ) + { + /** + * @todo extract the repeated descriptor internalization code into + * a separate method + */ + TInt32 ver; + aStream >> ver; + __ASSERT_ALWAYS( ver == KVCFolderInfoProtocolVersion, User::Leave( KErrNotSupported ) ); + iTitle = HBufC::NewL( aStream.ReadInt32L() ); + TPtr pTitle = iTitle->Des(); + aStream >> pTitle; + iListedName = HBufC::NewL( aStream.ReadInt32L() ); + TPtr pListedName = iListedName->Des(); + aStream >> pListedName; + iHelpTopicId = aStream.ReadUint32L(); + iIconFile = HBufC::NewL( aStream.ReadInt32L() ); + TPtr pIconFile = iIconFile->Des(); + aStream >> pIconFile; + iIconIndex = aStream.ReadUint32L(); + } + + +/** +* Second-phase constructor +*/ +void CVCFolderInfo::ConstructL( const TDesC& aTitle, const TDesC& aListedName, + const TDesC& aIconFile ) + { + RUBY_DEBUG_BLOCKL( "" ); + iTitle = HBufC::NewL( aTitle.Length() ); + *iTitle = aTitle; + iListedName = HBufC::NewL( aListedName.Length() ); + *iListedName = aListedName; + iIconFile = HBufC::NewL( aIconFile.Length() ); + *iIconFile = aIconFile; + } + +EXPORT_C CVCFolderInfo::~CVCFolderInfo() + { + delete iListedName; + delete iTitle; + delete iIconFile; + } + +/** + * Saves the command to stream. + * Descriptor components are saved as pairs, where + * is TInt32 and is the default descriptor represetation + * TBools are saved as TInt32 either + */ +EXPORT_C void CVCFolderInfo::ExternalizeL( RWriteStream &aStream ) const + { + aStream << KVCFolderInfoProtocolVersion; + aStream << static_cast( iTitle->Length() ); + aStream << *iTitle; + aStream << static_cast( iListedName->Length() ); + aStream << *iListedName; + aStream << iHelpTopicId; + aStream << static_cast ( iIconFile->Length() ); + aStream << *iIconFile; + // Mandate saving index as Uint32 to preserve the string format + aStream << static_cast ( iIconIndex ); + } + + +EXPORT_C const TDesC& CVCFolderInfo::Title() const + { + return *iTitle; + } + +EXPORT_C const TDesC& CVCFolderInfo::ListedName() const + { + return *iListedName; + } + +EXPORT_C TUint32 CVCFolderInfo::HelpTopicId() const + { + return iHelpTopicId; + } + +EXPORT_C TBool CVCFolderInfo::operator==( const CVCFolderInfo& aFolderInfo ) const + { + return ( + ( iHelpTopicId == aFolderInfo.HelpTopicId() ) && + ( *iTitle == aFolderInfo.Title() ) && + ( *iListedName == aFolderInfo.ListedName() ) && + ( *iIconFile == aFolderInfo.IconFile() ) && + ( iIconIndex == aFolderInfo.IconIndex() ) + ); + } + +EXPORT_C TDesC& CVCFolderInfo::IconFile() const + { + return *iIconFile; + } + +EXPORT_C TUint CVCFolderInfo::IconIndex() const + { + return iIconIndex; + } + +/** +* Creates an icon to represent this folder. Works only if CEikonEnv is available +* @return Icon for the folder +*/ +EXPORT_C CGulIcon* CVCFolderInfo::IconLC() const + { + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + const TInt KBitmapsPerIcon = 2; + + // Every "index" corrsponds to two bitmaps - actual icon and its mask + TInt iconIndex = KMifIdFirst + IconIndex()*KBitmapsPerIcon; + TInt maskIndex = iconIndex + 1; + TDesC& iconFile = IconFile(); + if ( iconFile == KNullDesC ) + { + iconFile = KDefaultIconFile; + } + + TRAPD( err, + AknsUtils::CreateIconLC( skin, *KIconId[ IconIndex() ], + bitmap, mask, iconFile, iconIndex, + maskIndex ); + CleanupStack::Pop( 2 ); // mask, bitmap + ) + if( err != KErrNone ) + { + RUBY_DEBUG1( "CreateIconLC failed with %d. Loading default icon", err ); + AknsUtils::CreateIconLC( skin, *KIconId[ IconIndex() ], + bitmap, mask, KDefaultIconFile, KDefaultIconIndex, + KDefaultIconIndex + 1 ); + CleanupStack::Pop( 2 ); // mask, bitmap + } + + CleanupStack::PushL( mask ); + CleanupStack::PushL( bitmap ); + CGulIcon* icon = CGulIcon::NewL( bitmap, mask ); + icon->SetBitmapsOwnedExternally( EFalse ); + + // icon now owns the bitmaps, no need to keep on cleanup stack. + CleanupStack::Pop( bitmap ); + CleanupStack::Pop( mask ); + + CleanupStack::PushL( icon ); + return icon; + } + +//End of file