messagingfw/msgsrvnstore/mtmbase/src/MTUDBAS.CPP
changeset 0 8e480a14352b
child 44 7c176670643f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgsrvnstore/mtmbase/src/MTUDBAS.CPP	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,360 @@
+// Copyright (c) 1998-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:
+//
+
+// Standard includes
+#include <coemain.h>	// CCoeEnv
+#include <bautils.h>	// BaflUtils
+#include <fbs.h>
+#include "msvutils.h"
+ 
+// Specific includes
+#include "MTUDCBAS.H"
+#include "MTUDPAN.H"
+#include "MTUD.HRH"
+
+// Constants
+const TInt KBitmapArrayGranularity=		18;
+const TInt KFunctionArrayGranularity=	18;
+
+
+//
+// TMtmUiFunction - Function description class //
+//
+
+EXPORT_C CBaseMtmUiData::TMtmUiFunction::TMtmUiFunction(const TMtmUiFunction& aFunc)
+	:	iCaption(aFunc.iCaption), 
+		iPreferredHotKeyKeyCode(aFunc.iPreferredHotKeyKeyCode), 
+		iPreferredHotKeyModifiers(aFunc.iPreferredHotKeyModifiers), 
+		iFunctionId(aFunc.iFunctionId), 
+		iFunctionType(aFunc.iFunctionType),
+		iFlags(aFunc.iFlags)
+	/** Copy constructor.
+	
+	Creates a TMtmUiFunction by copying another TMtmUiFunction. Its action is the same as the 
+	default copy constructor, except that it will panic in debug builds if multiple 
+	location flags are set in aFunc.
+	@param aFunc TMtmUiFunction to copy 
+	*/
+	{
+	__ASSERT_DEBUG( // check that only one location flag is set
+		 (!!(iFlags&EMtudCommandTransferSend)
+		+ !!(iFlags&EMtudCommandTransferReceive)
+		+ !!(iFlags&EMtudCommandSendAs))==1,
+		Panic(EMtudMoreThanOneLocationInFuntionFlags));
+	}
+
+EXPORT_C CBaseMtmUiData::TMtmUiFunction::TMtmUiFunction(TResourceReader& aResourceReader)
+/** Creates a TMtmUiFunction with its values read from the resource file location 
+specified by TResourceReader. This position should be at a MTUD_FUNCTION resource.
+
+@param aResourceReader Position in UI Data MTM resource file to read operation 
+*/
+	{
+	iCaption=aResourceReader.ReadTPtrC();
+	iFunctionId=aResourceReader.ReadInt32();
+	TChar chr(aResourceReader.ReadUint32());
+	chr.LowerCase();
+	iPreferredHotKeyKeyCode=chr;
+	SetModifiersFromResourceDefinition(aResourceReader.ReadInt8());
+	iFlags=aResourceReader.ReadInt32();
+	iFunctionType=(TUint8)aResourceReader.ReadUint8();
+	}
+
+void CBaseMtmUiData::TMtmUiFunction::SetModifiersFromResourceDefinition(TInt aResourceFileModifiers)
+	{
+	iPreferredHotKeyModifiers=0;
+	if (aResourceFileModifiers & EMtudShift)
+		iPreferredHotKeyModifiers |= EModifierShift;
+	if (aResourceFileModifiers & EMtudCtrl)
+		iPreferredHotKeyModifiers |= EModifierCtrl;
+	}
+
+//
+// CBaseMtmUiCustomisation - MTM Ui customisation base API   //
+//
+
+EXPORT_C CBaseMtmUiData::~CBaseMtmUiData()
+/** Destructor.
+
+This cleans up the base class. CBaseMtmUiData-derived objects must be deleted by 
+client applications when they are no longer required. Clean up includes:
+
+1. cleaning up the iIconArrays and iMtmSpecificFunctions
+
+2. unloading the UI Data MTM resource file
+
+Derived classes can implement a destructor to do any additional clean up tasks 
+that they require. */
+	{
+	if (iIconArrays != NULL)
+		{
+		for (TInt bb=0; bb < iIconArrays->Count(); ++bb)
+			iIconArrays->At(bb)->ResetAndDestroy();
+		iIconArrays->ResetAndDestroy();
+		delete iIconArrays;
+		}
+
+	delete iMtmSpecificFunctions;
+	iCoeEnv->DeleteResourceFile(iResourceFileOffset);
+
+	iRegisteredMtmDll.ReleaseLibrary();
+	}
+
+EXPORT_C TUid CBaseMtmUiData::Type() const
+/** Gets the Type UID of the message type associated with the UI Data MTM.
+
+@return UID of the message type associated with the MTM */
+	{ 
+	return iRegisteredMtmDll.MtmTypeUid();
+	}
+
+EXPORT_C const CArrayFix<CBaseMtmUiData::TMtmUiFunction>& CBaseMtmUiData::MtmSpecificFunctions() const
+/** Gets an array of MTM-specific operations that can be carried out through the 
+associated User Interface MTM's CBaseMtmUi::InvokeSyncFunctionL()/InvokeAsyncFunctionL() 
+functions.
+
+It is intended that message client applications will use this function to 
+add dynamically user interface features, such as menu items, dependent on 
+the MTM type of the entry currently selected within the application. Message 
+client applications can also use OperationSupportedL() to check dynamically 
+if a particular operation is appropriate to a particular entry.
+
+Implementers should note that this function returns a pointer to the iMtmSpecificFunctions 
+data member.
+
+@return Array of operations relevant to the MTM and context. */
+	{ 
+	return *iMtmSpecificFunctions; 
+	}
+
+EXPORT_C TBool CBaseMtmUiData::FunctionRecognised(TInt aFunctionId) const
+/** Tests if an operation with the specified ID is recognised by the UI Data MTM.
+
+Implementers should note that this function searches the iMtmSpecificFunctions 
+array for the aFunctionId.
+
+@param aFunctionId The operation to check 
+@return ETrue: operation aFunctionId is supported by this UI Data MTM. EFalse: 
+operation aFunctionId is not supported by this UI Data MTM. */
+	{
+	TInt count=iMtmSpecificFunctions->Count();
+	for (TInt cc=0; cc < count ; ++cc)
+		{
+		if (iMtmSpecificFunctions->At(cc).iFunctionId==aFunctionId)
+			return ETrue;
+		}
+	return EFalse;
+	}
+
+//
+// CBaseMtmUiCustomisation - (protected methods)   //
+//
+
+EXPORT_C CBaseMtmUiData::CBaseMtmUiData(CRegisteredMtmDll& aRegisteredMtmDll)
+	:	iCoeEnv(CCoeEnv::Static()), iRegisteredMtmDll(aRegisteredMtmDll)
+/** Constructor.
+
+This creates a CBaseMtmUiData and initialises its private member variables. Client 
+applications do not use this function. It is relevant only to implementers 
+of derived classes.
+
+Derived classes can implement a constructor to perform any additional MTM-specific 
+setup that can be safely carried out in a constructor. Such constructors must 
+call the base class constructor function.
+
+@param aRegisteredMtmDll Registration data for the DLL. */
+	{
+	__DECLARE_NAME(_S("CBaseMtmUiData"));
+	}
+
+EXPORT_C void CBaseMtmUiData::ConstructL()
+/** Second-phase constructor.
+
+This implements two-phase construction functions (NewL(), ConstructL()) to create 
+a new instance of the object. Client applications do not use this function. 
+It is relevant only to implementers of derived classes.
+
+The function should perform any necessary dynamic allocation. ConstructL() 
+should be called from the NewL() function of the derived class.
+
+The default implementation of this function initiates the loading of required 
+resources: 
+
+1. instantiates objects for the iIconArrays and iMtmSpecificFunctions protected 
+members
+
+2. loads the UI Data MTM's resource file, as specified by GetResourceFileName()
+
+3. calls PopulateArraysL() so that the derived class can load resources
+
+Derived classes can implement this function to perform any additional MTM-specific 
+second stage construction tasks that they require. Implementations must call 
+the base class ConstructL() function.
+
+Concrete MTMs must also implement a factory function by which a MTM registry 
+can request an instance of the class: 
+
+@see MtmUiDataFactoryFunctionL */
+	{
+	iIconArrays = 
+		new(ELeave) CArrayPtrSeg<CBitmapArray>(KBitmapArrayGranularity);
+	iMtmSpecificFunctions = 
+		new(ELeave) CArrayFixFlat<TMtmUiFunction>(KFunctionArrayGranularity);
+
+	// Get resource file
+	TFileName resourceFileName;
+ 	GetResourceFileName(resourceFileName);
+	
+	MsvUtils::AddPathAndExtensionToResFileL(resourceFileName);
+ 
+	//Now look for the nearest filename--will search the system drive if specified
+	BaflUtils::NearestLanguageFile(iCoeEnv->FsSession(), resourceFileName);
+
+	TRAPD(err, iResourceFileOffset=iCoeEnv->AddResourceFileL(resourceFileName));
+	User::LeaveIfError(err);
+  
+	PopulateArraysL();
+	}
+
+/** Used by TCleaupItem in CreateBitmapsL.
+
+We check for NULL in case any funcs leave before the cleanup item
+is invoked.
+
+*/
+LOCAL_C void DeleteCBitMapArray(TAny* aPtr)
+	{
+	if (aPtr) 
+		{
+        CBaseMtmUiData::CBitmapArray* array=reinterpret_cast<CBaseMtmUiData::CBitmapArray*>(aPtr);	
+		array->ResetAndDestroy();
+		delete array;
+		}
+	}
+
+EXPORT_C void CBaseMtmUiData::CreateBitmapsL(TInt aNumZoomStates, const TDesC& aBitmapFile, TInt aStartBitmap, TInt aEndBitmap)
+/** Fills the iIconArrays array with icon bitmaps from an mbm file. 
+
+Client applications do not use this function. It is relevant only to implementers of derived classes.
+
+The bitmaps to load must be contiguous within the file between the positions 
+indicated by aStartBitmap and aEndBitmap.
+
+The function is typically called from PopulateArraysL().
+
+@param aNumZoomStates Number of zoom states for each icon. This is used as 
+the array size of each element in iIconArrays. 
+@param aBitmapFile Filename of .mbm format bitmap array file. 
+@param aStartBitmap First bitmap within the file for this MTM. 
+@param aEndBitmap Final bitmap within the file for this MTM. */
+	{
+	__ASSERT_DEBUG((aStartBitmap+aEndBitmap+1)%aNumZoomStates==0, Panic(EMtudIncorrectBitmapNumbers));
+	TFileName fileName(aBitmapFile);
+	_LIT(KMtmUiDataFileLocationV2, "z:\\resource\\messaging\\");
+	TFindFile finder(iCoeEnv->FsSession());
+	// V2
+	User::LeaveIfError(finder.FindByDir(fileName, KMtmUiDataFileLocationV2));
+	fileName = finder.File();
+
+	BaflUtils::NearestLanguageFile(iCoeEnv->FsSession(), fileName);
+
+	CBitmapArray* array=NULL;
+	for (TInt bb=aStartBitmap; bb <= aEndBitmap; bb+=aNumZoomStates)
+		{
+		array=new(ELeave) CArrayPtrFlat<CFbsBitmap>(aNumZoomStates);
+		CleanupStack::PushL(TCleanupItem(DeleteCBitMapArray, array));
+		TInt cc=0;
+		for (; cc < aNumZoomStates; ++cc)
+			{
+			CFbsBitmap* bmp=CreateBitmapL(fileName, bb+cc);
+			CleanupStack::PushL(bmp);
+			// warning: bmp is deleted by the array CleanupItem. Immediately Pop or risk double deletion upon a Leave.
+			array->AppendL(bmp);
+			CleanupStack::Pop(bmp); 
+			}
+		iIconArrays->AppendL(array);
+		CleanupStack::Pop(array);
+		}
+	}
+
+CFbsBitmap* CBaseMtmUiData::CreateBitmapL(const TDesC& aFileName, TInt aId) const
+	{
+    CWsBitmap* bitmap=new(ELeave) CWsBitmap(iCoeEnv->WsSession());
+	TInt err=bitmap->Load(aFileName,aId);
+	if (err)
+		{
+		delete(bitmap);
+		User::Leave(err);
+		}
+	bitmap->SetSizeInTwips(iCoeEnv->ScreenDevice());
+	return bitmap;
+	}
+
+EXPORT_C void CBaseMtmUiData::ReadFunctionsFromResourceFileL(TInt aResourceId)
+/** Fills the iMtmSpecificFunctions array with MTM-specific operation definitions 
+from the UI Data MTM's resource file. 
+
+Client applications do not use this function. It is relevant only to 
+implementers of derived classes.
+
+For each MTM-specific operation definition in the resource file, it adds a 
+corresponding TMtmUiFunction object to iMtmSpecificFunctions. 
+
+The function is typically called from PopulateArraysL().
+
+@param aResourceId Resource ID of MTM-specific operation definition array */
+	{
+	TResourceReader reader;
+	iCoeEnv->CreateResourceReaderLC(reader, aResourceId);
+	const TInt functionCount=reader.ReadInt16();
+	for (TInt cc=0; cc < functionCount; ++cc)
+		{
+		TMtmUiFunction func(reader);
+		iMtmSpecificFunctions->AppendL(func);
+		}
+	CleanupStack::PopAndDestroy();// reader
+	}
+
+EXPORT_C TBool CBaseMtmUiData::CanUnDeleteFromEntryL(const TMsvEntry& /*aContext*/, TInt& aReasonResourceId) const
+/** Tests if the entry can be undeleted.
+
+@return	KErrNone: the operation is appropriate on the entry. KErrNotSupported: 
+the operation is not appropriate on the entry. 		
+@param aContext The entry to which the operation applies. 
+@param aReasonResourceId On return, a resource string ID or 0. 
+*/
+	{
+	aReasonResourceId=0;
+	return EFalse;
+	}
+
+/**
+Returns a pointer to the interface with the specified Uid.
+
+This method is the first part of an extension pattern to allow for 
+more functionality to be supported without adding virtual methods 
+to this base class.
+
+The default implementation returns a NULL pointer.
+ 
+@param	aUid  
+Uid of the extension interface
+@return
+Pointer to the extension interface
+*/
+EXPORT_C TAny* CBaseMtmUiData::GetInterface(TUid /*aUid*/)
+ 	{
+	return NULL;
+ 	}