远程调用内核接口的封装类(RCKObjs)
Posted mqxnongmin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了远程调用内核接口的封装类(RCKObjs)相关的知识,希望对你有一定的参考价值。
RCK 包括 Application, Function, Connection, Command, Response 和 Fields 六
大类, 其主要功能例如以下:
??? a. Application 类主要负责 Function 的组织和 Response 的分发运行;
??? b. Function??? 类主要负责 Function 的定义及按各模式调用;
??? c. Connection? 类主要负责登录对端应用, Command 请求运行, Response 应答管理,
?????? 以及发送和接收数据等等;
??? d. Command???? 类主要负责函数參数传入, 以及返回值和返回字段值读取;
??? e. Response??? 类主要负责对端指定 Function 请求的运行处理, 如參数读取、返回
?????? 值编辑及提交;
??? f. Fields????? 类主要负责数据库字段值及定义集的组包和拆包。
?
封装类的头文件(RCKObjs.h)
?
// =======================================
// Unit : RCKernel objects
// Version: 5.0.0.0 (build 2014.07.07)
// Author : Kyee Ye
// Email : kyee_ye(at)126.com
// Copyright (C) Kyee workroom
// =======================================
#ifndef _RCKObjs_H_
#define _RCKObjs_H_
#include "KYLib.h"
#include "RCKernel.h"
// 使用 RCKernel 的命名空间
namespace RCKernel
{
namespace __object__
{
/* begin namespace */
class TRCAppObj;
class TRCFuncObj;
class TRCConnObj;
class TRCCmdObj;
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 初始化/释放单元 */
// 初始化/释放 RCKObjs 单元(注: 内部有引用计数)
void InitRCKObjs();
void FreeRCKObjs(bool AForced = false);
// ID -> 对象
TRCCmdObj* CmdID2Object(void* ACmdID); // 命令ID -> 对象
TRCFuncObj* FuncID2Object(void* AFuncID); // 函数ID -> 对象
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 应用对象(TRCAppObj)的相关函数 */
// 创建/释放应用对象
TRCAppObj* CreateAppObj(const char* AName, const char* APassword, long* ARetCode = NULL);
void FreeAppObj(TRCAppObj* AppObj);
// 应用对象引用计数增 1
TRCAppObj* IncRefAppObj(void* AppID);
bool IncRefAppObj_(TRCAppObj* AppObj);
// 应用对象引用计数增/减 1(注: AppObj 对象必须存在)
void IncRefAppObj(TRCAppObj* AppObj);
void DecRefAppObj(TRCAppObj* AppObj);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 连接对象(TRCConnObj)的相关函数 */
// 创建/释放连接对象(注: AConnID 必须存在)
TRCConnObj* CreateConnObj(void* AConnID, bool ANeedFree, long* ARetCode = NULL);
void FreeConnObj(TRCConnObj* AConnObj);
// 连接对象引用计数增 1
TRCConnObj* IncRefConnObj(void* AConnID);
bool IncRefConnObj_(TRCConnObj* AConnObj);
// 连接对象引用计数增/减 1(注: AConnObj 对象必须存在)
void IncRefConnObj(TRCConnObj* AConnObj);
void DecRefConnObj(TRCConnObj* AConnObj);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 命令对象(TRCCmdObj)的相关函数 */
// 创建/释放命令对象(注: AConnObj 必须存在)
TRCCmdObj* CreateCmdObj(void* AConnID = NULL);
TRCCmdObj* CreateCmdObj(TRCConnObj* AConnObj);
void FreeCmdObj(TRCCmdObj* ACmdObj);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TRCAppObj - RCK 应用类 */
class TRCAppObj
{
private:
// 映射列表类型
typedef TKYMapObjKey<void> TObjList;
public:
// 连接登录事件
typedef void (TObject::*TDoConnLogin)(TRCAppObj* AppObj, void* AConnID, bool& AIsRefused);
typedef struct
{
TDoConnLogin Method;
void* Object;
} TOnConnLogin;
// 连接登出事件
typedef void (TObject::*TDoConnLogout)(TRCAppObj* AppObj, void* AConnID);
typedef struct
{
TDoConnLogout Method;
void* Object;
} TOnConnLogout;
// 应答事件
typedef void (TObject::*TDoRespEvent)(TRCAppObj* AppObj, void* AFuncID, void* AConnID);
typedef struct
{
TDoRespEvent Method;
void* Object;
} TOnRespEvent;
// 函数释放事件
typedef void (TObject::*TDoFuncFree)(TRCAppObj* AppObj, TRCFuncObj* AFuncObj);
typedef struct
{
TDoFuncFree Method;
void* Object;
} TOnFuncFree;
public:
TRCAppObj();
virtual ~TRCAppObj();
// 属性
void* Data() const { return FData; }
KYString Name() const { return FName; }
void* AppID() const { return FAppID; }
long State() const { return RCKAppGetInt(FAppID, kaaState, NULL); }
long FuncCount() const { return RCKAppGetInt(FAppID, kaaFuncCount, NULL); }
long ConnCount() const { return RCKAppGetInt(FAppID, kaaConnCount, NULL); }
long MaxThreads() const { return RCKAppGetInt(FAppID, kaaMaxThreads, NULL); }
long MaxConnCount() const { return RCKAppGetInt(FAppID, kaaMaxConnCount, NULL); }
// 设置属性
void SetData(void* AData) { FData = AData; }
long SetName(const KYString& AName);
long SetPassword(const char* APassword, long ALength)
{ return RCKAppSetStr(FAppID, kaaPassword, APassword, ALength); }
long SetPassword(const KYString& APassword)
{ return SetPassword((char*)APassword, APassword.Length()); }
long SetMaxThreads(long ACount)
{ return RCKAppSetInt(FAppID, kaaMaxThreads, ACount); }
long SetMaxConnCount(long ACount)
{ return RCKAppSetInt(FAppID, kaaMaxConnCount, ACount); }
// 读取应用的连接/函数
void* ConnID(long AIndex) const
{ return RCKAppGetObj(FAppID, kaaBaseConnObj + AIndex, NULL); }
void* FuncID(long AIndex) const
{ return RCKAppGetObj(FAppID, kaaBaseFuncObj + AIndex, NULL); }
void* FuncID(const char* AName) const
{ return RCKAppFuncObj(FAppID, AName); }
char* FuncName(long AIndex) const
{ return RCKAppGetStr(FAppID, kaaBaseFuncName + AIndex, NULL); }
// 開始/结束函数定义
long BeginDefs() { return RCKAppFuncBegin(FAppID); }
long EndDefs() { return RCKAppFuncEnd(FAppID); }
// 新建/删除/清除函数定义
TRCFuncObj* NewFuncObj(const char* AName, long ARetType, long ARetSize,
long ACallMode, void* ACallback);
bool DeleteFuncObj(TRCFuncObj* AFuncObj);
void ClearFuncObjs();
// 打开/关闭应用/强制注销应用的连接
long Open() { return RCKAppOpen(FAppID); }
long Close() { return RCKAppClose(FAppID); }
long Logout(void* AConnID){ return RCKAppLogout(FAppID, AConnID); }
// 设置事件
long SetOnConnLogin(TDoConnLogin AMethod, void* AObject);
long SetOnConnLogout(TDoConnLogout AMethod, void* AObject);
long SetOnExecResp(TDoRespEvent AMethod, void* AObject);
long SetOnRespCancel(TDoRespEvent AMethod, void* AObject);
long SetOnRespConfirm(TDoRespEvent AMethod, void* AObject);
// 事件
TOnFuncFree OnFuncFree;
protected:
// 当前锁
void Lock() const { FLock->Enter(); }
void Unlock() const { FLock->Leave(); }
// 对象次数增/减 1
long IncObjTimes() { return InterlockedIncrement(&FObjTimes); }
long DecObjTimes() { return InterlockedDecrement(&FObjTimes); }
private:
// 运行初始化事件/清除函数列表
void DoInitEvent();
void DoClearFuncObjs();
// 运行事件方法
void DoConnLogin(void* AConnID, bool& AIsRefused);
void DoConnLogout(void* AConnID);
void DoExecResp(void* AFuncID, void* AConnID);
void DoRespCancel(void* AFuncID, void* AConnID);
void DoRespConfirm(void* AFuncID, void* AConnID);
// 事件方法
void DoIDDeletion(void* AFuncID);
void DoObjDeletion(TRCFuncObj* AFuncObj);
private:
void* FData; // 自己定义数据
TKYCritSect* FLock; // 当前锁
KYString FName; // 应用名
void* FAppID; // 应用 ID
long FObjTimes; // 对象引用次数
TObjList* FFuncList; // 函数列表
// 事件
TOnConnLogin FOnConnLogin; // 连接登录
TOnConnLogout FOnConnLogout; // 连接登出
TOnRespEvent FOnExecResp; // 运行应答
TOnRespEvent FOnRespCancel; // 应答已取消
TOnRespEvent FOnRespConfirm; // 应答已确认
private:
// 应用事件的回调函数
static void __stdcall _RCKOnConnLogin(void* AppID, void* AConnID, bool& AIsRefused);
static void __stdcall _RCKOnConnLogout(void* AppID, void* AConnID);
static void __stdcall _RCKOnExecResp(void* AppID, void* AFuncID, void* AConnID);
static void __stdcall _RCKOnRespCancel(void* AppID, void* AFuncID, void* AConnID);
static void __stdcall _RCKOnRespConfirm(void* AppID, void* AFuncID, void* AConnID);
private:
friend class TRCKObjs;
};
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TRCFuncObj - RCK 函数类 */
class TRCFuncObj
{
public:
TRCFuncObj();
virtual ~TRCFuncObj();
// 属性
void* Data() const { return FData; }
KYString Name() const { return FName; }
void* FuncID() const { return FFuncID; }
TRCAppObj* AppObj() const { return FAppObj; }
bool Active() const { return RCKFuncGetInt(FFuncID, kfaActive, NULL) == 1; }
long RetType() const { return RCKFuncGetInt(FFuncID, kfaRetType, NULL); }
long RetSize() const { return RCKFuncGetInt(FFuncID, kfaRetSize, NULL); }
long CallMode() const { return RCKFuncGetInt(FFuncID, kfaCallMode, NULL); }
void* Callback() const { return RCKFuncGetObj(FFuncID, kfaCallback, NULL); }
bool NeedConfirm() const { return RCKFuncGetInt(FFuncID, kfaNeedConfirm, NULL) == 1; }
bool NeedEncrypt() const { return RCKFuncGetInt(FFuncID, kfaNeedEncrypt, NULL) == 1; }
// 设置属性
void SetData(void* AData) { FData = AData; }
long SetNeedConfirm(bool ANeed)
{ return RCKFuncSetInt(FFuncID, kfaNeedConfirm, ANeed); }
long SetNeedEncrypt(bool ANeed)
{ return RCKFuncSetInt(FFuncID, kfaNeedEncrypt, ANeed); }
// 读取參数定义
long ParamCount() const { return RCKFuncGetInt(FFuncID, kfaParamCount, NULL); }
long ParamIndex(const char* AName) const
{ return RCKFuncParamIndex(FFuncID, AName); }
long ParamIndex(const KYString& AName) const
{ return RCKFuncParamIndex(FFuncID, (char*)AName); }
KYString ParamName(long AIndex) const
{ return RCKFuncGetStr(FFuncID, kfaBaseParamName + AIndex, NULL); }
long ParamType(long AIndex) const
{ return RCKFuncGetInt(FFuncID, kfaBaseParamType + AIndex, NULL); }
long ParamSize(long AIndex) const
{ return RCKFuncGetInt(FFuncID, kfaBaseParamSize + AIndex, NULL); }
bool ParamIsRef(long AIndex) const
{ return RCKFuncGetInt(FFuncID, kfaBaseParamIsRef + AIndex, NULL) == 1; }
// 读取返回字段定义
long FieldCount() const { return RCKFuncGetInt(FFuncID, kfaFieldCount, NULL); }
long FieldIndex(const char* AName) const
{ return RCKFuncFieldIndex(FFuncID, AName); }
long FieldIndex(const KYString& AName) const
{ return RCKFuncFieldIndex(FFuncID, (char*)AName); }
KYString FieldName(long AIndex) const
{ return RCKFuncGetStr(FFuncID, kfaBaseFieldName + AIndex, NULL); }
long FieldType(long AIndex) const
{ return RCKFuncGetInt(FFuncID, kfaBaseFieldType + AIndex, NULL); }
long FieldSize(long AIndex) const
{ return RCKFuncGetInt(FFuncID, kfaBaseFieldSize + AIndex, NULL); }
// 加入參数
long AddParam(const char* AName, long AType, long ASize = 0, bool AIsRef = false)
{ return RCKFuncAddParam(FFuncID, AName, AType, ASize, AIsRef); }
long AddParam(const KYString& AName, long AType, long ASize = 0, bool AIsRef = false)
{ return RCKFuncAddParam(FFuncID, (char*)AName, AType, ASize, AIsRef); }
// 加入返回字段
long AddField(const char* AName, long AType, long ASize = 0)
{ return RCKFuncAddField(FFuncID, AName, AType, ASize); }
long AddField(const KYString& AName, long AType, long ASize = 0)
{ return RCKFuncAddField(FFuncID, (char*)AName, AType, ASize); }
private:
void* FData; // 自己定义数据
KYString FName; // 函数名
void* FFuncID; // 函数 ID
TRCAppObj* FAppObj; // 应用对象
private:
friend class TRCKObjs;
friend class TRCAppObj;
};
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TRCConnObj - RCK 连接类 */
class TRCConnObj
{
public:
// 连接通知事件
typedef void (TObject::*TDoNotify)(TRCConnObj* AConnObj);
typedef struct
{
TDoNotify Method;
void* Object;
} TOnNotify;
// 连接命令返回事件
typedef void (TObject::*TDoCmdReturn)(TRCConnObj* AConnObj, void* ACmdID, long AResult);
typedef struct
{
TDoCmdReturn Method;
void* Object;
} TOnCmdReturn;
// 接收自己定义数据事件
typedef void (TObject::*TDoRecvData)(TRCConnObj* AConnObj, const void* AData, long ASize);
typedef struct
{
TDoRecvData Method;
void* Object;
} TOnRecvData;
public:
TRCConnObj(void* AConnID = NULL, bool ANeedFree = false);
virtual ~TRCConnObj();
// 属性
void* Data() const { return FData; }
void* ConnID() const { return FConnID; }
bool CanEvent() const { return FCanEvent; }
bool NeedFree() const { return FNeedFree; }
KYString Error() const { return RCKConnGetStr(FConnID, kcaError, NULL); }
long Type() const { return RCKConnGetInt(FConnID, kcaType, NULL); }
long State() const { return RCKConnGetInt(FConnID, kcaState, NULL); }
long Timeout() const { return RCKConnGetInt(FConnID, kcaTimeout, NULL); }
void* SlotObj() const { return RCKConnGetObj(FConnID, kcaSlotObj, NULL); }
bool CanLogin() const { return RCKConnGetInt(FConnID, kcaCanLogin, NULL) == 1; }
bool CanBindApp() const { return RCKConnGetInt(FConnID, kcaCanBindApp, NULL) == 1; }
bool IsSyncLink() const { return RCKConnGetInt(FConnID, kcaIsSyncLink, NULL) == 1; }
void* BindAppObj() const { return RCKConnGetObj(FConnID, kcaBindAppObj, NULL); }
long BindTimeout() const { return RCKConnGetInt(FConnID, kcaBindTimeout, NULL); }
long SlotTimeout() const { return RCKConnGetInt(FConnID, kcaSlotTimeout, NULL); }
long SlotMaxSize() const { return RCKConnGetInt(FConnID, kcaSlotMaxSize, NULL); }
long SendQueueSize() const{ return RCKConnGetInt(FConnID, kcaSendQueueSize, NULL); }
KYString AppName() const { return RCKConnGetStr(FConnID, kcaAppName, NULL); }
KYString CurrAddr() const { return RCKConnGetStr(FConnID, kcaCurrAddr, NULL); }
long CurrPort() const { return RCKConnGetInt(FConnID, kcaCurrPort, NULL); }
KYString PeerAddr() const { return RCKConnGetStr(FConnID, kcaPeerAddr, NULL); }
long PeerPort() const { return RCKConnGetInt(FConnID, kcaPeerPort, NULL); }
long LastTick() const { return RCKConnGetInt(FConnID, kcaLastTick, NULL); }
long KeepTimeout() const { return RCKConnGetInt(FConnID, kcaKeepTimeout, NULL); }
long KeepInterval() const { return RCKConnGetInt(FConnID, kcaKeepInterval, NULL); }
long KeepRetryTimes()const{ return RCKConnGetInt(FConnID, kcaKeepRetryTimes, NULL); }
long FuncCount() const { return RCKConnGetInt(FConnID, kcaFuncCount, NULL); }
KYString FuncName(long AIndex) const
{ return RCKConnGetStr(FConnID, kcaBaseFuncName + AIndex, NULL); }
// 设置属性
void SetData(void* AData) { FData = AData; }
long SetTimeout(long ATimeout)
{ return RCKConnSetInt(FConnID, kcaTimeout, ATimeout); }
long SetCanLogin(bool ACanLogin)
{ return RCKConnSetInt(FConnID, kcaCanLogin, ACanLogin); }
long SetCanBindApp(bool ACanBindApp)
{ return RCKConnSetInt(FConnID, kcaCanBindApp, ACanBindApp); }
long SetBindTimeout(long ATimeout)
{ return RCKConnSetInt(FConnID, kcaBindTimeout, ATimeout); }
long SetIsSyncLink(bool AIsSyncLink)
{ return RCKConnSetInt(FConnID, kcaIsSyncLink, AIsSyncLink); }
long SetSlotTimeout(long ATimeout)
{ return RCKConnSetInt(FConnID, kcaSlotTimeout, ATimeout); }
long SetSlotMaxSize(long AMaxSize)
{ return RCKConnSetInt(FConnID, kcaSlotMaxSize, AMaxSize); }
long SetSendQueueSize(long AQueueSize)
{ return RCKConnSetInt(FConnID, kcaSendQueueSize, AQueueSize); }
long SetAppName(const char* AName, long ALength)
{ return RCKConnSetStr(FConnID, kcaAppName, AName, ALength); }
long SetAppName(const KYString& AName)
{ return SetAppName((char*)AName, AName.Length()); }
long SetAppPass(const char* APassword, long ALength)
{ return RCKConnSetStr(FConnID, kcaAppPass, APassword, ALength); }
long SetAppPass(const KYString& APassword)
{ return SetAppPass((char*)APassword, APassword.Length()); }
long SetCurrAddr(const char* Addr, long ALength)
{ return RCKConnSetStr(FConnID, kcaCurrAddr, Addr, ALength); }
long SetCurrAddr(const KYString& Addr)
{ return SetCurrAddr((char*)Addr, Addr.Length()); }
long SetCurrPort(long APort)
{ return RCKConnSetInt(FConnID, kcaCurrPort, APort); }
long SetPeerAddr(const char* Addr, long ALength)
{ return RCKConnSetStr(FConnID, kcaPeerAddr, Addr, ALength); }
long SetPeerAddr(const KYString& Addr)
{ return SetPeerAddr((char*)Addr, Addr.Length()); }
long SetPeerPort(long APort)
{ return RCKConnSetInt(FConnID, kcaPeerPort, APort); }
long SetKeepTimeout(long ATimeout)
{ return RCKConnSetInt(FConnID, kcaKeepTimeout, ATimeout); }
long SetKeepInterval(long AInterval)
{ return RCKConnSetInt(FConnID, kcaKeepInterval, AInterval); }
long SetKeepRetryTimes(long ARetryTimes)
{ return RCKConnSetInt(FConnID, kcaKeepRetryTimes, ARetryTimes); }
// slot 扩展属性
bool SlotExtBool(long AExt) const
{ return RCKConnGetInt(FConnID, kcaBaseSlotExt + AExt, NULL) == 1; }
long SlotExtInt(long AExt) const
{ return RCKConnGetInt(FConnID, kcaBaseSlotExt + AExt, NULL); }
void* SlotExtObj(long AExt) const
{ return RCKConnGetObj(FConnID, kcaBaseSlotExt + AExt, NULL); }
char* SlotExtStr(long AExt, long* ARetSize = NULL) const
{ return RCKConnGetStr(FConnID, kcaBaseSlotExt + AExt, ARetSize); }
// 设置 slot 扩展属性
long SetSlotExtInt(long AExt, long AValue)
{ return RCKConnSetInt(FConnID, kcaBaseSlotExt + AExt, AValue); }
long SetSlotExtObj(long AExt, void* AValue)
{ return RCKConnSetObj(FConnID, kcaBaseSlotExt + AExt, AValue); }
long SetSlotExtStr(long AExt, const char* AValue, long ASize)
{ return RCKConnSetStr(FConnID, kcaBaseSlotExt + AExt, AValue, ASize); }
// 打开/关闭连接
long Open() { return RCKConnOpen(FConnID); }
long Close() { return RCKConnClose(FConnID); }
// 登录/登出对端应用
long Login() { return RCKConnLogin(FConnID); }
long Logout() { return RCKConnLogout(FConnID); }
// 载入对端应用的函数列表
long LoadDefs() { return RCKConnLoad(FConnID); }
// 发送数据(參数 ANeedPack 表示数据是否须要压缩发送)
long SendData(const void* AData, long ASize, bool ANeedPack)
{ return RCKConnSendData(FConnID, AData, ASize, ANeedPack); }
// 设置事件
long SetOnConnect(TDoNotify AMethod, void* AObject);
long SetOnDisconnect(TDoNotify AMethod, void* AObject);
long SetOnLogin(TDoNotify AMethod, void* AObject);
long SetOnLogout(TDoNotify AMethod, void* AObject);
long SetOnCmdReturn(TDoCmdReturn AMethod, void* AObject);
long SetOnRecvData(TDoRecvData AMethod, void* AObject);
protected:
// 对象次数增/减 1
long IncObjTimes() { return InterlockedIncrement(&FObjTimes); }
long DecObjTimes() { return InterlockedDecrement(&FObjTimes); }
private:
// 运行初始化事件
void DoInitEvent();
// 运行事件方法
void DoConnect();
void DoDisconnect();
void DoLogin();
void DoLogout();
void DoCmdReturn(void* ACmdID, long AResult);
void DoRecvData(const void* AData, long ASize);
private:
void* FData; // 自己定义数据
void* FConnID; // 连接 ID
long FObjTimes; // 对象引用次数
bool FCanEvent; // 是否可以事件(注: CreateConnObj 创建才可以)
bool FNeedFree; // 是否须要释放
// 事件
TOnNotify FOnConnect; // 连接成功
TOnNotify FOnDisconnect; // 断开连接
TOnNotify FOnLogin; // 登录对端应用
TOnNotify FOnLogout; // 登出对端应用
TOnCmdReturn FOnCmdReturn; // 命令返回
TOnRecvData FOnRecvData; // 接收数据
private:
// 连接事件的回调函数
static void __stdcall _RCKOnConnect(void* AConnID);
static void __stdcall _RCKOnDisconnect(void* AConnID);
static void __stdcall _RCKOnLogin(void* AConnID);
static void __stdcall _RCKOnLogout(void* AConnID);
static void __stdcall _RCKOnCmdReturn(void* AConnID, void* ACmdID, long AResult);
static void __stdcall _RCKOnRecvData(void* AConnID, const void* AData, long ASize);
private:
friend class TRCKObjs;
};
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TRCCmdObj - RCK 命令类 */
class TRCCmdObj
{
public:
TRCCmdObj();
virtual ~TRCCmdObj();
// 属性
void* Data() const { return FData; }
KYString Name() const { return RCKCmdGetStr(FCmdID, kmaName, NULL); }
long State() const { return RCKCmdGetInt(FCmdID, kmaState, NULL); }
void* CmdID() const { return FCmdID; }
void* ConnID() const { return RCKCmdGetObj(FCmdID, kmaConnObj, NULL); }
TRCConnObj* ConnObj() const;
long RetType() const { return RCKCmdGetInt(FCmdID, kmaRetType, NULL); }
long RetSize() const { return RCKCmdGetInt(FCmdID, kmaRetSize, NULL); }
bool Encrypted() const { return RCKCmdGetInt(FCmdID, kmaEncrypted, NULL) == 1; }
bool AppIsValid() const { return RCKCmdGetInt(FCmdID, kmaAppIsValid, NULL) == 1; }
long ExecResult() const { return RCKCmdGetInt(FCmdID, kmaExecResult, NULL); }
// 读取參数定义
long ParamCount() const { return RCKCmdGetInt(FCmdID, kmaParamCount, NULL); }
long ParamIndex(const char* AName) const
{ return RCKCmdParamIndex(FCmdID, AName); }
long ParamIndex(const KYString& AName) const
{ return RCKCmdParamIndex(FCmdID, (char*)AName); }
KYString ParamName(long AIndex) const
{ return RCKCmdGetStr(FCmdID, kmaBaseParamName + AIndex, NULL); }
long ParamType(long AIndex) const
{ return RCKCmdGetInt(FCmdID, kmaBaseParamType + AIndex, NULL); }
long ParamSize(long AIndex) const
{ return RCKCmdGetInt(FCmdID, kmaBaseParamSize + AIndex, NULL); }
// 读取返回字段定义
long FieldCount() const { return RCKCmdGetInt(FCmdID, kmaFieldCount, NULL); }
long FieldIndex(const char* AName) const
{ return RCKCmdFieldIndex(FCmdID, AName); }
long FieldIndex(const KYString& AName) const
{ return RCKCmdFieldIndex(FCmdID, (char*)AName); }
KYString FieldName(long AIndex) const
{ return RCKCmdGetStr(FCmdID, kmaBaseFieldName + AIndex, NULL); }
long FieldType(long AIndex) const
{ return RCKCmdGetInt(FCmdID, kmaBaseFieldType + AIndex, NULL); }
long FieldSize(long AIndex) const
{ return RCKCmdGetInt(FCmdID, kmaBaseFieldSize + AIndex, NULL); }
bool FieldIsNull(long AIndex) const
{ return RCKCmdFieldIsNull(FCmdID, AIndex, NULL); }
bool FieldIsNull(const char* AName) const
{ return RCKCmdFieldIsNull_(FCmdID, AName, NULL); }
bool FieldIsNull(const KYString& AName) const
{ return RCKCmdFieldIsNull_(FCmdID, (char*)AName, NULL); }
// 设置属性
void SetData(void* AData) { FData = AData; }
long SetConnID(void* AConnID) const
{ return RCKCmdSetObj(FCmdID, kmaConnObj, AConnID); }
long SetConnObj(TRCConnObj* AConnObj) const
{ return RCKCmdSetObj(FCmdID, kmaConnObj, (AConnObj != NULL)
? AConnObj->ConnID() : NULL); }
// 開始命令
long Begin(const char* AName) const
{ return RCKCmdBegin(FCmdID, AName); }
long Begin(const KYString& AName) const
{ return RCKCmdBegin(FCmdID, (char*)AName); }
// 结束命令/又一次開始命令
long End() const { return RCKCmdEnd(FCmdID); }
long Restart() const { return RCKCmdRestart(FCmdID); }
// 运行命令
long Execute(Longword ATimeout) const
{ return RCKCmdExecute(FCmdID, ATimeout); }
long ExecByParams(Longword ATimeout, ...) const;
// 清除当前命令參数值
long ParamClear() const { return RCKCmdParamClear(FCmdID); }
// 设置各类型參数值的相关方法
long ParamByStr(long AIndex, const char* AValue, long ASize = -1) const
{ return RCKCmdParamByStr(FCmdID, AIndex, AValue, ASize); }
long ParamByStr(long AIndex, const KYString& AValue) const
{ return RCKCmdParamByStr(FCmdID, AIndex, (char*)AValue, AValue.Length()); }
long ParamByStr(const char* AName, const KYString& AValue) const
{ return RCKCmdParamByStr_(FCmdID, AName, (char*)AValue, AValue.Length()); }
long ParamByStr(const KYString& AName, const KYString& AValue) const
{ return RCKCmdParamByStr_(FCmdID, (char*)AName,
(char*)AValue, AValue.Length()); }
long ParamByInt(long AIndex, long AValue) const
{ return RCKCmdParamByInt(FCmdID, AIndex, AValue); }
long ParamByInt(const char* AName, long AValue) const
{ return RCKCmdParamByInt_(FCmdID, AName, AValue); }
long ParamByInt(const KYString& AName, long AValue) const
{ return RCKCmdParamByInt_(FCmdID, (char*)AName, AValue); }
long ParamByBool(long AIndex, bool AValue) const
{ return RCKCmdParamByBool(FCmdID, AIndex, AValue); }
long ParamByBool(const char* AName, bool AValue) const
{ return RCKCmdParamByBool_(FCmdID, AName, AValue); }
long ParamByBool(const KYString& AName, bool AValue) const
{ return RCKCmdParamByBool_(FCmdID, (char*)AName, AValue); }
long ParamByFloat(long AIndex, double AValue) const
{ return RCKCmdParamByFloat(FCmdID, AIndex, AValue); }
long ParamByFloat(const char* AName, double AValue) const
{ return RCKCmdParamByFloat_(FCmdID, AName, AValue); }
long ParamByFloat(const KYString& AName, double AValue) const
{ return RCKCmdParamByFloat_(FCmdID, (char*)AName, AValue); }
long ParamByStruct(long AIndex, void* AValue) const
{ return RCKCmdParamByStruct(FCmdID, AIndex, AValue); }
long ParamByStruct(const char* AName, void* AValue) const
{ return RCKCmdParamByStruct_(FCmdID, AName, AValue); }
long ParamByStruct(const KYString& AName, void* AValue) const
{ return RCKCmdParamByStruct_(FCmdID, (char*)AName, AValue); }
long ParamByInt64(long AIndex, __int64 AValue) const
{ return RCKCmdParamByInt64(FCmdID, AIndex, AValue); }
long ParamByInt64(const char* AName, __int64 AValue) const
{ return RCKCmdParamByInt64_(FCmdID, AName, AValue); }
long ParamByInt64(const KYString& AName, __int64 AValue) const
{ return RCKCmdParamByInt64_(FCmdID, (char*)AName, AValue); }
long ParamByDate(long AIndex, TDateTime AValue) const
{ return RCKCmdParamByDate(FCmdID, AIndex, AValue); }
long ParamByDate(const char* AName, TDateTime AValue) const
{ return RCKCmdParamByDate_(FCmdID, AName, AValue); }
long ParamByDate(const KYString& AName, TDateTime AValue) const
{ return RCKCmdParamByDate_(FCmdID, (char*)AName, AValue); }
long ParamByCustom(long AIndex, const void* AValue, long ASize) const
{ return RCKCmdParamByCustom(FCmdID, AIndex, AValue, ASize); }
long ParamByCustom(const char* AName, const void* AValue, long ASize) const
{ return RCKCmdParamByCustom_(FCmdID, AName, AValue, ASize); }
long ParamByCustom(const KYString& AName, const void* AValue, long ASize) const
{ return RCKCmdParamByCustom_(FCmdID, (char*)AName, AValue, ASize); }
// 取各类型返回值的相关方法
KYString RetAsStr() const;
char* RetAsStr(long& ASize) const
{ return RCKCmdRetStr(FCmdID, &ASize); }
long RetAsInt() const { return RCKCmdRetInt(FCmdID, NULL); }
bool RetAsBool() const { return RCKCmdRetBool(FCmdID, NULL); }
double RetAsFloat() const { return RCKCmdRetFloat(FCmdID, NULL); }
void* RetAsStruct() const { return RCKCmdRetStruct(FCmdID, NULL); }
__int64 RetAsInt64() const { return RCKCmdRetInt64(FCmdID, NULL); }
TDateTime RetAsDate() const { return RCKCmdRetDate(FCmdID, NULL); }
long RetAsCustom(void* AValue, long ASize) const
{ return RCKCmdRetCustom(FCmdID, AValue, ASize); }
// 取各类型返回字段值的相关方法
KYString FieldAsStr(long AIndex) const;
KYString FieldAsStr(const char* AName) const;
KYString FieldAsStr(const KYString& AName) const
{ return FieldAsStr((char*)AName); }
char* FieldAsStr(long AIndex, long& ASize) const
{ return RCKCmdFieldStr(FCmdID, AIndex, &ASize); }
char* FieldAsStr(const char* AName, long& ASize) const
{ return RCKCmdFieldStr_(FCmdID, AName, &ASize); }
long FieldAsInt(long AIndex) const
{ return RCKCmdFieldInt(FCmdID, AIndex, NULL); }
long FieldAsInt(const char* AName) const
{ return RCKCmdFieldInt_(FCmdID, AName, NULL); }
long FieldAsInt(const KYString& AName) const
{ return RCKCmdFieldInt_(FCmdID, (char*)AName, NULL); }
bool FieldAsBool(long AIndex) const
{ return RCKCmdFieldBool(FCmdID, AIndex, NULL); }
bool FieldAsBool(const char* AName) const
{ return RCKCmdFieldBool_(FCmdID, AName, NULL); }
bool FieldAsBool(const KYString& AName) const
{ return RCKCmdFieldBool_(FCmdID, (char*)AName, NULL); }
double FieldAsFloat(long AIndex) const
{ return RCKCmdFieldFloat(FCmdID, AIndex, NULL); }
double FieldAsFloat(const char* AName) const
{ return RCKCmdFieldFloat_(FCmdID, AName, NULL); }
double FieldAsFloat(const KYString& AName) const
{ return RCKCmdFieldFloat_(FCmdID, (char*)AName, NULL); }
void* FieldAsStruct(long AIndex) const
{ return RCKCmdFieldStruct(FCmdID, AIndex, NULL); }
void* FieldAsStruct(const char* AName) const
{ return RCKCmdFieldStruct_(FCmdID, AName, NULL); }
void* FieldAsStruct(const KYString& AName) const
{ return RCKCmdFieldStruct_(FCmdID, (char*)AName, NULL); }
__int64 FieldAsInt64(long AIndex) const
{ return RCKCmdFieldInt64(FCmdID, AIndex, NULL); }
__int64 FieldAsInt64(const char* AName) const
{ return RCKCmdFieldInt64_(FCmdID, AName, NULL); }
__int64 FieldAsInt64(const KYString& AName) const
{ return RCKCmdFieldInt64_(FCmdID, (char*)AName, NULL); }
TDateTime FieldAsDate(long AIndex) const
{ return RCKCmdFieldDate(FCmdID, AIndex, NULL); }
TDateTime FieldAsDate(const char* AName) const
{ return RCKCmdFieldDate_(FCmdID, AName, NULL); }
TDateTime FieldAsDate(const KYString& AName) const
{ return RCKCmdFieldDate_(FCmdID, (char*)AName, NULL); }
long FieldAsCustom(long AIndex, void* AValue, long ASize) const
{ return RCKCmdFieldCustom(FCmdID, AIndex, AValue, ASize); }
long FieldAsCustom(const char* AName, void* AValue, long ASize) const
{ return RCKCmdFieldCustom_(FCmdID, AName, AValue, ASize); }
long FieldAsCustom(const KYString& AName, void* AValue, long ASize) const
{ return RCKCmdFieldCustom_(FCmdID, (char*)AName, AValue, ASize); }
private:
void* FData; // 自己定义数据
void* FCmdID; // 命令 ID
};
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TRCResp - RCK 应答类 */
class TRCResp
{
public:
// 属性
static long State() { return RCKRespState(); }
static void* FuncID() { return RCKRespFuncObj(); }
static void* ConnID() { return RCKRespConnObj(); }
// 取各类型返回值的相关方法
static KYString RetAsStr();
static char* RetAsStr(long& ASize){ return RCKRespRetStr(&ASize); }
static long RetAsInt() { return RCKRespRetInt(NULL); }
static bool RetAsBool() { return RCKRespRetBool(NULL); }
static double RetAsFloat() { return RCKRespRetFloat(NULL); }
static void* RetAsStruct() { return RCKRespRetStruct(NULL); }
static __int64 RetAsInt64() { return RCKRespRetInt64(NULL); }
static TDateTime RetAsDate() { return RCKRespRetDate(NULL); }
static long RetAsCustom(void* AValue, long ASize)
{ return RCKRespRetCustom(AValue, ASize); }
// 取各类型返回字段值的相关方法
static KYString FieldAsStr(long AIndex);
static KYString FieldAsStr(const char* AName);
static KYString FieldAsStr(const KYString& AName)
{ return FieldAsStr((char*)AName); }
static char* FieldAsStr(long AIndex, long& ASize)
{ return RCKRespFieldStr(AIndex, &ASize); }
static char* FieldAsStr(const char* AName, long& ASize)
{ return RCKRespFieldStr_(AName, &ASize); }
static long FieldAsInt(long AIndex)
{ return RCKRespFieldInt(AIndex, NULL); }
static long FieldAsInt(const char* AName)
{ return RCKRespFieldInt_(AName, NULL); }
static long FieldAsInt(const KYString& AName)
{ return RCKRespFieldInt_((char*)AName, NULL); }
static bool FieldAsBool(long AIndex)
{ return RCKRespFieldBool(AIndex, NULL); }
static bool FieldAsBool(const char* AName)
{ return RCKRespFieldBool_(AName, NULL); }
static bool FieldAsBool(const KYString& AName)
{ return RCKRespFieldBool_((char*)AName, NULL); }
static double FieldAsFloat(long AIndex)
{ return RCKRespFieldFloat(AIndex, NULL); }
static double FieldAsFloat(const char* AName)
{ return RCKRespFieldFloat_(AName, NULL); }
static double FieldAsFloat(const KYString& AName)
{ return RCKRespFieldFloat_((char*)AName, NULL); }
static void* FieldAsStruct(long AIndex)
{ return RCKRespFieldStruct(AIndex, NULL); }
static void* FieldAsStruct(const char* AName)
{ return RCKRespFieldStruct_(AName, NULL); }
static void* FieldAsStruct(const KYString& AName)
{ return RCKRespFieldStruct_((char*)AName, NULL); }
static __int64 FieldAsInt64(long AIndex)
{ return RCKRespFieldInt64(AIndex, NULL); }
static __int64 FieldAsInt64(const char* AName)
{ return RCKRespFieldInt64_(AName, NULL); }
static __int64 FieldAsInt64(const KYString& AName)
{ return RCKRespFieldInt64_((char*)AName, NULL); }
static TDateTime FieldAsDate(long AIndex)
{ return RCKRespFieldDate(AIndex, NULL); }
static TDateTime FieldAsDate(const char* AName)
{ return RCKRespFieldDate_(AName, NULL); }
static TDateTime FieldAsDate(const KYString& AName)
{ return RCKRespFieldDate_((char*)AName, NULL); }
static long FieldAsCustom(long AIndex, void* AValue, long ASize)
{ return RCKRespFieldCustom(AIndex, AValue, ASize); }
static long FieldAsCustom(const char* AName, void* AValue, long ASize)
{ return RCKRespFieldCustom_(AName, AValue, ASize); }
static long FieldAsCustom(const KYString& AName, void* AValue, long ASize)
{ return RCKRespFieldCustom_((char*)AName, AValue, ASize); }
// 取各类型參数值的相关方法
static KYString ParamAsStr(long AIndex);
static KYString ParamAsStr(const char* AName);
static KYString ParamAsStr(const KYString& AName)
{ return ParamAsStr((char*)AName); }
static char* ParamAsStr(long AIndex, long& ASize)
{ return RCKRespParamStr(AIndex, &ASize); }
static char* ParamAsStr(const char* AName, long& ASize)
{ return RCKRespParamStr_(AName, &ASize); }
static long ParamAsInt(long AIndex)
{ return RCKRespParamInt(AIndex, NULL); }
static long ParamAsInt(const char* AName)
{ return RCKRespParamInt_(AName, NULL); }
static long ParamAsInt(const KYString& AName)
{ return RCKRespParamInt_((char*)AName, NULL); }
static bool ParamAsBool(long AIndex)
{ return RCKRespParamBool(AIndex, NULL); }
static bool ParamAsBool(const char* AName)
{ return RCKRespParamBool_(AName, NULL); }
static bool ParamAsBool(const KYString& AName)
{ return RCKRespParamBool_((char*)AName, NULL); }
static double ParamAsFloat(long AIndex)
{ return RCKRespParamFloat(AIndex, NULL); }
static double ParamAsFloat(const char* AName)
{ return RCKRespParamFloat_(AName, NULL); }
static double ParamAsFloat(const KYString& AName)
{ return RCKRespParamFloat_((char*)AName, NULL); }
static void* ParamAsStruct(long AIndex)
{ return RCKRespParamStruct(AIndex, NULL); }
static void* ParamAsStruct(const char* AName)
{ return RCKRespParamStruct_(AName, NULL); }
static void* ParamAsStruct(const KYString& AName)
{ return RCKRespParamStruct_((char*)AName, NULL); }
static __int64 ParamAsInt64(long AIndex)
{ return RCKRespParamInt64(AIndex, NULL); }
static __int64 ParamAsInt64(const char* AName)
{ return RCKRespParamInt64_(AName, NULL); }
static __int64 ParamAsInt64(const KYString& AName)
{ return RCKRespParamInt64_((char*)AName, NULL); }
static TDateTime ParamAsDate(long AIndex)
{ return RCKRespParamDate(AIndex, NULL); }
static TDateTime ParamAsDate(const char* AName)
{ return RCKRespParamDate_(AName, NULL); }
static TDateTime ParamAsDate(const KYString& AName)
{ return RCKRespParamDate_((char*)AName, NULL); }
static long ParamAsCustom(long AIndex, void* AValue, long ASize)
{ return RCKRespParamCustom(AIndex, AValue, ASize); }
static long ParamAsCustom(const char* AName, void* AValue, long ASize)
{ return RCKRespParamCustom_(AName, AValue, ASize); }
static long ParamAsCustom(const KYString& AName, void* AValue, long ASize)
{ return RCKRespParamCustom_((char*)AName, AValue, ASize); }
// 设置各类型返回值的相关方法
static long RetByStr(const char* AValue, long ASize = -1)
{ return RCKRespRetByStr(AValue, ASize); }
static long RetByStr(const KYString& AValue)
{ return RCKRespRetByStr((char*)AValue, AValue.Length()); }
static long RetByInt(long AValue)
{ return RCKRespRetByInt(AValue); }
static long RetByBool(bool AValue)
{ return RCKRespRetByBool(AValue); }
static long RetByFloat(double AValue)
{ return RCKRespRetByFloat(AValue); }
static long RetByStruct(void* AValue)
{ return RCKRespRetByStruct(AValue); }
static long RetByInt64(__int64 AValue)
{ return RCKRespRetByInt64(AValue); }
static long RetByDate(TDateTime AValue)
{ return RCKRespRetByDate(AValue); }
static long RetByCustom(const void* AValue, long ASize)
{ return RCKRespRetByCustom(AValue, ASize); }
// 设置各类型返回字段值的相关方法
static long FieldByStr(long AIndex, const char* AValue, long ASize = -1)
{ return RCKRespFieldByStr(AIndex, AValue, ASize); }
static long FieldByStr(long AIndex, const KYString& AValue)
{ return RCKRespFieldByStr(AIndex, (char*)AValue, AValue.Length()); }
static long FieldByStr(const char* AName, const KYString& AValue)
{ return RCKRespFieldByStr_(AName, (char*)AValue, AValue.Length()); }
static long FieldByStr(const KYString& AName, const KYString& AValue)
{ return RCKRespFieldByStr_((char*)AName,
(char*)AValue, AValue.Length()); }
static long FieldByInt(long AIndex, long AValue)
{ return RCKRespFieldByInt(AIndex, AValue); }
static long FieldByInt(const char* AName, long AValue)
{ return RCKRespFieldByInt_(AName, AValue); }
static long FieldByInt(const KYString& AName, long AValue)
{ return RCKRespFieldByInt_((char*)AName, AValue); }
static long FieldByBool(long AIndex, bool AValue)
{ return RCKRespFieldByBool(AIndex, AValue); }
static long FieldByBool(const char* AName, bool AValue)
{ return RCKRespFieldByBool_(AName, AValue); }
static long FieldByBool(const KYString& AName, bool AValue)
{ return RCKRespFieldByBool_((char*)AName, AValue); }
static long FieldByFloat(long AIndex, double AValue)
{ return RCKRespFieldByFloat(AIndex, AValue); }
static long FieldByFloat(const char* AName, double AValue)
{ return RCKRespFieldByFloat_(AName, AValue); }
static long FieldByFloat(const KYString& AName, double AValue)
{ return RCKRespFieldByFloat_((char*)AName, AValue); }
static long FieldByStruct(long AIndex, void* AValue)
{ return RCKRespFieldByStruct(AIndex, AValue); }
static long FieldByStruct(const char* AName, void* AValue)
{ return RCKRespFieldByStruct_(AName, AValue); }
static long FieldByStruct(const KYString& AName, void* AValue)
{ return RCKRespFieldByStruct_((char*)AName, AValue); }
static long FieldByInt64(long AIndex, __int64 AValue)
{ return RCKRespFieldByInt64(AIndex, AValue); }
static long FieldByInt64(const char* AName, __int64 AValue)
{ return RCKRespFieldByInt64_(AName, AValue); }
static long FieldByInt64(const KYString& AName, __int64 AValue)
{ return RCKRespFieldByInt64_((char*)AName, AValue); }
static long FieldByDate(long AIndex, TDateTime AValue)
{ return RCKRespFieldByDate(AIndex, AValue); }
static long FieldByDate(const char* AName, TDateTime AValue)
{ return RCKRespFieldByDate_(AName, AValue); }
static long FieldByDate(const KYString& AName, TDateTime AValue)
{ return RCKRespFieldByDate_((char*)AName, AValue); }
static long FieldByCustom(long AIndex, const void* AValue, long ASize)
{ return RCKRespFieldByCustom(AIndex, AValue, ASize); }
static long FieldByCustom(const char* AName, const void* AValue, long ASize)
{ return RCKRespFieldByCustom_(AName, AValue, ASize); }
static long FieldByCustom(const KYString& AName, const void* AValue, long ASize)
{ return RCKRespFieldByCustom_((char*)AName, AValue, ASize); }
};
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TRCFields - RCK 字段集类 */
class TRCFields
{
public:
TRCFields();
TRCFields(void* AFields);
virtual ~TRCFields();
// 属性
void* Fields() const { return FFields; }
bool IsBound() const { return FIsBound; }
// 字段信息
long Count() const { return RCKFieldCount(FFields); }
KYString Name(long AIndex) const
{ return RCKFieldName(FFields, AIndex); }
long Size(long AIndex) const
{ return RCKFieldSize(FFields, AIndex); }
long DefSize(long AIndex) const
{ return RCKFieldDefSize(FFields, AIndex); }
long FieldType(long AIndex) const
{ return RCKFieldType(FFields, AIndex); }
bool IsNull(long AIndex) const
{ return RCKFieldIsNull(FFields, AIndex, NULL); }
bool IsNull_(const KYString& AName) const
{ return RCKFieldIsNull_(FFields, (char*)AName, NULL); }
// 字段名索引
long IndexOf(const char* AName) const
{ return RCKFieldIndex(FFields, AName); }
long IndexOf(const KYString& AName) const
{ return RCKFieldIndex(FFields, (char*)AName); }
// 字段定义方法
long AddDef(const char* AName, long AType, long ASize) const
{ return RCKFieldDefsAdd(FFields, AName, AType, ASize); }
long AddDef(const KYString& AName, long AType, long ASize) const
{ return RCKFieldDefsAdd(FFields, (char*)AName, AType, ASize); }
void DeleteDef(long AIndex) const
{ RCKFieldDefsDelete(FFields, AIndex); }
void ClearDefs() const { RCKFieldDefsClear(FFields); }
long AssignDefs(const void* AFieldDefs, long ASize) const
{ return RCKFieldDefsAssign(FFields, AFieldDefs, ASize); }
KYString FieldDefs() const;
void* FieldDefs(long& ASize) const
{ return RCKFieldDefsOutput(FFields, &ASize); }
long Defs2Size(const void* AFieldDefs) const
{ return RCKFieldDefsSize(AFieldDefs); }
// 字段数据方法
void Clear() const { RCKFieldsClear(FFields); }
long Assign(const void* AData, long ASize) const
{ return RCKFieldsAssign(FFields, AData, ASize); }
KYString DataSet() const;
void* DataSet(long& ASize) const
{ return RCKFieldsOutput(FFields, &ASize); }
long DataSize() const { return RCKFieldsSize(FFields); }
// 取各类型字段值的相关方法
KYString AsStr(long AIndex) const;
KYString AsStr(const char* AName) const;
KYString AsStr(const KYString& AName) const
{ return AsStr((char*)AName); }
char* AsStr(long AIndex, long& ASize) const
{ return RCKFieldAsStr(FFields, AIndex, &ASize); }
char* AsStr(const char* AName, long& ASize) const
{ return RCKFieldAsStr_(FFields, AName, &ASize); }
long AsInt(long AIndex) const
{ return RCKFieldAsInt(FFields, AIndex, NULL); }
long AsInt(const char* AName) const
{ return RCKFieldAsInt_(FFields, AName, NULL); }
long AsInt(const KYString& AName) const
{ return RCKFieldAsInt_(FFields, (char*)AName, NULL); }
bool AsBool(long AIndex) const
{ return RCKFieldAsBool(FFields, AIndex, NULL); }
bool AsBool(const char* AName) const
{ return RCKFieldAsBool_(FFields, AName, NULL); }
bool AsBool(const KYString& AName) const
{ return RCKFieldAsBool_(FFields, (char*)AName, NULL); }
double AsFloat(long AIndex) const
{ return RCKFieldAsFloat(FFields, AIndex, NULL); }
double AsFloat(const char* AName) const
{ return RCKFieldAsFloat_(FFields, AName, NULL); }
double AsFloat(const KYString& AName) const
{ return RCKFieldAsFloat_(FFields, (char*)AName, NULL); }
void* AsStruct(long AIndex) const
{ return RCKFieldAsStruct(FFields, AIndex, NULL); }
void* AsStruct(const char* AName) const
{ return RCKFieldAsStruct_(FFields, AName, NULL); }
void* AsStruct(const KYString& AName) const
{ return RCKFieldAsStruct_(FFields, (char*)AName, NULL); }
__int64 AsInt64(long AIndex) const
{ return RCKFieldAsInt64(FFields, AIndex, NULL); }
__int64 AsInt64(const char* AName) const
{ return RCKFieldAsInt64_(FFields, AName, NULL); }
__int64 AsInt64(const KYString& AName) const
{ return RCKFieldAsInt64_(FFields, (char*)AName, NULL); }
TDateTime AsDate(long AIndex) const
{ return RCKFieldAsDate(FFields, AIndex, NULL); }
TDateTime AsDate(const char* AName) const
{ return RCKFieldAsDate_(FFields, AName, NULL); }
TDateTime AsDate(const KYString& AName) const
{ return RCKFieldAsDate_(FFields, (char*)AName, NULL); }
long AsCustom(long AIndex, void* AValue, long ASize) const
{ return RCKFieldGetCustom(FFields, AIndex, AValue, ASize); }
long AsCustom(const char* AName, void* AValue, long ASize) const
{ return RCKFieldGetCustom_(FFields, AName, AValue, ASize); }
long AsCustom(const KYString& AName, void* AValue, long ASize) const
{ return RCKFieldGetCustom_(FFields, (char*)AName, AValue, ASize); }
// 设置各类型字段值的相关方法
long ByStr(long AIndex, const char* AValue, long ASize = -1) const
{ return RCKFieldByStr(FFields, AIndex, AValue, ASize); }
long ByStr(long AIndex, const KYString& AValue) const
{ return RCKFieldByStr(FFields, AIndex, (char*)AValue, AValue.Length()); }
long ByStr(const char* AName, const KYString& AValue) const
{ return RCKFieldByStr_(FFields, AName, (char*)AValue, AValue.Length()); }
long ByStr(const KYString& AName, const KYString& AValue) const
{ return RCKFieldByStr_(FFields, (char*)AName,
(char*)AValue, AValue.Length()); }
long ByInt(long AIndex, long AValue) const
{ return RCKFieldByInt(FFields, AIndex, AValue); }
long ByInt(const char* AName, long AValue) const
{ return RCKFieldByInt_(FFields, AName, AValue); }
long ByInt(const KYString& AName, long AValue) const
{ return RCKFieldByInt_(FFields, (char*)AName, AValue); }
long ByBool(long AIndex, bool AValue) const
{ return RCKFieldByBool(FFields, AIndex, AValue); }
long ByBool(const char* AName, bool AValue) const
{ return RCKFieldByBool_(FFields, AName, AValue); }
long ByBool(const KYString& AName, bool AValue) const
{ return RCKFieldByBool_(FFields, (char*)AName, AValue); }
long ByFloat(long AIndex, double AValue) const
{ return RCKFieldByFloat(FFields, AIndex, AValue); }
long ByFloat(const char* AName, double AValue) const
{ return RCKFieldByFloat_(FFields, AName, AValue); }
long ByFloat(const KYString& AName, double AValue) const
{ return RCKFieldByFloat_(FFields, (char*)AName, AValue); }
long ByStruct(long AIndex, void* AValue) const
{ return RCKFieldByStruct(FFields, AIndex, AValue); }
long ByStruct(const char* AName, void* AValue) const
{ return RCKFieldByStruct_(FFields, AName, AValue); }
long ByStruct(const KYString& AName, void* AValue) const
{ return RCKFieldByStruct_(FFields, (char*)AName, AValue); }
long ByInt64(long AIndex, __int64 AValue) const
{ return RCKFieldByInt64(FFields, AIndex, AValue); }
long ByInt64(const char* AName, __int64 AValue) const
{ return RCKFieldByInt64_(FFields, AName, AValue); }
long ByInt64(const KYString& AName, __int64 AValue) const
{ return RCKFieldByInt64_(FFields, (char*)AName, AValue); }
long ByDate(long AIndex, TDateTime AValue) const
{ return RCKFieldByDate(FFields, AIndex, AValue); }
long ByDate(const char* AName, TDateTime AValue) const
{ return RCKFieldByDate_(FFields, AName, AValue); }
long ByDate(const KYString& AName, TDateTime AValue) const
{ return RCKFieldByDate_(FFields, (char*)AName, AValue); }
long ByCustom(long AIndex, const void* AValue, long ASize) const
{ return RCKFieldSetCustom(FFields, AIndex, AValue, ASize); }
long ByCustom(const char* AName, const void* AValue, long ASize) const
{ return RCKFieldSetCustom_(FFields, AName, AValue, ASize); }
long ByCustom(const KYString& AName, const void* AValue, long ASize) const
{ return RCKFieldSetCustom_(FFields, (char*)AName, AValue, ASize); }
private:
void* FFields; // 字段集句柄
bool FIsBound; // 是否绑定对象
};
/* end namespace */
}
}
// 命名空间的别名
namespace RCKObjs = RCKernel::__object__;
#endif
封装类的源码(RCKObjs.cpp)
?
// =======================================
// Unit : RCKernel objects
// Version: 5.0.0.0 (build 2014.07.07)
// Author : Kyee Ye
// Email : kyee_ye(at)126.com
// Copyright (C) Kyee workroom
// =======================================
#include "RCKObjs.h"
// 使用 RCKernel 的命名空间
namespace RCKernel
{
namespace __object__
{
/* begin namespace */
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TRCKObjs - RCK 对象集类 */
class TRCKObjs
{
private:
// 映射列表类型
typedef TKYMapObjKey<TRCAppObj> TAppList;
typedef TKYMapObjKey<TRCConnObj> TConnList;
typedef TKYMapObjKey<TRCFuncObj> TFuncList;
public:
TRCKObjs();
virtual ~TRCKObjs();
// 清除
void Clear();
// 加入/删除函数ID
bool AddFuncID(void* AFuncID, TRCFuncObj* AFuncObj)
{ return (FFuncIDs->Add(AFuncID, AFuncObj) != NULL); }
bool DeleteFuncID(void* AFuncID)
{ return FFuncIDs->Delete(AFuncID); }
// 函数ID -> 对象
TRCFuncObj* FuncID2Object(void* AFuncID)
{
TRCFuncObj* result = NULL;
FFuncIDs->Find(AFuncID, result);
return result;
}
// 创建/释放应用对象
TRCAppObj* CreateAppObj(const char* AName, const char* APassword, long& ARetCode);
void FreeAppObj(TRCAppObj* AppObj);
// 应用对象引用计数增 1
TRCAppObj* IncRefAppObj(void* AppID);
bool IncRefAppObj(TRCAppObj* AppObj);
// 创建/释放连接对象(注: AConnID 必须存在)
TRCConnObj* CreateConnObj(void* AConnID, bool ANeedFree, long& ARetCode);
void FreeConnObj(TRCConnObj* AConnObj);
// 连接对象引用计数增 1
TRCConnObj* IncRefConnObj(void* AConnID);
bool IncRefConnObj(TRCConnObj* AConnObj);
// 创建/释放命令对象
TRCCmdObj* CreateCmdObj(void* AConnID = NULL);
void FreeCmdObj(TRCCmdObj* ACmdObj);
protected:
// 当前锁
void Lock() const { FLock->Enter(); }
void Unlock() const { FLock->Leave(); }
private:
// 拷贝并清除
bool DoClearAppObjs(TKYList& AList);
bool DoClearConnObjs(TKYList& AList);
bool DoClearCmdQueue(TKYList& AList);
// 事件方法
void DoAppDeletion(TRCAppObj* AppObj);
void DoCmdDeletion(TRCCmdObj* ACmdObj);
void DoConnDeletion(TRCConnObj* AConnObj);
private:
TKYCritSect* FLock; // 当前锁
TAppList* FAppIDs; // 应用 ID 列表
TAppList* FAppObjs; // 应用对象列表
TFuncList* FFuncIDs; // 函数 ID 列表
TConnList* FConnIDs; // 连接 ID 列表
TConnList* FConnObjs; // 连接对象列表
TKYCycQueue* FCmdQueue; // 命令对象队列
public:
// 全局 RCK 对象集对象
static TRCKObjs* _obj() { return _Object; }
// 初始化/释放 _Object
static void _InitObj();
static void _FreeObj(bool AForced = false);
// 应用对象引用计数增/减 1(注: AppObj 对象必须存在)
static void _IncRefAppObj(TRCAppObj* AppObj)
{ AppObj->IncObjTimes(); }
static void _DecRefAppObj(TRCAppObj* AppObj)
{ if (AppObj->DecObjTimes() == 0) delete AppObj; }
// 连接对象引用计数增/减 1(注: AConnObj 对象必须存在)
static void _IncRefConnObj(TRCConnObj* AConnObj)
{ AConnObj->IncObjTimes(); }
static void _DecRefConnObj(TRCConnObj* AConnObj)
{ if (AConnObj->DecObjTimes() == 0) delete AConnObj; }
private:
// 全局 RCK 对象集对象
static TKYCritSect* _Lock;
static TRCKObjs* _Object;
static long _RefCount;
// TRCKObjs 的静态成员初始化类
static class TInitialization
{
public:
TInitialization();
~TInitialization();
} _Initialization;
friend class TInitialization;
};
/* TRCKObjs - RCK 对象集类 */
// ---------------- 静态成员 ----------------
// 全局锁对象
TKYCritSect* TRCKObjs::_Lock = NULL;
TRCKObjs* TRCKObjs::_Object = NULL;
long TRCKObjs::_RefCount = 0;
// TRCKObjs 的静态成员初始化对象
TRCKObjs::TInitialization TRCKObjs::_Initialization;
// ---------------- 静态函数 ----------------
// TRCKObjs 的静态成员初始化类的构造函数
TRCKObjs::TInitialization::TInitialization()
{
// 初始化
_RefCount = 0;
_Object = NULL;
// 创建对象
_Lock = new TKYCritSect;
}
// TRCKObjs 的静态成员初始化类的析构函数
TRCKObjs::TInitialization::~TInitialization()
{
// 释放对象
FreeAndNil(_Lock);
FreeAndNil(_Object);
}
// 初始化 _Object
void TRCKObjs::_InitObj()
{
_Lock->Enter();
if (_RefCount == 0)
try
{
// 创建对象并引用计数设为 1
_Object = new TRCKObjs;
_RefCount = 1;
// 初始化 RCKernel 接口
RCKInitialize();
}
catch (...) {}
else
_RefCount++;
_Lock->Leave();
}
// 释放 _Object
void TRCKObjs::_FreeObj(bool AForced)
{
_Lock->Enter();
if (_RefCount > 0)
try
{
// 引用计数减 1
_RefCount--;
// 推断是否须要释放
if ((_RefCount == 0) || AForced)
{
// 引用计数设为 0
_RefCount = 0;
// 清除并释放对象
_Object->Clear();
FreeAndNil(_Object);
// 释放 RCKernel 接口
RCKUninitialize();
}
}
catch (...) {}
_Lock->Leave();
}
// ---------------- 构造函数和析构函数 ----------------
// 构造函数
TRCKObjs::TRCKObjs()
{
// 创建对象
FLock = new TKYCritSect;
FAppIDs = new TAppList(false, false);
FAppObjs = new TAppList(false, false);
FFuncIDs = new TFuncList(false, true);
FConnIDs = new TConnList(false, false);
FConnObjs = new TConnList(false, false);
FCmdQueue = new TKYCycQueue(0, TKYCycQueue::slPower10);
// 设置对象属性
FCmdQueue->SetMaxCount(FCmdQueue->CycCount());
}
// 析构函数
TRCKObjs::~TRCKObjs()
{
// 清除
Clear();
// 释放对象
FreeAndNil(FLock);
FreeAndNil(FAppIDs);
FreeAndNil(FAppObjs);
FreeAndNil(FFuncIDs);
FreeAndNil(FConnIDs);
FreeAndNil(FConnObjs);
FreeAndNil(FCmdQueue);
}
// ---------------- 私有函数 ----------------
// 拷贝并清除应用对象列表
bool TRCKObjs::DoClearAppObjs(TKYList& AList)
{
// 初始化
bool result = false;
// 检查列表是否非空
if (FAppObjs->Count() > 0)
try
{
// 更改容量
AList.ChangeCapacity(FAppObjs->Count());
// 循环拷贝
void* pNode = FAppObjs->Next(NULL);
while (pNode != NULL)
{
AList.Add(FAppObjs->Value(pNode));
pNode = FAppObjs->Next(pNode);
}
// 清除
FAppIDs->Clear();
FAppObjs->Clear();
// 返回结果
result = true;
}
catch (...) {}
// 返回结果
return result;
}
// 拷贝并清除连接对象列表
bool TRCKObjs::DoClearConnObjs(TKYList& AList)
{
// 初始化
bool result = false;
// 检查列表是否非空
if (FConnObjs->Count() > 0)
try
{
// 更改容量
AList.ChangeCapacity(FConnObjs->Count());
// 循环拷贝
void* pNode = FConnObjs->Next(NULL);
while (pNode != NULL)
{
AList.Add(FConnObjs->Value(pNode));
pNode = FConnObjs->Next(pNode);
}
// 清除
FConnIDs->Clear();
FConnObjs->Clear();
// 返回结果
result = true;
}
catch (...) {}
// 返回结果
return result;
}
// 拷贝并清除命令对象队列
bool TRCKObjs::DoClearCmdQueue(TKYList& AList)
{
// 初始化
bool result = false;
// 检查列表是否非空
if (FCmdQueue->Count() != 0)
try
{
// 初始化
void* pData;
// 更改容量并循环弹出队列
AList.ChangeCapacity(FCmdQueue->Count());
while (FCmdQueue->Pop(pData))
AList.Add(pData);
// 返回结果
result = true;
}
catch (...) {}
// 返回结果
return result;
}
// 列表的 OnDeletion 事件过程
void TRCKObjs::DoAppDeletion(TRCAppObj* AppObj)
{
_DecRefAppObj(AppObj);
}
// 列表的 OnDeletion 事件过程
void TRCKObjs::DoCmdDeletion(TRCCmdObj* ACmdObj)
{
delete ACmdObj;
}
// 列表的 OnDeletion 事件过程
void TRCKObjs::DoConnDeletion(TRCConnObj* AConnObj)
{
_DecRefConnObj(AConnObj);
}
// ---------------- 公有函数 ----------------
// 清除
void TRCKObjs::Clear()
{
// 初始化
TKYList objApps(false);
TKYList objCmds(false);
TKYList objConns(false);
bool boolApp = false;
bool boolCmd = false;
bool boolConn = false;
// 清除函数列表
FFuncIDs->Clear();
// 拷贝并清除列表
Lock();
{
boolApp = DoClearAppObjs(objApps);
boolCmd = DoClearCmdQueue(objCmds);
boolConn = DoClearConnObjs(objConns);
}
Unlock();
// 推断是否须要清除应用
if (boolApp)
{
// 设置 OnDeletion 事件方法
objApps.OnDeletion.Object = this;
objApps.OnDeletion.Method = (TKYList::TDoDeletion)&TRCKObjs::DoAppDeletion;
// 清除
objApps.Clear();
}
// 推断是否须要清除命令
if (boolCmd)
{
// 设置 OnDeletion 事件方法
objCmds.OnDeletion.Object = this;
objCmds.OnDeletion.Method = (TKYList::TDoDeletion)&TRCKObjs::DoCmdDeletion;
// 清除
objCmds.Clear();
}
// 推断是否须要清除连接
if (boolConn)
{
// 设置 OnDeletion 事件方法
objConns.OnDeletion.Object = this;
objConns.OnDeletion.Method = (TKYList::TDoDeletion)&TRCKObjs::DoConnDeletion;
// 清除
objConns.Clear();
}
}
// 创建应用对象
TRCAppObj* TRCKObjs::CreateAppObj(const char* AName, const char* APassword, long& ARetCode)
{
// 初始化
TRCAppObj* result = NULL;
KYString strName = AName;
void* pAppID = RCKAppCreate((char*)strName, APassword);
// 推断是否创建成功
if (pAppID != NULL)
{
ARetCode = krUnknown;
// 创建对象, 并加入列表
try
{
TRCAppObj* objApp = new TRCAppObj;
if (objApp != NULL)
{
Lock();
try
{
// 加入到 ID 列表
void* pNode = FAppIDs->Add(pAppID, objApp);
if (pNode == NULL)
{
pNode = FAppIDs->Find(pAppID);
if (pNode != NULL)
{
FAppObjs->Delete(FAppIDs->Value(pNode));
FAppIDs->SetValue(pNode, objApp);
}
}
// 加入到对象列表
if (pNode == NULL)
;
else if ((FAppObjs->Add(objApp, objApp) != NULL)
|| FAppObjs->Existed(objApp))
{
// 设置对象属性
objApp->FName = strName;
objApp->FAppID = pAppID;
result = objApp;
ARetCode = krSuccess;
}
else
FAppIDs->Remove(pNode);
}
catch (...) {}
Unlock();
// 若失败则释放对象
if (result == NULL)
delete objApp;
}
}
catch (...) {}
// 若失败则释放
if (result == NULL)
RCKAppFree(pAppID);
}
else
ARetCode = RCKGetLastError();
// 返回结果
return result;
}
// 释放应用对象
void TRCKObjs::FreeAppObj(TRCAppObj* AppObj)
{
// 初始化
TRCAppObj* objApp = NULL;
// 查找并释放
Lock();
try
{
void* pNode = FAppObjs->Find(AppObj);
if (pNode != NULL)
{
objApp = FAppObjs->Value(pNode);
FAppObjs->Remove(pNode);
// 释放 ID 项
pNode = FAppIDs->Find(objApp->AppID());
if ((pNode != NULL) && (FAppIDs->Value(pNode) == objApp))
FAppIDs->Remove(pNode);
}
}
catch (...) {}
Unlock();
// 若存在则引用计数减 1
if (objApp != NULL)
_DecRefAppObj(objApp);
}
// 应用对象引用计数增 1
TRCAppObj* TRCKObjs::IncRefAppObj(void* AppID)
{
// 初始化
TRCAppObj* result = NULL;
// 查找
Lock();
try
{
void* pNode = FAppIDs->Find(AppID);
if (pNode != NULL)
{
result = FAppIDs->Value(pNode);
result->IncObjTimes();
}
}
catch (...) {}
Unlock();
// 返回结果
return result;
}
// 应用对象引用计数增 1
bool TRCKObjs::IncRefAppObj(TRCAppObj* AppObj)
{
// 初始化
bool result = false;
// 查找
Lock();
try
{
void* pNode = FAppObjs->Find(AppObj);
if (pNode != NULL)
{
AppObj->IncObjTimes();
result = true;
}
}
catch (...) {}
Unlock();
// 返回结果
return result;
}
// 创建连接对象(注: AConnID 必须存在)
TRCConnObj* TRCKObjs::CreateConnObj(void* AConnID, bool ANeedFree, long& ARetCode)
{
// 初始化
TRCConnObj* result = NULL;
// 检查连接是否存在
RCKConnGetInt(AConnID, kcaState, &ARetCode);
if (ARetCode == krSuccess)
{
ARetCode = krUnknown;
// 创建对象, 并加入列表
try
{
TRCConnObj* objConn = new TRCConnObj;
if (objConn != NULL)
{
Lock();
try
{
// 加入到 ID 列表
void* pNode = FConnIDs->Add(AConnID, objConn);
if (pNode == NULL)
{
if (FConnIDs->Existed(AConnID))
ARetCode = krIsExisted;
}
else if ((FConnObjs->Add(objConn, objConn) != NULL)
|| FConnObjs->Existed(objConn))
{
// 设置对象属性
objConn->FConnID = AConnID;
objConn->FCanEvent = true;
objConn->FNeedFree = ANeedFree;
result = objConn;
ARetCode = krSuccess;
}
else
FConnIDs->Remove(pNode);
}
catch (...) {}
Unlock();
// 若失败则释放对象
if (result == NULL)
delete objConn;
}
}
catch (...) {}
}
// 返回结果
return result;
}
// 释放连接对象
void TRCKObjs::FreeConnObj(TRCConnObj* AConnObj)
{
// 初始化
TRCConnObj* objConn = NULL;
// 查找并释放
Lock();
try
{
void* pNode = FConnObjs->Find(AConnObj);
if (pNode != NULL)
{
objConn = FConnObjs->Value(pNode);
FConnObjs->Remove(pNode);
// 释放 ID 项
pNode = FConnIDs->Find(objConn->ConnID());
if ((pNode != NULL) && (FConnIDs->Value(pNode) == objConn))
FConnIDs->Remove(pNode);
}
}
catch (...) {}
Unlock();
// 若存在则引用计数减 1
if (objConn != NULL)
_DecRefConnObj(objConn);
}
// 连接对象引用计数增 1
TRCConnObj* TRCKObjs::IncRefConnObj(void* AConnID)
{
// 初始化
TRCConnObj* result = NULL;
// 查找
Lock();
try
{
void* pNode = FConnIDs->Find(AConnID);
if (pNode != NULL)
{
result = FConnIDs->Value(pNode);
result->IncObjTimes();
}
}
catch (...) {}
Unlock();
// 返回结果
return result;
}
// 连接对象引用计数增 1
bool TRCKObjs::IncRefConnObj(TRCConnObj* AConnObj)
{
// 初始化
bool result = false;
// 查找
Lock();
try
{
void* pNode = FConnObjs->Find(AConnObj);
if (pNode != NULL)
{
AConnObj->IncObjTimes();
result = true;
}
}
catch (...) {}
Unlock();
// 返回结果
return result;
}
// 创建命令对象
TRCCmdObj* TRCKObjs::CreateCmdObj(void* AConnID)
{
// 初始化
TRCCmdObj* result = NULL;
// 弹出队列
Lock();
try
{
result = (TRCCmdObj*)FCmdQueue->Pop();
}
catch (...) {}
Unlock();
// 推断是否为空
if (result == NULL)
result = new TRCCmdObj;
// 设置连接
result->SetConnID(AConnID);
// 返回结果
return result;
}
// 释放命令对象
void TRCKObjs::FreeCmdObj(TRCCmdObj* ACmdObj)
{
if (ACmdObj != NULL)
{
// 初始化
bool boolPush = false;
// 关闭命令
ACmdObj->End();
// 压入队列
Lock();
try
{
boolPush = FCmdQueue->Push(ACmdObj);
}
catch (...) {}
Unlock();
// 压入队列失败则释放对象
if (!boolPush)
delete ACmdObj;
}
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 初始化/释放单元 */
// 初始化 RCKObjs 单元(注: 内部有引用计数)
void InitRCKObjs()
{
TRCKObjs::_InitObj();
}
// 释放 RCKObjs 单元(注: 内部有引用计数)
void FreeRCKObjs(bool AForced)
{
TRCKObjs::_FreeObj(AForced);
}
// 命令ID -> 对象
TRCCmdObj* CmdID2Object(void* ACmdID)
{
return (TRCCmdObj*)RCKCmdGetObj(ACmdID, kmaData, NULL);
}
// 函数ID -> 对象
TRCFuncObj* FuncID2Object(void* AFuncID)
{
// 初始化
TRCFuncObj* result = NULL;
// 推断是否已经初始化
if (TRCKObjs::_obj() != NULL)
result = TRCKObjs::_obj()->FuncID2Object(AFuncID);
// 返回结果
return result;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 应用对象(TRCAppObj)的相关函数 */
// 创建应用对象
TRCAppObj* CreateAppObj(const char* AName, const char* APassword, long* ARetCode)
{
// 初始化
TRCAppObj* result = NULL;
long intCode = krNotExist;
// 推断是否已经初始化
if (TRCKObjs::_obj() != NULL)
result = TRCKObjs::_obj()->CreateAppObj(AName, APassword, intCode);
// 设置返回码
if (ARetCode != NULL)
*ARetCode = intCode;
// 返回结果
return result;
}
// 释放应用对象
void FreeAppObj(TRCAppObj* AppObj)
{
// 推断是否已经初始化
if (TRCKObjs::_obj() != NULL)
TRCKObjs::_obj()->FreeAppObj(AppObj);
}
// 应用对象引用计数增 1
TRCAppObj* IncRefAppObj(void* AppID)
{
// 初始化
TRCAppObj* result = NULL;
// 推断是否已经初始化
if (TRCKObjs::_obj() != NULL)
result = TRCKObjs::_obj()->IncRefAppObj(AppID);
// 返回结果
return result;
}
// 应用对象引用计数增 1
bool IncRefAppObj_(TRCAppObj* AppObj)
{
return (TRCKObjs::_obj() != NULL) && TRCKObjs::_obj()->IncRefAppObj(AppObj);
}
// 应用对象引用计数增 1(注: AppObj 对象必须存在)
void IncRefAppObj(TRCAppObj* AppObj)
{
TRCKObjs::_IncRefAppObj(AppObj);
}
// 应用对象引用计数减 1(注: AppObj 对象必须存在)
void DecRefAppObj(TRCAppObj* AppObj)
{
TRCKObjs::_DecRefAppObj(AppObj);
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 连接对象(TRCConnObj)的相关函数 */
// 创建连接对象(注: AConnID 必须存在)
TRCConnObj* CreateConnObj(void* AConnID, bool ANeedFree, long* ARetCode)
{
// 初始化
TRCConnObj* result = NULL;
long intCode = krNotExist;
// 推断是否已经初始化
if (TRCKObjs::_obj() != NULL)
result = TRCKObjs::_obj()->CreateConnObj(AConnID, ANeedFree, intCode);
// 设置返回码
if (ARetCode != NULL)
*ARetCode = intCode;
// 返回结果
return result;
}
// 释放连接对象
void FreeConnObj(TRCConnObj* AConnObj)
{
// 推断是否已经初始化
if (TRCKObjs::_obj() != NULL)
TRCKObjs::_obj()->FreeConnObj(AConnObj);
}
// 连接对象引用计数增 1
TRCConnObj* IncRefConnObj(void* AConnID)
{
// 初始化
TRCConnObj* result = NULL;
// 推断是否已经初始化
if (TRCKObjs::_obj() != NULL)
result = TRCKObjs::_obj()->IncRefConnObj(AConnID);
// 返回结果
return result;
}
// 连接对象引用计数增 1
bool IncRefConnObj_(TRCConnObj* AConnObj)
{
return (TRCKObjs::_obj() != NULL) && TRCKObjs::_obj()->IncRefConnObj(AConnObj);
}
// 连接对象引用计数增 1(注: AConnObj 对象必须存在)
void IncRefConnObj(TRCConnObj* AConnObj)
{
TRCKObjs::_IncRefConnObj(AConnObj);
}
// 连接对象引用计数减 1(注: AConnObj 对象必须存在)
void DecRefConnObj(TRCConnObj* AConnObj)
{
TRCKObjs::_DecRefConnObj(AConnObj);
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 命令对象(TRCCmdObj)的相关函数 */
// 创建命令对象
TRCCmdObj* CreateCmdObj(void* AConnID)
{
// 初始化
TRCCmdObj* result = NULL;
// 推断是否已经初始化
if (TRCKObjs::_obj() != NULL)
result = TRCKObjs::_obj()->CreateCmdObj(AConnID);
// 返回结果
return result;
}
// 创建命令对象(注: AConnObj 必须存在)
TRCCmdObj* CreateCmdObj(TRCConnObj* AConnObj)
{
// 初始化
TRCCmdObj* result = NULL;
// 推断是否已经初始化
if (TRCKObjs::_obj() != NULL)
result = TRCKObjs::_obj()->CreateCmdObj(AConnObj->ConnID());
// 返回结果
return result;
}
// 释放命令对象
void FreeCmdObj(TRCCmdObj* ACmdObj)
{
// 推断是否已经初始化
if (TRCKObjs::_obj() != NULL)
TRCKObjs::_obj()->FreeCmdObj(ACmdObj);
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TRCAppObj - RCK 应用类 */
// ---------------- 静态函数 ----------------
// 应用的 OnConnLogin 回调事件
void __stdcall TRCAppObj::_RCKOnConnLogin(void* AppID, void* AConnID, bool& AIsRefused)
{
TRCAppObj* objApp = TRCKObjs::_obj()->IncRefAppObj(AppID);
if (objApp != NULL)
{
objApp->DoConnLogin(AConnID, AIsRefused);
TRCKObjs::_DecRefAppObj(objApp);
}
else
AIsRefused = true;
}
// 应用的 OnConnLogout 回调事件
void __stdcall TRCAppObj::_RCKOnConnLogout(void* AppID, void* AConnID)
{
TRCAppObj* objApp = TRCKObjs::_obj()->IncRefAppObj(AppID);
if (objApp != NULL)
{
objApp->DoConnLogout(AConnID);
TRCKObjs::_DecRefAppObj(objApp);
}
}
// 应用的 OnExecResp 回调事件
void __stdcall TRCAppObj::_RCKOnExecResp(void* AppID, void* AFuncID, void* AConnID)
{
TRCAppObj* objApp = TRCKObjs::_obj()->IncRefAppObj(AppID);
if (objApp != NULL)
{
objApp->DoExecResp(AFuncID, AConnID);
TRCKObjs::_DecRefAppObj(objApp);
}
}
// 应用的 OnRespCancel 回调事件
void __stdcall TRCAppObj::_RCKOnRespCancel(void* AppID, void* AFuncID, void* AConnID)
{
TRCAppObj* objApp = TRCKObjs::_obj()->IncRefAppObj(AppID);
if (objApp != NULL)
{
objApp->DoRespCancel(AFuncID, AConnID);
TRCKObjs::_DecRefAppObj(objApp);
}
}
// 应用的 OnRespConfirm 回调事件
void __stdcall TRCAppObj::_RCKOnRespConfirm(void* AppID, void* AFuncID, void* AConnID)
{
TRCAppObj* objApp = TRCKObjs::_obj()->IncRefAppObj(AppID);
if (objApp != NULL)
{
objApp->DoRespConfirm(AFuncID, AConnID);
TRCKObjs::_DecRefAppObj(objApp);
}
}
// ---------------- 构造函数和析构函数 ----------------
// 构造函数
TRCAppObj::TRCAppObj()
{
// 初始化
FData = NULL;
FAppID = NULL;
FObjTimes = 1;
// 创建对象
FLock = new TKYCritSect;
FFuncList = new TObjList(false, false);
// 运行初始化事件
DoInitEvent();
}
// 析构函数
TRCAppObj::~TRCAppObj()
{
// 推断是否非空
if (FAppID != NULL)
{
// 关闭
Close();
// 运行清除函数列表
DoClearFuncObjs();
// 释放应用对象
RCKAppFree(FAppID);
}
// 释放对象
FreeAndNil(FLock);
FreeAndNil(FFuncList);
}
// ---------------- 私有函数 ----------------
// 运行初始化事件
void TRCAppObj::DoInitEvent()
{
OnFuncFree.Method = NULL;
OnFuncFree.Object = NULL;
FOnConnLogin.Method = NULL;
FOnConnLogin.Object = NULL;
FOnConnLogout.Method = NULL;
FOnConnLogout.Object = NULL;
FOnExecResp.Method = NULL;
FOnExecResp.Object = NULL;
FOnRespCancel.Method = NULL;
FOnRespCancel.Object = NULL;
FOnRespConfirm.Method = NULL;
FOnRespConfirm.Object = NULL;
}
// 运行清除函数列表
void TRCAppObj::DoClearFuncObjs()
{
// 初始化
TKYList objIDs(false);
TKYList objObjs(false);
bool boolNext = false;
// 拷贝并清除
Lock();
if (FFuncList->Count() > 0)
try
{
// 设置容量
objIDs.ChangeCapacity(FFuncList->Count());
objObjs.ChangeCapacity(FFuncList->Count());
// 循环拷贝
void* pNode = FFuncList->Next(NULL);
while (pNode != NULL)
{
objIDs.Add(FFuncList->Value(pNode));
objObjs.Add(FFuncList->Key(pNode));
pNode = FFuncList->Next(pNode);
}
// 清除
FFuncList->Clear();
boolNext = true;
}
catch (...) {}
Unlock();
// 推断是否继续
if (boolNext)
{
// 设置 OnDeletion 事件方法
objIDs.OnDeletion.Object = this;
objIDs.OnDeletion.Method = (TKYList::TDoDeletion)&TRCAppObj::DoIDDeletion;
objObjs.OnDeletion.Object = this;
objObjs.OnDeletion.Method = (TKYList::TDoDeletion)&TRCAppObj::DoObjDeletion;
// 清除
objIDs.Clear();
objObjs.Clear();
}
}
// 激发 OnConnLogin 事件
void TRCAppObj::DoConnLogin(void* AConnID, bool& AIsRefused)
{
try
{
AIsRefused = true;
((TObject*)FOnConnLogin.Object->*FOnConnLogin.Method)(this, AConnID, AIsRefused);
}
catch (...) {}
}
// 激发 OnConnLogout 事件
void TRCAppObj::DoConnLogout(void* AConnID)
{
try
{
((TObject*)FOnConnLogout.Object->*FOnConnLogout.Method)(this, AConnID);
}
catch (...) {}
}
// 激发 OnExecResp 事件
void TRCAppObj::DoExecResp(void* AFuncID, void* AConnID)
{
try
{
((TObject*)FOnExecResp.Object->*FOnExecResp.Method)(this, AFuncID, AConnID);
}
catch (...) {}
}
// 激发 OnRespCancel 事件
void TRCAppObj::DoRespCancel(void* AFuncID, void* AConnID)
{
try
{
((TObject*)FOnRespCancel.Object->*FOnRespCancel.Method)(this, AFuncID, AConnID);
}
catch (...) {}
}
// 激发 OnRespConfirm 事件
void TRCAppObj::DoRespConfirm(void* AFuncID, void* AConnID)
{
try
{
((TObject*)FOnRespConfirm.Object->*FOnRespConfirm.Method)(this, AFuncID, AConnID);
}
catch (...) {}
}
// 列表的 OnDeletion 事件方法
void TRCAppObj::DoIDDeletion(void* AFuncID)
{
// 从全局列表中删除
if (TRCKObjs::_obj()->DeleteFuncID(AFuncID))
RCKFuncFree(AFuncID);
}
// 列表的 OnDeletion 事件方法
void TRCAppObj::DoObjDeletion(TRCFuncObj* AFuncObj)
{
// 激发 OnFuncFree 事件
if (OnFuncFree.Method != NULL)
try
{
((TObject*)OnFuncFree.Object->*OnFuncFree.Method)(this, AFuncObj);
}
catch (...) {}
// 释放
InterlockedExchangePointer((Pointer*)&AFuncObj->FAppObj, NULL);
delete AFuncObj;
}
// ---------------- 公有函数 ----------------
// 设置 Name 属性
long TRCAppObj::SetName(const KYString& AName)
{
// 初始化
long result = krUnknown;
// 操作
Lock();
if (FAppID != NULL)
{
result = RCKAppSetStr(FAppID, kaaName, (char*)AName, AName.Length());
if (result == krSuccess)
FName = AName;
}
Unlock();
// 返回结果
return result;
}
// 新建函数对象
TRCFuncObj* TRCAppObj::NewFuncObj(const char* AName, long ARetType, long ARetSize,
long ACallMode, void* ACallback)
{
// 初始化
TRCFuncObj* result = NULL;
KYString strName = AName;
void* pFuncID = RCKFuncCreate(FAppID, ACallMode, ACallback,
(char*)strName, ARetType, ARetSize);
// 推断是否创建成功
if (pFuncID != NULL)
{
// 创建对象并加入列表
try
{
TRCFuncObj* objFunc = new TRCFuncObj;
if (objFunc != NULL)
{
Lock();
try
{
if (FFuncList->Add(objFunc, pFuncID) != NULL)
{
objFunc->FName = strName;
objFunc->FFuncID = pFuncID;
objFunc->FAppObj = this;
result = objFunc;
// 加入列表
TRCKObjs::_obj()->AddFuncID(pFuncID, objFunc);
}
}
catch (...) {}
Unlock();
// 若失败则释放对象
if (result == NULL)
delete objFunc;
}
}
catch (...) {}
// 若失败则释放函数
if (result == NULL)
RCKFuncFree(pFuncID);
}
// 返回结果
return result;
}
// 删除函数对象
bool TRCAppObj::DeleteFuncObj(TRCFuncObj* AFuncObj)
{
// 初始化
bool result = false;
// 检查状态
if ((FAppID != NULL) && (State() == kasDefining))
{
// 初始化
void* pFuncID = NULL;
// 从列表中删除
Lock();
try
{
void* pNode = FFuncList->Find(AFuncObj);
if (pNode != NULL)
{
pFuncID = FFuncList->Value(pFuncID);
result = true;
FFuncList->Remove(pNode);
}
}
catch (...) {}
Unlock();
// 推断是否成功
if (result)
{
DoIDDeletion(pFuncID);
DoObjDeletion(AFuncObj);
}
}
// 返回结果
return result;
}
// 清除函数定义
void TRCAppObj::ClearFuncObjs()
{
// 检查状态
if ((FAppID != NULL) && (State() == kasDefining))
DoClearFuncObjs();
}
// 设置 OnConnLogin 事件
long TRCAppObj::SetOnConnLogin(TDoConnLogin AMethod, void* AObject)
{
// 初始化
long result = krUnknown;
// 操作
Lock();
if (FAppID != NULL)
{
void* pFunc = (AMethod != NULL) ? &_RCKOnConnLogin : NULL;
result = RCKAppSetObj(FAppID, kaaOnConnLogin, pFunc);
if (result != krSuccess)
;
else if (AMethod != NULL)
{
FOnConnLogin.Object = AObject;
FOnConnLogin.Method = AMethod;
}
else
{
FOnConnLogin.Method = NULL;
FOnConnLogin.Object = NULL;
}
}
Unlock();
// 返回结果
return result;
}
// 设置 OnConnLogout 事件
long TRCAppObj::SetOnConnLogout(TDoConnLogout AMethod, void* AObject)
{
// 初始化
long result = krUnknown;
// 操作
Lock();
if (FAppID != NULL)
{
void* pFunc = (AMethod != NULL) ? &_RCKOnConnLogout : NULL;
result = RCKAppSetObj(FAppID, kaaOnConnLogout, pFunc);
if (result != krSuccess)
;
else if (AMethod != NULL)
{
FOnConnLogout.Object = AObject;
FOnConnLogout.Method = AMethod;
}
else
{
FOnConnLogout.Method = NULL;
FOnConnLogout.Object = NULL;
}
}
Unlock();
// 返回结果
return result;
}
// 设置 OnExecResp 事件
long TRCAppObj::SetOnExecResp(TDoRespEvent AMethod, void* AObject)
{
// 初始化
long result = krUnknown;
// 操作
Lock();
if (FAppID != NULL)
{
void* pFunc = (AMethod != NULL) ? &_RCKOnExecResp : NULL;
result = RCKAppSetObj(FAppID, kaaOnExecResp, pFunc);
if (result != krSuccess)
;
else if (AMethod != NULL)
{
FOnExecResp.Object = AObject;
FOnExecResp.Method = AMethod;
}
else
{
FOnExecResp.Method = NULL;
FOnExecResp.Object = NULL;
}
}
Unlock();
// 返回结果
return result;
}
// 设置 OnRespCancel 事件
long TRCAppObj::SetOnRespCancel(TDoRespEvent AMethod, void* AObject)
{
// 初始化
long result = krUnknown;
// 操作
Lock();
if (FAppID != NULL)
{
void* pFunc = (AMethod != NULL) ? &_RCKOnRespCancel : NULL;
result = RCKAppSetObj(FAppID, kaaOnRespCancel, pFunc);
if (result != krSuccess)
;
else if (AMethod != NULL)
{
FOnRespCancel.Object = AObject;
FOnRespCancel.Method = AMethod;
}
else
{
FOnRespCancel.Method = NULL;
FOnRespCancel.Object = NULL;
}
}
Unlock();
// 返回结果
return result;
}
// 设置 OnRespConfirm 事件
long TRCAppObj::SetOnRespConfirm(TDoRespEvent AMethod, void* AObject)
{
// 初始化
long result = krUnknown;
// 操作
Lock();
if (FAppID != NULL)
{
void* pFunc = (AMethod != NULL) ?
&_RCKOnRespConfirm : NULL;
result = RCKAppSetObj(FAppID, kaaOnRespConfirm, pFunc);
if (result != krSuccess)
;
else if (AMethod != NULL)
{
FOnRespConfirm.Object = AObject;
FOnRespConfirm.Method = AMethod;
}
else
{
FOnRespConfirm.Method = NULL;
FOnRespConfirm.Object = NULL;
}
}
Unlock();
// 返回结果
return result;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TRCFuncObj - RCK 函数类 */
// ---------------- 构造函数和析构函数 ----------------
// 构造函数
TRCFuncObj::TRCFuncObj()
{
FData = NULL;
FFuncID = NULL;
FAppObj = NULL;
}
// 析构函数
TRCFuncObj::~TRCFuncObj()
{
TRCAppObj* objApp = (TRCAppObj*)InterlockedExchangePointer((Pointer*)&FAppObj, NULL);
if (objApp != NULL)
objApp->DeleteFuncObj(this);
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TRCConnObj - RCK 连接类 */
// ---------------- 静态函数 ----------------
// 连接的 OnConnect 回调事件
void __stdcall TRCConnObj::_RCKOnConnect(void* AConnID)
{
TRCConnObj* objConn = TRCKObjs::_obj()->IncRefConnObj(AConnID);
if (objConn != NULL)
{
objConn->DoConnect();
TRCKObjs::_DecRefConnObj(objConn);
}
}
// 连接的 OnDisconnect 回调事件
void __stdcall TRCConnObj::_RCKOnDisconnect(void* AConnID)
{
TRCConnObj* objConn = TRCKObjs::_obj()->IncRefConnObj(AConnID);
if (objConn != NULL)
{
objConn->DoDisconnect();
TRCKObjs::_DecRefConnObj(objConn);
}
}
// 连接的 OnLogin 回调事件
void __stdcall TRCConnObj::_RCKOnLogin(void* AConnID)
{
TRCConnObj* objConn = TRCKObjs::_obj()->IncRefConnObj(AConnID);
if (objConn != NULL)
{
objConn->DoLogin();
TRCKObjs::_DecRefConnObj(objConn);
}
}
// 连接的 OnLogout 回调事件
void __stdcall TRCConnObj::_RCKOnLogout(void* AConnID)
{
TRCConnObj* objConn = TRCKObjs::_obj()->IncRefConnObj(AConnID);
if (objConn != NULL)
{
objConn->DoLogout();
TRCKObjs::_DecRefConnObj(objConn);
}
}
// 连接的 OnCmdReturn 回调事件
void __stdcall TRCConnObj::_RCKOnCmdReturn(void* AConnID, void* ACmdID, long AResult)
{
TRCConnObj* objConn = TRCKObjs::_obj()->IncRefConnObj(AConnID);
if (objConn != NULL)
{
objConn->DoCmdReturn(ACmdID, AResult);
TRCKObjs::_DecRefConnObj(objConn);
}
}
// 连接的 OnRecvData 回调事件
void __stdcall TRCConnObj::_RCKOnRecvData(void* AConnID, const void* AData, long ASize)
{
TRCConnObj* objConn = TRCKObjs::_obj()->IncRefConnObj(AConnID);
if (objConn != NULL)
{
objConn->DoRecvData(AData, ASize);
TRCKObjs::_DecRefConnObj(objConn);
}
}
// ---------------- 构造函数和析构函数 ----------------
// 构造函数
TRCConnObj::TRCConnObj(void* AConnID, bool ANeedFree)
{
// 初始化
FData = NULL;
FConnID = AConnID;
FObjTimes = 1;
FCanEvent = false;
FNeedFree = ANeedFree && (AConnID != NULL);
// 运行初始化事件
DoInitEvent();
}
// 析构函数
TRCConnObj::~TRCConnObj()
{
// 推断是否须要释放连接
if (FNeedFree && (FConnID != NULL))
RCKConnFree(FConnID);
}
// ---------------- 私有函数 ----------------
// 运行初始化事件
void TRCConnObj::DoInitEvent()
{
FOnConnect.Method = NULL;
FOnConnect.Object = NULL;
FOnDisconnect.Method = NULL;
FOnDisconnect.Object = NULL;
FOnLogin.Method = NULL;
FOnLogin.Object = NULL;
FOnLogout.Method = NULL;
FOnLogout.Object = NULL;
FOnCmdReturn.Method = NULL;
FOnCmdReturn.Object = NULL;
FOnRecvData.Method = NULL;
FOnRecvData.Object = NULL;
}
// 激发 OnConnect 事件
void TRCConnObj::DoConnect()
{
try
{
((TObject*)FOnConnect.Object->*FOnConnect.Method)(this);
}
catch (...) {}
}
// 激发 OnDisconnect 事件
void TRCConnObj::DoDisconnect()
{
try
{
((TObject*)FOnDisconnect.Object->*FOnDisconnect.Method)(this);
}
catch (...) {}
}
// 激发 OnLogin 事件
void TRCConnObj::DoLogin()
{
try
{
((TObject*)FOnLogin.Object->*FOnLogin.Method)(this);
}
catch (...) {}
}
// 激发 OnLogout 事件
void TRCConnObj::DoLogout()
{
try
{
((TObject*)FOnLogout.Object->*FOnLogout.Method)(this);
}
catch (...) {}
}
// 激发 OnCmdReturn 事件
void TRCConnObj::DoCmdReturn(void* ACmdID, long AResult)
{
try
{
((TObject*)FOnCmdReturn.Object->*FOnCmdReturn.Method)(this, ACmdID, AResult);
}
catch (...) {}
}
// 激发 OnRecvData 事件
void TRCConnObj::DoRecvData(const void* AData, long ASize)
{
try
{
((TObject*)FOnRecvData.Object->*FOnRecvData.Method)(this, AData, ASize);
}
catch (...) {}
}
// ---------------- 公有函数 ----------------
// 设置 OnConnect 事件
long TRCConnObj::SetOnConnect(TDoNotify AMethod, void* AObject)
{
// 初始化
long result = krUnknown;
// 检查參数
if (FConnID == NULL)
;
else if (!FCanEvent)
result = krFailure;
else
{
void* pFunc = (AMethod != NULL) ? &_RCKOnConnect : NULL;
result = RCKConnSetObj(FConnID, kcaOnConnect, pFunc);
if (result != krSuccess)
;
else if (AMethod != NULL)
{
FOnConnect.Object = AObject;
FOnConnect.Method = AMethod;
}
else
{
FOnConnect.Method = NULL;
FOnConnect.Object = NULL;
}
}
// 返回结果
return result;
}
// 设置 OnDisconnect 事件
long TRCConnObj::SetOnDisconnect(TDoNotify AMethod, void* AObject)
{
// 初始化
long result = krUnknown;
// 检查參数
if (FConnID == NULL)
;
else if (!FCanEvent)
result = krFailure;
else
{
void* pFunc = (AMethod != NULL) ? &_RCKOnDisconnect : NULL;
result = RCKConnSetObj(FConnID, kcaOnDisconnect, pFunc);
if (result != krSuccess)
;
else if (AMethod != NULL)
{
FOnDisconnect.Object = AObject;
FOnDisconnect.Method = AMethod;
}
else
{
FOnDisconnect.Method = NULL;
FOnDisconnect.Object = NULL;
}
}
// 返回结果
return result;
}
// 设置 OnLogin 事件
long TRCConnObj::SetOnLogin(TDoNotify AMethod, void* AObject)
{
// 初始化
long result = krUnknown;
// 检查參数
if (FConnID == NULL)
;
else if (!FCanEvent)
result = krFailure;
else
{
void* pFunc = (AMethod != NULL) ? &_RCKOnLogin : NULL;
result = RCKConnSetObj(FConnID, kcaOnLogin, pFunc);
if (result != krSuccess)
;
else if (AMethod != NULL)
{
FOnLogin.Object = AObject;
FOnLogin.Method = AMethod;
}
else
{
FOnLogin.Method = NULL;
FOnLogin.Object = NULL;
}
}
// 返回结果
return result;
}
// 设置 OnLogout 事件
long TRCConnObj::SetOnLogout(TDoNotify AMethod, void* AObject)
{
// 初始化
long result = krUnknown;
// 检查參数
if (FConnID == NULL)
;
else if (!FCanEvent)
result = krFailure;
else
{
void* pFunc = (AMethod != NULL) ? &_RCKOnLogout : NULL;
result = RCKConnSetObj(FConnID, kcaOnLogout, pFunc);
if (result != krSuccess)
;
else if (AMethod != NULL)
{
FOnLogout.Object = AObject;
FOnLogout.Method = AMethod;
}
else
{
FOnLogout.Method = NULL;
FOnLogout.Object = NULL;
}
}
// 返回结果
return result;
}
// 设置 OnCmdReturn 事件
long TRCConnObj::SetOnCmdReturn(TDoCmdReturn AMethod, void* AObject)
{
// 初始化
long result = krUnknown;
// 检查參数
if (FConnID == NULL)
;
else if (!FCanEvent)
result = krFailure;
else
{
void* pFunc = (AMethod != NULL) ? &_RCKOnCmdReturn : NULL;
result = RCKConnSetObj(FConnID, kcaOnCmdReturn, pFunc);
if (result != krSuccess)
;
else if (AMethod != NULL)
{
FOnCmdReturn.Object = AObject;
FOnCmdReturn.Method = AMethod;
}
else
{
FOnCmdReturn.Method = NULL;
FOnCmdReturn.Object = NULL;
}
}
// 返回结果
return result;
}
// 设置 OnRecvData 事件
long TRCConnObj::SetOnRecvData(TDoRecvData AMethod, void* AObject)
{
// 初始化
long result = krUnknown;
// 检查參数
if (FConnID == NULL)
;
else if (!FCanEvent)
result = krFailure;
else
{
void* pFunc = (AMethod != NULL) ? &_RCKOnRecvData : NULL;
result = RCKConnSetObj(FConnID, kcaOnRecvData, pFunc);
if (result != krSuccess)
;
else if (AMethod != NULL)
{
FOnRecvData.Object = AObject;
FOnRecvData.Method = AMethod;
}
else
{
FOnRecvData.Method = NULL;
FOnRecvData.Object = NULL;
}
}
// 返回结果
return result;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TRCCmdObj - RCK 命令类 */
// ---------------- 构造函数和析构函数 ----------------
// 构造函数
TRCCmdObj::TRCCmdObj()
{
FData = NULL;
FCmdID = RCKCmdCreate();
// 设置关联对象
if (FCmdID != NULL)
RCKCmdSetObj(FCmdID, kmaData, this);
}
// 析构函数
TRCCmdObj::~TRCCmdObj()
{
if (FCmdID != NULL)
{
// 清除关联
RCKCmdSetObj(FCmdID, kmaData, NULL);
// 释放对象
RCKCmdFree(FCmdID);
}
}
// ---------------- 公有函数 ----------------
// 取连接对象
TRCConnObj* TRCCmdObj::ConnObj() const
{
// 初始化
TRCConnObj* result = NULL;
void* pConnID = RCKCmdGetObj(FCmdID, kmaConnObj, NULL);
// 推断是否非空
if (pConnID != NULL)
{
result = TRCKObjs::_obj()->IncRefConnObj(pConnID);
if (result != NULL)
TRCKObjs::_DecRefConnObj(result);
}
// 返回结果
return result;
}
// 运行带參数的命令
long TRCCmdObj::ExecByParams(Longword ATimeout, ...) const
{
// 取參数个数
long intCount = ParamCount();
if (intCount > 0)
{
// 初始化
const void* pUnknow;
// 清除參数
RCKCmdParamClear(FCmdID);
// 可变參数初始化
va_list arrArgs;
va_start(arrArgs, ATimeout);
// 加入參数
for (long intNo = 0; intNo < intCount; intNo++)
switch (ParamType(intNo))
{
case kdtString:
RCKCmdParamByStr(FCmdID, intNo, va_arg(arrArgs, const char*), -1);
break;
case kdtInteger:
RCKCmdParamByInt(FCmdID, intNo, va_arg(arrArgs, int));
break;
case kdtBoolean:
RCKCmdParamByBool(FCmdID, intNo, va_arg(arrArgs, bool));
break;
case kdtDouble:
RCKCmdParamByFloat(FCmdID, intNo, va_arg(arrArgs, double));
break;
case kdtStruct:
RCKCmdParamByStruct(FCmdID, intNo, va_arg(arrArgs, void*));
break;
case kdtByte:
RCKCmdParamByInt(FCmdID, intNo, va_arg(arrArgs, Byte));
break;
case kdtWord:
RCKCmdParamByInt(FCmdID, intNo, va_arg(arrArgs, Word));
break;
case kdtSmallint:
RCKCmdParamByInt(FCmdID, intNo, va_arg(arrArgs, Smallint));
break;
case kdtInt64:
RCKCmdParamByInt64(FCmdID, intNo, va_arg(arrArgs, __int64));
break;
case kdtDateTime:
RCKCmdParamByDate(FCmdID, intNo, va_arg(arrArgs, double));
break;
case kdtCurrency:
RCKCmdParamByFloat(FCmdID, intNo, va_arg(arrArgs, double));
break;
default:
pUnknow = va_arg(arrArgs, const void*);
}
// 可变參数释放
va_end(arrArgs);
}
// 运行
return RCKCmdExecute(FCmdID, ATimeout);
}
// 取返回值的字符串值
KYString TRCCmdObj::RetAsStr() const
{
// 初始化
KYString result;
long intSize;
char* pRet;
// 取返回值
pRet = RCKCmdRetStr(FCmdID, &intSize);
if (pRet != NULL)
result.SetString(pRet, intSize);
// 返回结果
return result;
}
// 取返回字段的字符串值
KYString TRCCmdObj::FieldAsStr(long AIndex) const
{
// 初始化
KYString result;
long intSize;
char* pRet;
// 取返回字段值
pRet = RCKCmdFieldStr(FCmdID, AIndex, &intSize);
if (pRet != NULL)
result.SetString(pRet, intSize);
// 返回结果
return result;
}
// 取返回字段的字符串值
KYString TRCCmdObj::FieldAsStr(const char* AName) const
{
// 初始化
KYString result;
long intSize;
char* pRet;
// 取返回字段值
pRet = RCKCmdFieldStr_(FCmdID, AName, &intSize);
if (pRet != NULL)
result.SetString(pRet, intSize);
// 返回结果
return result;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TRCResp - RCK 应答类 */
// ---------------- 静态函数 ----------------
// 取返回值的字符串值
KYString TRCResp::RetAsStr()
{
// 初始化
KYString result;
long intSize;
char* pRet;
// 取返回值
pRet = RCKRespRetStr(&intSize);
if (pRet != NULL)
result.SetString(pRet, intSize);
// 返回结果
return result;
}
// 取返回字段的字符串值
KYString TRCResp::FieldAsStr(long AIndex)
{
// 初始化
KYString result;
long intSize;
char* pRet;
// 取返回字段值
pRet = RCKRespFieldStr(AIndex, &intSize);
if (pRet != NULL)
result.SetString(pRet, intSize);
// 返回结果
return result;
}
// 取返回字段的字符串值
KYString TRCResp::FieldAsStr(const char* AName)
{
// 初始化
KYString result;
long intSize;
char* pRet;
// 取返回字段值
pRet = RCKRespFieldStr_(AName, &intSize);
if (pRet != NULL)
result.SetString(pRet, intSize);
// 返回结果
return result;
}
// 取參数的字符串值
KYString TRCResp::ParamAsStr(long AIndex)
{
// 初始化
KYString result;
long intSize;
char* pRet;
// 取參数值
pRet = RCKRespParamStr(AIndex, &intSize);
if (pRet != NULL)
result.SetString(pRet, intSize);
// 返回结果
return result;
}
// 取參数的字符串值
KYString TRCResp::ParamAsStr(const char* AName)
{
// 初始化
KYString result;
long intSize;
char* pRet;
// 取參数值
pRet = RCKRespParamStr_(AName, &intSize);
if (pRet != NULL)
result.SetString(pRet, intSize);
// 返回结果
return result;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TRCFields - RCK 字段集类 */
// ---------------- 构造函数和析构函数 ----------------
// 构造函数
TRCFields::TRCFields()
{
FFields = RCKFieldsCreate();
FIsBound = (FFields != NULL);
}
TRCFields::TRCFields(void* AFields)
{
FFields = AFields;
FIsBound = false;
}
// 析构函数
TRCFields::~TRCFields()
{
if (FIsBound)
RCKFieldsFree(FFields);
}
// ---------------- 公有函数 ----------------
// 取字段定义集字符串
KYString TRCFields::FieldDefs() const
{
// 初始化
KYString result;
long intSize;
char* pRet;
// 取字段值
pRet = (char*)RCKFieldDefsOutput(FFields, &intSize);
if (pRet != NULL)
result.SetString(pRet, intSize);
// 返回结果
return result;
}
// 取字段集字符串
KYString TRCFields::DataSet() const
{
// 初始化
KYString result;
long intSize;
char* pRet;
// 取字段值
pRet = (char*)RCKFieldsOutput(FFields, &intSize);
if (pRet != NULL)
result.SetString(pRet, intSize);
// 返回结果
return result;
}
// 取字段的字符串值
KYString TRCFields::AsStr(long AIndex) const
{
// 初始化
KYString result;
long intSize;
char* pRet;
// 取字段值
pRet = RCKFieldAsStr(FFields, AIndex, &intSize);
if (pRet != NULL)
result.SetString(pRet, intSize);
// 返回结果
return result;
}
// 取字段的字符串值
KYString TRCFields::AsStr(const char* AName) const
{
// 初始化
KYString result;
long intSize;
char* pRet;
// 取字段值
pRet = RCKFieldAsStr_(FFields, AName, &intSize);
if (pRet != NULL)
result.SetString(pRet, intSize);
// 返回结果
return result;
}
/* end namespace */
}
}
以上是关于远程调用内核接口的封装类(RCKObjs)的主要内容,如果未能解决你的问题,请参考以下文章