commands/testexecute/ProxyServer.h
author Tom Sutcliffe <thomas.sutcliffe@accenture.com>
Thu, 26 Aug 2010 00:49:35 +0100
changeset 45 534b01198c2d
parent 5 9c58252c6740
permissions -rw-r--r--
Added ENotifyKeypresses and ECaptureCtrlC flags to CCommandBase. Commands can now get keypresses and handle ctrl-C via callbacks instead of having to implement custom active objects. As part of this extended the CCommandBase extension interface to MCommandExtensionsV2 for the new virtual functions KeyPressed(TUint aKeyCode, TUint aModifiers) and CtrlCPressed(). sudo now cleans up correctly by using ECaptureCtrlC.

// ProxyServer.h
// 
// Copyright (c) 2010 Accenture. All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the "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:
// Accenture - Initial contribution
//
#ifndef PROXYSERVER_H
#define PROXYSERVER_H

#include <fshell/memoryaccess.h>
#include <e32base.h>

class CProxySession;

class MMessageHandler
	{
public:
	virtual TBool HandleMessageL(CProxySession* aSession, const RMessage2& aMessage)=0;
	};

NONSHARABLE_CLASS(CProxyServer) : public CServer2
	{
public:
	static CProxyServer* NewInSeparateThreadL(const TDesC& aServerToReplace, MMessageHandler* aHandler=NULL);
	void Destroy(); // This should be used instead of delete - the server object has to be destroyed from the thread in which it was started
	MMessageHandler* Handler() const;

protected:
	CSession2* NewSessionL(const TVersion& aVersion, const RMessage2& aMessage) const;

private:
	~CProxyServer();
	CProxyServer(const TDesC& aServerToReplace, MMessageHandler* aHandler);
	void ConstructL();
	void ThreadConstructL();
	static TInt StartServerThreadFunction(TAny* aSelf);
	void ServerThreadRunL();
	static TInt Shutdown(TAny* aSelf);

private:
	RMemoryAccess iMemAccess;
	TBool iProxying;
	TName iServerName;
	TName iRealServerName;
	RThread iServerThread;
	MMessageHandler* iHandler;
	CAsyncCallBack* iShutdownCallback;
	};

class RUnderlyingSession : public RSessionBase
	{
public:
	friend class CProxySession;
	friend class CAsyncWaiter;
	};

NONSHARABLE_CLASS(CProxySession) : public CSession2
	{
public:
	void ConstructL(const TDesC& aServerName, const TVersion& aVersion);
	void ForwardUnhandledMessageL(const RMessage2& aMessage);
	void ForwardMessageArgsL(const RMessage2& aMessage, const TIpcArgs& aArgs);

protected:
	void ServiceL(const RMessage2 &aMessage);
	void Disconnect(const RMessage2 &aMessage);

private:
	CProxyServer& Server();
	const CProxyServer& Server() const;

private:
	RUnderlyingSession iSession;
	};


#endif