--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/appfw/apparchitecture/apparc/ApaAppClient.cpp Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,227 @@
+// 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:
+//
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#if !defined(__APA_INTERNAL_H__)
+#include "apainternal.h"
+#endif
+#endif //SYMBIAN_ENABLE_SPLIT_HEADERS
+#include "ApaServerAppPriv.h"
+
+void AppServerPanic(TApaAppServerPanic aReason)
+ {
+ _LIT(KPanic, "ApaAppClient");
+ User::Panic(KPanic, aReason);
+ }
+
+void CleanupServerName(TAny* aParam)
+ {
+ HBufC** pServerName = static_cast<HBufC**>(aParam);
+ delete *pServerName;
+ *pServerName = NULL;
+ }
+
+/** Protected constructor, instantiable services must derive from this class.*/
+EXPORT_C RApaAppServiceBase::RApaAppServiceBase()
+: iServerName(NULL)
+ {
+ }
+
+/** Closes the service and the connection to the server app.*/
+EXPORT_C void RApaAppServiceBase::Close()
+ {
+ delete iServerName;
+ iServerName = NULL;
+ RSessionBase::Close();
+ }
+
+/** Connects to an already running server application, through an already connected service.
+@param aClient A service which is already connected.*/
+EXPORT_C void RApaAppServiceBase::ConnectExistingAppL(const RApaAppServiceBase& aClient)
+ {
+ __ASSERT_DEBUG(!iServerName, AppServerPanic(EApaAppServerPanicClientAlreadyConnected));
+ iServerName = aClient.iServerName->AllocL();
+ ConnectL();
+ }
+
+/** Connects to an already running server application, through an already connected service.
+@param aClient A service which is already connected.
+@param aSecurityPolicy The TSecurityPolicy which should be matched with the TSecurityPolicy of the app to be connected.
+
+@see TSecurityPolicy*/
+EXPORT_C void RApaAppServiceBase::ConnectExistingAppL(const RApaAppServiceBase& aClient, const TSecurityPolicy& aSecurityPolicy)
+ {
+ __ASSERT_DEBUG(!iServerName, AppServerPanic(EApaAppServerPanicClientAlreadyConnected));
+ iServerName = aClient.iServerName->AllocL();
+ ConnectL(aSecurityPolicy);
+ }
+
+/** Connects to an already running server application, by name.
+@param aName The name of the server hosted by the server app.*/
+EXPORT_C void RApaAppServiceBase::ConnectExistingByNameL(const TDesC& aServerName)
+ {
+ __ASSERT_DEBUG(!iServerName, AppServerPanic(EApaAppServerPanicClientAlreadyConnected));
+ iServerName = aServerName.AllocL();
+ ConnectL();
+ }
+
+/** Connects to an already running server application, by name.
+@param aName The name of the server hosted by the server app.
+@param aSecurityPolicy The TSecurityPolicy which should be matched with the TSecurityPolicy of the app to be connected.
+
+@see TSecurityPolicy*/
+EXPORT_C void RApaAppServiceBase::ConnectExistingByNameL(const TDesC& aServerName, const TSecurityPolicy& aSecurityPolicy)
+ {
+ __ASSERT_DEBUG(!iServerName, AppServerPanic(EApaAppServerPanicClientAlreadyConnected));
+ iServerName = aServerName.AllocL();
+ ConnectL(aSecurityPolicy);
+ }
+
+void RApaAppServiceBase::ConnectL()
+ {
+ CleanupStack::PushL(TCleanupItem(CleanupServerName, &iServerName));
+ TUid serviceUid = ServiceUid();
+ User::LeaveIfError(CreateSession(*iServerName,*reinterpret_cast<TVersion*>(&serviceUid)));
+ CleanupStack::Pop(&iServerName);
+ }
+
+void RApaAppServiceBase::ConnectL(const TSecurityPolicy& aSecurityPolicy)
+ {
+ CleanupStack::PushL(TCleanupItem(CleanupServerName, &iServerName));
+ TUid serviceUid = ServiceUid();
+ User::LeaveIfError(CreateSession(*iServerName, *reinterpret_cast<TVersion*>(&serviceUid), -1, EIpcSession_Unsharable, &aSecurityPolicy));
+ CleanupStack::Pop(&iServerName);
+ }
+
+/** Gets the name of the server hosted by the server application.
+@return the name of the server application, will be empty if
+the service is not connected*/
+EXPORT_C TPtrC RApaAppServiceBase::ServerName() const
+ {
+ if (iServerName)
+ {
+ return *iServerName;
+ }
+ else
+ {
+ return KNullDesC();
+ }
+ }
+
+/** Requests notification of server application exit.
+@param aStatus On completion, this contains the exit code of the server application.
+@see CApaServerAppExitMonitor*/
+EXPORT_C void RApaAppServiceBase::NotifyServerExit(TRequestStatus& aStatus) const
+ {
+ SendReceive(EApaAppServerNotifyServerExit,TIpcArgs(),aStatus);
+ }
+
+/** Cancels the request for notification of server application exit.*/
+EXPORT_C void RApaAppServiceBase::CancelNotifyServerExit() const
+ {
+ SendReceive(EApaAppServerCancelNotifyServerExit);
+ }
+
+/** Extension mechanism - for internal BC proofing. */
+EXPORT_C void RApaAppServiceBase::ExtensionInterface(TUid /*aInterfaceId*/, TAny*& /*aImplementaion*/)
+ {
+ }
+EXPORT_C void RApaAppServiceBase::RApaAppServiceBase_Reserved1()
+ {
+ }
+
+EXPORT_C void RApaAppServiceBase::RApaAppServiceBase_Reserved2()
+ {
+ }
+
+/** Transfers the ownership of the session passed to self.
+@param aClient A service which is already connected. On return, this service will be reset.
+@leave KErrArgument The session passed is not connected.
+@panic ApaAppClient 3 The client getting the ownership already has a connected session. Debug builds only.
+*/
+EXPORT_C void RApaAppServiceBase::TransferExistingSessionL(RApaAppServiceBase& aClient)
+ {
+ __ASSERT_DEBUG(!iServerName, AppServerPanic(EApaAppServerPanicClientAlreadyConnected));
+ if(aClient.iServerName == NULL)
+ {
+ User::Leave(KErrArgument);
+ }
+ if(this != &aClient)
+ {
+ iServerName = aClient.iServerName;
+ iApaReserved1 = aClient.iApaReserved1;
+ iApaReserved2 = aClient.iApaReserved2;
+ SetHandle(aClient.Handle());
+ aClient.iServerName = NULL;
+ aClient.SetHandle(0);
+ }
+ }
+
+//
+// CApaServerAppExitMonitor
+//
+
+/** Creates a new monitor object and starts monitoring server app lifetime.
+@param aClient A connected server app session, which requires monitoring.
+@param aObserver An implementer of the MApaServerAppExitObserver that wants to be notified of server app exits.
+@param aPriority The active object priority that this monitor should run at.
+@return a new instance of a monitor. */
+EXPORT_C CApaServerAppExitMonitor* CApaServerAppExitMonitor::NewL(RApaAppServiceBase& aClient, MApaServerAppExitObserver& aObserver, TInt aPriority)
+ {
+ CApaServerAppExitMonitor* self = new(ELeave) CApaServerAppExitMonitor(aClient, aObserver, aPriority);
+ return self;
+ }
+
+/** Creates a new monitor object, places it on the cleanup stack and starts monitoring server app lifetime.
+@param aClient A connected server app session, which requires monitoring.
+@param aObserver An implementer of the MApaServerAppExitObserver that wants to be notified of server app exits.
+@param aPriority The active object priority that this monitor should run at.
+@return a new instance of a monitor, which is placed on the cleanup stack. */
+EXPORT_C CApaServerAppExitMonitor* CApaServerAppExitMonitor::NewLC(RApaAppServiceBase& aClient, MApaServerAppExitObserver& aObserver, TInt aPriority)
+ {
+ CApaServerAppExitMonitor* self = new(ELeave) CApaServerAppExitMonitor(aClient, aObserver, aPriority);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+/** The destructor stops monitoring of server app exit. */
+EXPORT_C CApaServerAppExitMonitor::~CApaServerAppExitMonitor()
+ {
+ Cancel();
+ }
+
+CApaServerAppExitMonitor::CApaServerAppExitMonitor(RApaAppServiceBase& aClient, MApaServerAppExitObserver& aObserver, TInt aPriority)
+: CActive(aPriority), iClient(aClient), iObserver(aObserver)
+ {
+ CActiveScheduler::Add(this);
+ iClient.NotifyServerExit(iStatus);
+ SetActive();
+ }
+
+void CApaServerAppExitMonitor::RunL()
+ {
+ TInt reason = iStatus.Int();
+ iObserver.HandleServerAppExit(reason);
+ }
+
+void CApaServerAppExitMonitor::DoCancel()
+ {
+ iClient.CancelNotifyServerExit();
+ }
+
+TInt CApaServerAppExitMonitor::RunError(TInt aError)
+ {
+ return aError;
+ }