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

📄 dsmpcc.cpp

📁 Simple Module Procedure Call for windows & QNx
💻 CPP
字号:
#include <smpc/dsmpcsrv.h>
#include <smpc/dsmpcc.h>


class CSmpcServer : public DSmpcServer
{
 private:
  SmpcServer* server;

 public:
  CSmpcServer(dword sid, SmpcServer* _server) : DSmpcServer(sid) { server = _server; }
  ~CSmpcServer() { if(server && server->kill) server->kill(server); }

  virtual int Call(dword proc, void* sd, dword snd, void* rd, dword& rcv)
  {
   return (server && server->serv && proc != Smpc_Proc_About) ?
    server->serv(server,proc,sd,snd,rd,&rcv) :
    DSmpcServer::Call(proc,sd,snd,rd,rcv);
  }

  virtual void PostCall(dword proc, int err)
  {
   DSmpcServer::PostCall(proc,err);
   if(server && server->post) server->post(server,proc,err);
  }

  dword Type(void) const { return server ? server->type : 0; }

  char* About(void) const
  { return (server && server->about) ? server->about : DSmpcServer::About(); }
};


const char* smpc_error_strings[] = {
 "Success",
 "Server not found",
 "Procedure not found",
 "Input data size error",
 "Output data size error",
 "System error",
 "Call timeout",
 "Wrong server type"
};

const char* cdecl smpc_error(int err)
{
 return err < Smpc_Success || err > Smpc_Err_Type ? "Unknown" : smpc_error_strings[err];
}

Smpc cdecl smpc_create(void)
{
 return (Smpc)CreateSmpc();
}

void cdecl smpc_delete(Smpc smpc)
{
 delete (DSmpc*)smpc;
}

int cdecl smpc_call(Smpc smpc, dword sid, dword* type, dword proc,
 DSmpcParam* sp, dword snd, DSmpcParam* rp, dword rcv)
{
 return ((DSmpc*)smpc)->Call(sid,*type,proc,sp,snd,rp,rcv);
}

int cdecl smpc_about(Smpc smpc, dword sid, dword* type, char* str, dword len)
{
 DSmpcParam rp = {str,len};
 int err = ((DSmpc*)smpc)->Call(sid,*type,Smpc_Proc_About,0,0,&rp,1);
 if(err == Smpc_Err_Type) {
  SmpcSet(&rp,str,len);
  err = ((DSmpc*)smpc)->Call(sid,*type,Smpc_Proc_About,0,0,&rp,1);
 }
 if(err == Smpc_Success) { if(!rp.size && len) str[0] = 0; }
 return err;
}

int cdecl smpc_add(Smpc smpc, dword sid, SmpcServer* server)
{
 CSmpcServer* srv = new CSmpcServer(sid,server);
 if(!((DSmpc*)smpc)->add(srv)) { if(srv) delete srv; return 0; }
 return 1;
}

int cdecl smpc_sub(Smpc smpc, dword sid)
{
 DSmpcServer* srv = ((DSmpc*)smpc)->GetSrv(sid);
 if(srv) { delete srv; return 1; }
 return 0;
}

int cdecl smpc_sid(Smpc smpc, dword sid, dword nsid)
{
 DSmpcServer* srv = ((DSmpc*)smpc)->GetSrv(sid);
 if(!srv) return 0;
 srv->Sid(nsid);
 return srv->Smpc() != 0;
}

int cdecl smpc_run(Smpc smpc)
{
 return ((DSmpc*)smpc)->Run();
}

⌨️ 快捷键说明

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