messagingfw/wappushfw/pushmtm/src/pushservermtm.cpp
changeset 62 db3f5fa34ec7
parent 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/wappushfw/pushmtm/src/pushservermtm.cpp	Wed Nov 03 22:41:46 2010 +0530
@@ -0,0 +1,343 @@
+// Copyright (c) 2000-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:
+// PUSHSMTM.CPP
+// 
+//
+
+
+
+#include "regpsdll.h"   // Parser Registry - used to load the parser
+#include <msvids.h>
+#include <pushentry.h>
+#include "PushServerPanic.h"
+#include "pushservermtm.h"
+
+
+
+/**
+ * Factory function for the WAP Push Server MTM. Sets the initial entry for the server to work with.
+ * @param CRegisteredMtmDll& aRegisteredMtmDll
+ *					in: Registration data for the MTM DLL 
+ * @param CMsvServerEntry* aInitialEntry
+ *					in: initial context that the server should operate on.
+ * @return CWapPushServerMtm* - new instance of the server MTM
+ */
+EXPORT_C CWapPushServerMtm* CWapPushServerMtm::NewL(CRegisteredMtmDll& aRegisteredMtmDll, CMsvServerEntry* aInitialEntry)
+	{
+	CleanupStack::PushL(aInitialEntry); // Take ownership of aInitialEntry so it's cleaned up if we leave
+	CWapPushServerMtm* myServerMtm =  new(ELeave) CWapPushServerMtm(aRegisteredMtmDll,aInitialEntry);
+	CleanupStack::Pop(); //safely stored aInitialEntry - we can release it now
+	CleanupStack::PushL(myServerMtm);
+	myServerMtm->Construct();
+	CleanupStack::Pop();
+	return myServerMtm;
+	}
+
+/**
+ * Destructor 
+ */
+CWapPushServerMtm::~CWapPushServerMtm()
+	{
+	Cancel();
+	}
+
+/**
+ * C++ constructor. Passes parameters to the base constructor, and set the initial state.
+ * @param CRegisteredMtmDll& aRegisteredMtmDll
+ *					in: Registration data for the MTM DLL 
+ * @param CMsvServerEntry* aInitialEntry
+ *					in: initial context that the server should operate on
+ */
+CWapPushServerMtm::CWapPushServerMtm(CRegisteredMtmDll& aRegisteredMtmDll, CMsvServerEntry* aInitialEntry)
+:CBaseServerMtm(aRegisteredMtmDll, aInitialEntry),  iError(KErrNone),iState(EWapPushServerMtmWaiting)
+	{
+	__DECLARE_NAME(_S("CWAPPushServerMtm"));
+	}
+
+/**
+ * Second Stage Constructor. Adds the object to the Active Scheduler
+ */
+void CWapPushServerMtm::Construct()
+	{
+	CActiveScheduler::Add(this);
+	}
+
+/**
+ * MTM API Not Supported
+ */
+void CWapPushServerMtm::CopyToLocalL(const CMsvEntrySelection& /*aSelection*/,TMsvId /*aDestination*/, TRequestStatus& /*aStatus*/)
+	{
+	User::Leave(KErrNotSupported);
+	}
+
+/**
+ * MTM API Not Supported
+ */
+void CWapPushServerMtm::CopyFromLocalL(const CMsvEntrySelection& /*aSelection*/,TMsvId /*aDestination*/, TRequestStatus& /*aStatus*/)
+	{
+	User::Leave(KErrNotSupported);
+	}
+
+/**
+ * MTM API Not Supported
+ */
+void CWapPushServerMtm::CopyWithinServiceL(const CMsvEntrySelection& /*aSelection*/,TMsvId /*aDestination*/, TRequestStatus& /*aStatus*/)
+	{
+	User::Leave(KErrNotSupported);
+	}
+
+/**
+ * MTM API Not Supported
+ */
+void CWapPushServerMtm::MoveToLocalL(const CMsvEntrySelection& /*aSelection*/, TMsvId /*aDestination*/, TRequestStatus& /*aStatus*/)
+	{
+	User::Leave(KErrNotSupported);	
+	}
+
+/**
+ * MTM API Not Supported
+ */
+void CWapPushServerMtm::MoveFromLocalL(const CMsvEntrySelection& /*aSelection*/,TMsvId /*aDestination*/, TRequestStatus& /*aStatus*/)
+	{
+	User::Leave(KErrNotSupported);
+	}
+
+/**
+ * MTM API Not Supported
+ */
+void CWapPushServerMtm::MoveWithinServiceL(const CMsvEntrySelection& /*aSelection*/,TMsvId /*aDestination*/, TRequestStatus& /*aStatus*/)
+	{
+	User::Leave(KErrNotSupported);
+	}
+
+/**
+ * Deletes a number of entries from the Message Server index. Also deletes child entries of the selected 
+ * entries. Makes a call to the Message Server to do the actual delete. 
+ * @param const CMsvEntrySelection& aSelection
+ *					in: Selection of entry Ids that the caller wants to delete
+ * @param TRequestStatus& aStatus
+ *					in: Status object of calling object to be used to return status information 
+ * @leave KErrLocked Will leave if the entry is locked
+ * @leave KErrAccessDenied Will leave if the entry or a descendant was locked by another client
+ * @leave KErrInUse Will leave if the store or a file associated with the entry is open
+ * @leave KErrNotFound Will leave if the entry is not a child of the context 
+ */ 
+void CWapPushServerMtm::DeleteAllL(const CMsvEntrySelection& aSelection, TRequestStatus& aStatus)
+	{
+	__ASSERT_ALWAYS(iServerEntry!=NULL,Panic(EPushEntryNotSet));
+	ResetProgress();
+	iProgress.iTotalMsgs = aSelection.Count();
+	iState = EWapPushServerMtmDelete;
+
+	// set the main server entry up to the first entry
+	iError=iServerEntry->SetEntry(aSelection.At(0)); //Hold the error for progress
+	User::LeaveIfError(iError);
+
+	__ASSERT_ALWAYS(iServerEntry->Entry().iMtm == KUidMtmWapPush,Panic(EPushServerWrongMtm));	
+
+	CMsvEntrySelection* entries=aSelection.CopyLC();
+	iError = iServerEntry->SetEntry(iServerEntry->Entry().Parent());
+	User::LeaveIfError(iError);
+	
+	// Call the message server to delete the entries recursively
+	iError = iServerEntry->DeleteEntries(*entries);
+	User::LeaveIfError(iError);
+	CleanupStack::PopAndDestroy();//entries
+
+	iProgress.iMsgsProcessed = aSelection.Count();
+
+	TRequestStatus* status=&aStatus;
+	User::RequestComplete(status, KErrNone);
+	iProgress.iMsgId = aSelection.At(0); //hold the first id for the progress
+	}
+
+/**
+ * Creates a new entry with this MTM group. Makes a call to the server to do the actual 
+ * create.  Holds on to the new Id so it can returned in the Progress information.
+ * @param const TMsvEntry& aSelection
+ *					in: entry that the user wants to create
+ * @param TRequestStatus& aStatus
+ *					in: Status object of calling object to be used to return status information 
+ */ 
+void CWapPushServerMtm::CreateL(TMsvEntry aNewEntry, TRequestStatus& aStatus)
+	{
+	ResetProgress();
+	iProgress.iTotalMsgs = 1;
+	iError=iServerEntry->SetEntry(aNewEntry.Parent());
+	User::LeaveIfError(iError);
+	
+	__ASSERT_ALWAYS(aNewEntry.iMtm == KUidMtmWapPush,Panic(EPushServerWrongMtm));	
+
+	iState = EWapPushServerMtmCreate;
+	iError = iServerEntry->CreateEntry(aNewEntry);
+	User::LeaveIfError(iError);
+	
+	TRequestStatus* status=&aStatus;
+	User::RequestComplete(status, KErrNone);  // No errors so far
+	iProgress.iMsgsProcessed = 1;	
+	iProgress.iMsgId = aNewEntry.Id();  // hold the id for the progress info
+	}
+
+
+/**
+ * Changes the specified entry to the new values. Must be of the Push Message MTM type.
+ * Makes a call to the server to do the actual change.  Holds on to the Id so it 
+ * can returned in the Progress information.
+ * @param const TMsvEntry& aEntry
+ *					in: entry with the new values 
+ * @param TRequestStatus& aStatus
+ *					in: Status object of calling object to be used to return status information 
+ */ 
+
+void CWapPushServerMtm::ChangeL(TMsvEntry aEntry, TRequestStatus& aStatus)
+	{
+	ResetProgress();
+	iProgress.iTotalMsgs = 1;
+	iState = EWapPushServerMtmChange;
+
+	iError =iServerEntry->SetEntry(aEntry.Id()); //Hold the error so that the progress can return it
+	User::LeaveIfError(iError);
+	__ASSERT_ALWAYS(iServerEntry->Entry().iMtm == KUidMtmWapPush,Panic(EPushServerWrongMtm));	
+	
+	iError = iServerEntry->ChangeEntry(aEntry);
+	User::LeaveIfError(iError);
+
+	TRequestStatus* status=&aStatus;
+	User::RequestComplete(status, KErrNone);
+
+	//Update progress
+	iProgress.iMsgsProcessed=1;	
+	iProgress.iMsgId = aEntry.Id(); //hold the id for the progress
+	}
+
+/**
+ * Function called when server specific commands are required. Case statement is used to call the  
+ * appropriate function.  Currently there are no commands which are not defined in the base class.
+ * If any specific commands are to be added for this MTM then the call should be made via this function.
+ * @param CMsvEntrySelection& aSelection
+ *						in: group of message entry Ids to be operated on.
+ * @param TInt aCommand
+ *						in: parameter specifying the MTM specific command to be executed 
+
+ * @param const TDesC8& aParameter
+ *						in: Command-specific parameters
+ * @param TRequestStatus& aStatus
+ *						in : reference to use to return asynchronous completion status information
+ * @leave KErrNotSupported - currently don't support any MTM specific commands.
+ *
+ */
+void CWapPushServerMtm::StartCommandL(CMsvEntrySelection& /*aSelection*/, TInt aCommand, const TDesC8& /*aParameter*/, TRequestStatus& /*aStatus*/)
+	{
+	// Add any Mtm specific requests to this section. 
+	switch (aCommand)
+		{
+		case 0: //Keeps compiler happy
+		default:
+			User::Leave(KErrNotSupported);  // Currently don't support any MTM specific commands
+			break;
+		}
+	*iReportStatus=KRequestPending;
+	User::RequestComplete(iReportStatus, KErrNone);
+
+	}
+
+
+/**
+ * Indicates whether any more commands are expected. This is to prevent the server unloading
+ * the MTM if further commands are expected. Currently always return EFalse, so the MTM can be unloaded.
+ * @return TBool - always EFalse
+ */
+TBool CWapPushServerMtm::CommandExpected()
+	{
+	return EFalse; // Currently ALWAYS EFalse  can be deleted by Msg Server
+	}
+
+/**
+ * Returns a Package Buffer containing a Progress Object.  Provides the caller on the current operation
+ * total number of entries, number processed, Error, and the current entry. 
+ * @return const TDesC8& - package buffer containing the Progress object
+ */
+const TDesC8& CWapPushServerMtm::Progress()
+	{
+	iProgress.iPushState = iState;
+	iProgress.iError=iError;
+	iProgressBuf = TPushMTMProgressBuf(iProgress);
+	return iProgressBuf;
+	}
+
+/**
+ * Cancels the current asynchronous operation. Required by the Active Object class 
+ * inherited by the base class.
+ */
+void CWapPushServerMtm::DoCancel()
+	{
+	User::RequestComplete( iReportStatus, KErrCancel );
+	}
+
+
+/**
+ * Inherited from the the base class. Called by RunL.
+ */
+void CWapPushServerMtm::DoRunL()
+	{
+	User::RequestComplete (iReportStatus, iError);
+	}
+
+/**
+ * Called by the active scheduler when RunL leaves.  Tidies things up and completes 
+ * the current asynchronous request with the error code passed as a parameter. 
+ * @param TInt aError 
+ *					in: Error code
+ * @return TInt		error code required by Active Scheduler - KErrNone prevents Scheduler panicing
+ */
+TInt CWapPushServerMtm::RunError(TInt aError)
+	{
+	iError = aError;
+	Cancel();
+	Complete();
+	return KErrNone;
+	}
+
+/**
+ * Completes the current operation with the current error level.
+ */
+void CWapPushServerMtm::Complete()
+	{
+	DoComplete(iError);
+	}
+
+/**
+ * Performs the completiong of the curent operation with the specified error code.
+ */
+void CWapPushServerMtm::DoComplete(TInt aError)
+	{
+	TRequestStatus* status = iReportStatus;
+	User::RequestComplete(status, aError);
+	}
+/**
+ * Resets the progress variable.
+ */
+void CWapPushServerMtm::ResetProgress()
+	{
+	iProgress.iError=KErrNone;
+	iProgress.iTotalMsgs = 0;
+	iProgress.iMsgsProcessed =0;
+	iProgress.iMsgId=KMsvNullIndexEntryId;
+
+	iProgressBuf.Zero();
+	}
+
+
+
+