⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serverconfig.cpp

📁 一个Symbian平台上的serverclient模型的简单示例
💻 CPP
字号:
//
// ServerConfig.cpp
//

// Exported API from the smallserv exe

#include "ServerConfig.h"
#include "esrvstartup.h"
#include "configservercmds.h"
#include <e32uid.h>

const TInt KMessageSlotsRequired = 2;


class TServerStarter
	{
	TInt LoadAndStartInProcess(const TDesC& aFileName, const TDesC& aServerName);
	TInt LoadAndStartInThread(const TDesC& aFileName, const TDesC& aServerName);

	TThreadFunction iThreadFn;
public:
	TInt LoadAndStart(const TDesC& aFileName, const TDesC& aServerName);
	};


TInt TServerStarter::LoadAndStartInProcess(const TDesC& aFileName, const TDesC& aServerName)
	{
	TRequestStatus status;
	TServerStartSignal signal(status, aServerName);
	TPtr16 command_line(((TUint16 *)&signal), sizeof(signal) / 2, sizeof(signal) / 2);

	RProcess server;
	TInt err = server.Create( aFileName
		                    , command_line
						    , TUidType(KExecutableImageUid, KNullUid, KNullUid)
						    , EOwnerThread
						    );
	TBuf<100> message;
	message.Format(_L("ID: %x, Name: %S Filename: %S (res: %d)"), signal.iId, &signal.iServerName, &aFileName, err);


	if (err != KErrNone)
		{
		User::InfoPrint(message);
		return err;
		}

	server.Resume();
	server.Close();
	// wait for launch to complete
	User::WaitForRequest(status);

//	TBuf<100> message;
	message.Format(_L("ID: %x, (res: %d)"), signal.iId, status.Int());

	User::InfoPrint(message);
	
	return status.Int();
	}

TInt TServerStarter::LoadAndStartInThread(const TDesC& aFileName, const TDesC& aServerName)
	{
	// set up waiting apparatus
	TRequestStatus status;
	TServerStartSignal signal(status, aServerName);
	// launch server thread (emulator)

	RThread server;
	TInt err = server.Create( aFileName
		                    , iThreadFn
						    , KDefaultStackSize
					  	    , KMinHeapSize
						    , 100000
						    , &signal
						    , EOwnerProcess
						    );
	if (err)
		{
		return err;
		}

	server.Resume();
	server.Close();
	// wait for launch to complete
	User::WaitForRequest(status);
	
	return status.Int();
	}


TInt TServerStarter::LoadAndStart(const TDesC& aFileName, const TDesC& aServerName)
	{
#ifdef __WINS__
	return LoadAndStartInThread(aFileName, aServerName);
#else
	return LoadAndStartInProcess(aFileName, aServerName);
#endif
	}


TInt LoadAndStartServer(const TDesC& aFileName)
	{
	TServerStarter* server = 0;
#ifdef __WINS__

	RLibrary lib;
	lib.Load(aFileName);
	TLibraryFunction fn = lib.Lookup(1);

	server = (TServerStarter*) fn();
#else
	server = new TServerStarter();
#endif

	if (server)
		{
		TInt res = server->LoadAndStart(aFileName, KServerName);
		delete server;
		return res;
		}
	else
		{
		return KErrNoMemory;
		}
	}


#if 0
TInt LoadAndStartServer(const TDesC& aFileName)
	{
#ifdef __WINS__

	RLibrary lib;
	lib.Load(aFileName);
	TLibraryFunction fn = lib.Lookup(1);

	return fn();
#else
	// set up waiting apparatus
	TRequestStatus status;
	TServerStartSignal signal(status);
	
	RProcess server;
	TInt err = server.Create( aFileName
		                    , TPckg<TServerStartSignal>(signal)
						    , TUidType(KNullUid, KNullUid, KNullUid)
						    , EOwnerThread
						    );
	
	if (!err)
		{
		return err;
		}

	server.Resume();
	server.Close();
	// wait for launch to complete
	User::WaitForRequest(status);
	
	return status.Int();
#endif
	}
#endif

// Return the client side version number.
EXPORT_C TVersion RHTTPServer::Version(void) const
	{
	return TVersion(KPGPServMajorVersionNumber, KPGPServMinorVersionNumber, KPGPServBuildVersionNumber);
	}


// Connect to the  server
EXPORT_C void RHTTPServer::ConnectL()
	{
	TInt err = CreateSession(KServerName, Version(), KMessageSlotsRequired);
	if (!err)
		{
		return; // session created
		}

	if (err != KErrNotFound && err != KErrServerTerminated)
		{
		User::LeaveIfError(err);	// pass other errors out
		}

	err = LoadAndStartServer(KServerFileName);

	if (!err || err == KErrAlreadyExists)
		{
		err = CreateSession(KServerName, Version(), KMessageSlotsRequired);
		}

	User::LeaveIfError(err);
	}


EXPORT_C void RHTTPServer::StartServer(TRequestStatus& aStatus, TUint32 aAddr, TInt aPort)
	{
	TAny *p[KMaxMessageArguments];
	p[0] = (TAny*) aAddr;
	p[1] = (TAny*) aPort;

	SendReceive(KStartHTTPServer,&p[0], aStatus);
	}


EXPORT_C TInt RHTTPServer::StopServer()
	{
	TAny *p[KMaxMessageArguments];
	return SendReceive(KStopHTTPServer,&p[0]);
	}


EXPORT_C TInt RHTTPServer::CancelCurrentCommand()
	{
	return KErrNone;
	}

// DLL entry point
GLDEF_C TInt E32Dll(TDllReason /*aReason*/)
	{
	return(KErrNone);
   	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -