messagingfw/sendas/test/sendastextnotifier/src/csendasUInotifier.cpp
changeset 62 db3f5fa34ec7
parent 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/sendas/test/sendastextnotifier/src/csendasUInotifier.cpp	Wed Nov 03 22:41:46 2010 +0530
@@ -0,0 +1,223 @@
+// Copyright (c) 2005-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:
+//
+
+#include <ecom/ecom.h>
+#include "csendasUInotifier.h"
+#include <tmsvpackednotifierrequest.h>
+#include <ecom/implementationproxy.h>
+
+/* UID of the SendAs notifier channel to get the user's confirmation */
+const TUid KSendAsNotifierPluginUid     = {0x10208C14};
+const TUid KTechViewScreenOutputChannel = {0x10208C14};
+const TInt KSendAsServerExeUid	= {0x10204290};
+
+
+RDummyServSession::RDummyServSession()
+    {
+    }
+
+static TInt StartDummyServer()
+	{
+	const TUidType serverUid(KNullUid, TUid::Uid(KSendAsServerExeUid));
+	TRequestStatus started( KRequestPending );
+	RProcess server;
+	TInt err = server.Create(KDummyServerExe, KNullDesC(), serverUid);
+
+	if( err != KErrNone )
+		{
+		return err;
+		}
+	
+	TRequestStatus status;
+	server.Rendezvous(status);
+	if( status != KRequestPending )
+		{
+		server.Kill(0); // abort start-up
+		}
+	else
+		{
+		server.Resume();	// wait for server start-up.
+		}
+	User::WaitForRequest(status);
+	err = (server.ExitType() == EExitPanic ) ? KErrGeneral : status.Int();
+	server.Close();
+	return err;	
+	}
+
+TInt RDummyServSession::Connect()
+    {
+	// Start the server.
+    TInt err = StartDummyServer();
+    if (err == KErrNone)
+    	{
+    	err = CreateSession(KDummyServerName,Version(),5);
+    	}
+        
+    return(err); 
+    }
+
+
+/**
+Returns the earliest version number of the server that we can talk to.
+*/  
+TVersion RDummyServSession::Version(void) const
+    {
+    return(TVersion(KCountServMajorVersionNumber,KCountServMinorVersionNumber,KCountServBuildVersionNumber));
+    }
+    
+    
+TMsvEntry RDummyServSession::GetTMsvEntry(CMsvEntrySelection* iSelection)
+    {
+    TMsvEntry entry;
+   	TPckgBuf<TMsvEntry> pckg;
+    TMsvId entryId = iSelection->At(0);
+	SendReceive(EServGetTMsvEntry,TIpcArgs(entryId, &pckg));	
+	entry = pckg();
+	return entry;
+    }
+
+EXPORT_C CArrayPtr<MEikSrvNotifierBase2>* NotifierArray()
+	{
+	CArrayPtrFlat<MEikSrvNotifierBase2>* subjects=NULL;
+	TRAPD( err, subjects=new (ELeave)CArrayPtrFlat<MEikSrvNotifierBase2>(1) );
+	if( err == KErrNone )
+		{
+		TRAP( err, subjects->AppendL( CSendAsUINotifier::NewL() ) );
+		return(subjects);
+		}
+	else
+		{
+		return NULL;
+		}
+	}
+
+CSendAsUINotifier* CSendAsUINotifier::NewL()
+	{
+	CSendAsUINotifier* self=new (ELeave) CSendAsUINotifier();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+void CSendAsUINotifier::ConstructL()
+	{
+	iSelection = new (ELeave) CMsvEntrySelection();
+	}
+
+CSendAsUINotifier::~CSendAsUINotifier()
+	{
+	delete iSelection;
+	REComSession::FinalClose();
+	}
+
+CSendAsUINotifier::CSendAsUINotifier()
+	{
+	iInfo.iUid      = KSendAsNotifierPluginUid;
+	iInfo.iChannel  = KTechViewScreenOutputChannel;
+	iInfo.iPriority = ENotifierPriorityHigh;
+	}
+
+void CSendAsUINotifier::Release()
+	{
+	delete this;
+	}
+
+/**
+Called when a notifier is first loaded to allow any initial construction that is required.
+ */
+CSendAsUINotifier::TNotifierInfo CSendAsUINotifier::RegisterL()
+	{
+	return iInfo;
+	}
+
+CSendAsUINotifier::TNotifierInfo CSendAsUINotifier::Info() const
+	{
+	return iInfo;
+	}
+	
+/**
+The notifier has been deactivated so resources can be freed and outstanding messages completed.
+ */
+void CSendAsUINotifier::Cancel()
+	{
+	}
+
+/**
+Start the Notifier with data aBuffer. 
+
+Not used for confirm notifiers
+*/
+TPtrC8 CSendAsUINotifier::StartL(const TDesC8& /*aBuffer*/)
+	{
+	User::Leave(KErrNotSupported);
+	return KNullDesC8();
+	}
+	
+/**
+Start the notifier with data aBuffer. aMessage should be completed when the notifier is deactivated.
+
+May be called multiple times if more than one client starts the notifier. The notifier is immediately 
+responsible for completing aMessage.
+*/
+void CSendAsUINotifier::StartL(const TDesC8& aBuffer, TInt /*aReplySlot*/, const RMessagePtr2& aMessage)
+	{
+	// extract the notifier request parameters
+	TMsvPackedNotifierRequest::UnpackL(aBuffer, *iSelection, iSecurityInfo);
+	iMessage   = aMessage;
+	//Start the session.
+	RDummyServSession serverSession;
+	serverSession.Connect();
+
+	// Simulate "User Response"
+	TMsvEntry entry =  serverSession.GetTMsvEntry(iSelection);
+	serverSession.Close();
+	// complete with TMsvEntry::iError as return code
+	if (entry.iError != KErrNone)
+		{
+		iMessage.Complete(KErrPermissionDenied);
+		}
+	else
+		{
+		iMessage.Complete(KErrNone);
+		}
+	// Clear the CMsvEntrySelection
+	iSelection->Reset();
+	}
+	
+/**
+Update a currently active notifier with data aBuffer.
+
+Not used for confirm notifiers
+*/
+TPtrC8 CSendAsUINotifier::UpdateL(const TDesC8& /*aBuffer*/)
+	{
+	User::Leave(KErrNotSupported);
+	return KNullDesC8();
+	}
+
+//Adding ECOM SUPPORT
+const TImplementationProxy ImplementationTable[] =
+	{
+	IMPLEMENTATION_PROXY_ENTRY(0x10275530,NotifierArray)
+	};
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+	{
+	aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+	return ImplementationTable;
+	}
+
+