--- /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();
+ }
+
+
+
+