messagingfw/biomsgfw/BIOCSRC/BIOCMTM.CPP
changeset 0 8e480a14352b
child 44 7c176670643f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/biomsgfw/BIOCSRC/BIOCMTM.CPP	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,413 @@
+// 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:
+// BIOCMTM.CPP
+//
+
+#include "BIOCMTM.H"
+#include "BIOSCMDS.H"
+
+#include <biouids.h>
+#include <f32file.h>
+#include "regpsdll.h"   // Parser Registry - used to load the parser
+#include <biodb.h>
+#include "BIOOP.H"
+#include <msvstd.h>
+
+#include <mtmuids.h>
+#include <msvreg.h>
+#include <mtmdef.h>
+#include <msvftext.h>
+
+#include <txtrich.h>
+#include <txtfmlyr.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS 
+#include "tmsvbioinfo.h"
+#include <biomessageuids.h>
+#include <bifchangeobserver.h>
+#include <mtmuidsdef.hrh>
+#endif
+
+#include <msvenhancesearchsortutil.h>
+
+
+EXPORT_C CBIOClientMtm* CBIOClientMtm::NewL(CRegisteredMtmDll& aRegisteredMtmDll, CMsvSession& aSession)
+/** Allocates and constructs a new BIO client MTM object.
+
+@param aRegisteredMtmDll Registration data for the MTM DLL
+@param aSession The CMsvSession of the client requesting the object
+@return New BIO client MTM object */
+	{
+	CBIOClientMtm* self=new(ELeave) CBIOClientMtm(aRegisteredMtmDll, aSession);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CBIOClientMtm::~CBIOClientMtm()
+/** Destructor. */
+	{
+	delete iBioDatabase;
+	iFs.Close();
+	}
+
+void CBIOClientMtm::ConstructL()
+	{
+	User::LeaveIfError(iFs.Connect());
+	// construct a Bio database
+	iBioDatabase = CBIODatabase::NewL(iFs);
+	}
+
+void CBIOClientMtm::HandleEntryEvent(TMsvEntryEvent /*aEvent*/, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/)
+/** Does nothing.
+
+@param aEvent Unused
+@param aArg1 Unused
+@param aArg2 Unused
+@param aArg3 Unused */
+	{
+	}
+
+void CBIOClientMtm::SaveMessageL()
+/** Commits cached changes to the current context's body text to storage. */
+	{
+	CMsvStore* store = iMsvEntry->EditStoreL();
+	CleanupStack::PushL(store);
+	StoreBodyL(*store);
+	store->CommitL();
+	CleanupStack::PopAndDestroy();
+	}
+
+void CBIOClientMtm::LoadMessageL()
+/** Loads the current context's message body from storage. */
+	{
+	CMsvStore* store = iMsvEntry->ReadStoreL();
+	CleanupStack::PushL(store);
+	
+
+	// Get a reference to TMsvEnhanceSearchSortUtil  instance set by CMsvSearchsortOpOnHeaderBody class
+	// If advanced search and sort is being performed than do not load the body here
+	// For API's other than CMsvSearchsortOpOnHeaderBody-> FindInHeaderBodyL(), a call to LoadMessageL()
+	// loads the body.
+	TMsvEnhanceSearchSortUtil* searchsortutil = (TMsvEnhanceSearchSortUtil*)(GetExtensionData());
+	
+	
+	if ( searchsortutil == NULL )
+		{
+		if (store->HasBodyTextL())
+			{
+			RestoreBodyL(*store);
+			}
+		}
+			
+	CleanupStack::PopAndDestroy();
+	}
+
+CMsvOperation* CBIOClientMtm::ReplyL  (TMsvId /*aDestination*/, TMsvPartList /*aPartlist*/, TRequestStatus& /*aCompletionStatus*/)
+/** Leaves with KErrNotSupported.
+
+@param aDestination Unused
+@param aPartlist Unused
+@param aCompletionStatus Unused
+@return Unused */
+	{
+	User::Leave(KErrNotSupported);
+	return NULL;
+	}
+
+CMsvOperation* CBIOClientMtm::ForwardL(TMsvId /*aDestination*/, TMsvPartList /*aPartList*/, TRequestStatus& /*aCompletionStatus*/)
+/** Leaves with KErrNotSupported.
+
+@param aDestination Unused
+@param aPartList Unused
+@param aCompletionStatus Unused
+@return Unused */
+	{
+	User::Leave(KErrNotSupported);
+	return NULL;
+	}
+
+TMsvPartList CBIOClientMtm::ValidateMessage(TMsvPartList /*aPartList*/)
+/** Does nothing.
+
+@param aPartList Unused
+@return Always 0 */
+	{
+	return 0;
+	}
+
+TMsvPartList CBIOClientMtm::Find(const TDesC& aTextToFind, TMsvPartList aPartList)
+/** Searches the specified message part(s) for the plain-text version of the text 
+to be found.
+
+Supported messages parts are KMsvMessagePartBody, KMsvMessagePartOriginator, 
+and KMsvMessagePartDescription.
+
+@param aTextToFind The plain-text version of the text to be found. 
+@param aPartList Indicates the message parts which should be searched. 
+@return 0, if the text was not found, or searching is unsupported. If the text 
+was found, a bitmask of the TMsvPartList IDs for each part in which the text 
+was present. */
+	{
+	TMsvPartList retList=KMsvMessagePartNone;
+	
+  	// Enhance search and sort
+  	// The setting variables are accessed by getting an instance to TMsvEnhanceSearchSortUtil  class
+  	// This is accessed here by using GetExtensionData() defined in CBaseMtm which refers 
+  	// to iExtensionData member variable
+  	
+ 	TMsvEnhanceSearchSortUtil* searchsortutil = (TMsvEnhanceSearchSortUtil*)(GetExtensionData());
+	
+	// For callees other than CMsvSearchsortOpOnHeaderBody class, searchsortutil pointer will be NULL
+	if(searchsortutil != NULL)
+		{
+		// Get the setting values from TMsvEnhanceSearchSortUtil iPartList variable
+		TInt32 searchsortsetting=searchsortutil->GetSearchSortSetting();
+		
+		if (aPartList & KMsvMessagePartFrom) // From search
+			{
+			TRAPD(ret,FindInOriginatorL(aTextToFind,aPartList,retList));
+			if (ret != KErrNone)
+				{
+				User::LeaveIfError(ret);
+				}
+			}
+		else if (aPartList & KMsvMessagePartSubject) // Subject search	
+			{
+			TRAPD(ret,FindInDescriptionL(aTextToFind,aPartList,retList));
+			if (ret != KErrNone)
+				{
+				User::LeaveIfError(ret);
+				}	
+			}
+		// Load the body if it wasnt previously loaded
+		else if ((aPartList & KMsvMessagePartBody) && !(searchsortsetting & EMessagePartBodyLoaded))
+			{
+			// Load the message body
+			CMsvStore* store = iMsvEntry->ReadStoreL();
+			CleanupStack::PushL(store);
+			if (store->HasBodyTextL())
+				{
+				RestoreBodyL(*store);
+				}
+				
+			// The message body is loaded.Set the setting variable to specify that the body is loaded
+			// If the next search is also on body, than it wont be loaded next time.
+			
+			searchsortutil->SetSearchSortSetting(EMessagePartBodyLoaded); 
+			
+			TRAPD(ret,FindInBodyL(aTextToFind,aPartList,retList)); // Body search
+			
+			if (ret != KErrNone)
+				{
+				User::LeaveIfError(ret);
+				}
+			CleanupStack::PopAndDestroy(); // store
+			}
+		// Copying the Sort data for advanced search and sort.
+		// This is done by setting the iExtensionData member variable of CBaseMtm class point 
+		// to the field being sorted
+		if ((searchsortsetting & EMessagePartSort ) || ((searchsortsetting & EMessagePartSearchSort) && (searchsortsetting & EMessagePartLastQueryOption) && (retList)))
+			{
+			if(searchsortsetting & EMessagePartFromSort)
+	   		    {
+	   		    SetExtensionData((TAny*)&iMsvEntry->Entry().iDetails);	
+	   		    }
+	  		else if(searchsortsetting & EMessagePartSubjectSort)
+   				{
+   				SetExtensionData((TAny*)&iMsvEntry->Entry().iDescription);		
+   				}
+   			else 
+   				{
+   				searchsortutil->SetSearchSortSetting(EMessagePartInvalidSortField);
+   				}
+			}
+		}
+	else
+		{
+
+		//Normal search. Implementation prior to PREQ1667 (Advanced search and sort on message store)
+		if (aPartList&KMsvMessagePartBody)
+			{
+			TRAPD(ret,FindInBodyL(aTextToFind,aPartList,retList));
+			if (ret != KErrNone)
+				{
+				User::LeaveIfError(ret);
+				}
+			}
+		else if (aPartList&KMsvMessagePartOriginator) 
+			{
+			TRAPD(ret,FindInOriginatorL(aTextToFind,aPartList,retList));
+			if (ret != KErrNone)
+				{
+				User::LeaveIfError(ret);
+				}
+			}
+		else if (aPartList&KMsvMessagePartDescription)	
+			{
+			TRAPD(ret,FindInDescriptionL(aTextToFind,aPartList,retList));
+			if (ret != KErrNone)
+				{
+				User::LeaveIfError(ret);
+				}
+			}
+		}
+	return retList;
+	}
+
+void CBIOClientMtm::FindInDescriptionL(const TDesC& aTextToFind, TMsvPartList aPartList,TMsvPartList& aFoundList)
+	{
+	CMsvFindText* text=CMsvFindText::NewL();
+	CleanupStack::PushL(text);
+
+	if (text->FindTextL(aTextToFind,iMsvEntry->Entry().iDescription,aPartList))
+		aFoundList|=KMsvMessagePartDescription;
+
+	CleanupStack::PopAndDestroy();// text
+	}
+
+void CBIOClientMtm::FindInOriginatorL(const TDesC& aTextToFind, TMsvPartList aPartList,TMsvPartList& aFoundList)
+	{
+	CMsvFindText* text=CMsvFindText::NewL();
+	CleanupStack::PushL(text);
+	
+	if (text->FindTextL(aTextToFind,iMsvEntry->Entry().iDetails,aPartList))
+		aFoundList|=KMsvMessagePartBody;
+
+	CleanupStack::PopAndDestroy();// text
+	}
+
+void CBIOClientMtm::FindInBodyL(const TDesC& aTextToFind, TMsvPartList aPartList,TMsvPartList& aFoundList)
+	{
+	CMsvFindText* text=CMsvFindText::NewL();
+	CleanupStack::PushL(text);
+
+	if (text->FindRichTextL(aTextToFind,Body(),aPartList))
+		aFoundList|=KMsvMessagePartBody;
+
+	CleanupStack::PopAndDestroy();// text
+	}
+	
+void CBIOClientMtm::AddAddresseeL(const TDesC& /*aRealAddress*/)
+/** Leaves with KErrNotSupported.
+
+@param aRealAddress Unused */
+	{
+	User::Leave(KErrNotSupported);
+	}
+
+void CBIOClientMtm::AddAddresseeL(const TDesC& /*aRealAddress*/, const TDesC& /*aAlias*/)
+/** Leaves with KErrNotSupported.
+
+@param aRealAddress Unused
+@param aAlias Unused */
+	{
+	User::Leave(KErrNotSupported);
+	}
+
+void CBIOClientMtm::RemoveAddressee(TInt /*aIndex*/)
+/** Does nothing.
+
+@param aIndex Unused */
+	{
+	}
+
+void CBIOClientMtm::ContextEntrySwitched()
+	{
+	}
+
+void CBIOClientMtm::InvokeSyncFunctionL(TInt /*aFunctionId*/,const CMsvEntrySelection& /*aSelection*/, TDes8& /*aParameter*/)
+/** Leaves with KErrNotSupported.
+
+@param aFunctionId Unused
+@param aSelection Unused
+@param aParameter Unused */
+	{
+	User::Leave(KErrNotSupported);
+	}
+
+CMsvOperation* CBIOClientMtm::InvokeAsyncFunctionL(TInt aFunctionId,const CMsvEntrySelection& aSelection, TDes8& /*aParameter*/, TRequestStatus& aCompletionStatus)
+/** Requests a BIO message to be parsed or processed.
+
+The behaviour resulting from the request is specific to the BIO message type. 
+Typically, parsing causes an interpretation of the raw message body, and storage 
+of the results. Processing causes some system action to take place according 
+to the instructions in the message.
+
+@param aFunctionId ID of the requested operation: this must be a TBiosCmds 
+value.
+@param aSelection Message entry to parse or process.
+@param aParameter Unused
+@param aCompletionStatus The request status to be completed when the operation 
+has finished
+@return If successful, this is an asynchronously completing operation. If failed, 
+this is a completed operation, with status set to the relevant error code. */
+	{
+	if (aFunctionId != KBiosMtmParse && 
+		aFunctionId != KBiosMtmParseThenProcess && 
+		aFunctionId != KBiosMtmProcess)
+		User::Leave(KErrNotSupported);
+	
+	__ASSERT_DEBUG(aSelection.Count()>=1, User::Panic(_L("BIOC"), KBIOMessageNotFound));
+	// Messaging API V2
+	CBIOOperation* parseOp = CBIOOperation::NewL(iFs, Session(), iBioDatabase, aCompletionStatus);
+	parseOp->StartCommand(aSelection, aFunctionId, aCompletionStatus);
+	return parseOp;
+	}
+
+// --- RTTI functions ---
+TInt CBIOClientMtm::QueryCapability(TUid aCapability, TInt& aResponse)
+/** Queries if the MTM supports a particular capability, specified by a UID.
+
+It supports KUidMtmQueryMaxBodySize, KUidMtmQueryMaxTotalMsgSize, KUidMsvMtmQueryEditorUid, 
+KUidMtmQuerySupportedBody, and KUidMtmQueryCanReceiveMsg.
+
+@param aCapability UID of capability to be queried
+@param aResponse Response value. The format of the response varies according 
+to the capability. 
+@return KErrNone: aCapability is a recognised value and a response is returned 
+KErrNotSupported: aCapability is not a recognised value */
+	{
+	TInt error = KErrNone;
+	// Supported
+	switch (aCapability.iUid)
+		{
+	case KUidMtmQueryMaxBodySizeValue:
+	case KUidMtmQueryMaxTotalMsgSizeValue:
+		aResponse = KMaxTInt;
+		break;
+	case KUidMsvMtmQueryEditorUidValue:
+		aResponse = KUidBIOMessageViewerApp.iUid;
+		break;
+	case KUidMtmQuerySupportedBodyValue:
+		aResponse = KMtm7BitBody + KMtm8BitBody + KMtm16BitBody + KMtmBinaryBody;
+		break;
+	case KUidMtmQueryCanReceiveMsgValue:		
+		break;
+	// All others - Not Supported:
+	default:
+		error = KErrNotSupported;
+		}
+	return error;
+	}
+
+
+//
+// constructor
+//
+CBIOClientMtm::CBIOClientMtm(CRegisteredMtmDll& aRegisteredMtmDll, CMsvSession& aSession)
+: CBaseMtm(aRegisteredMtmDll, aSession)
+	{
+	}
+