📄 serverconfig.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 + -