#if !defined(__E_STATIC_LIB)
#include "include_exmlrpc_header.h"

//TODO 静态库需要的部分,会记录所有的函数名到数组里,静态编译的时候需要取回命令名
static ARG_INFO g_argumentInfo_exmlrpc_global_var[] = 
{
    // 1=参数名称, 2=参数详细解释, 3=指定图像索引,从1开始,0表示无, 4=图像数目(用作动画)
    // 5=参数类型, 6=参数默认值,   7=参数标志 AS_ 开头常量
    // AS_HAS_DEFAULT_VALUE         有默认值,倒数第二个参数是默认值
    // AS_DEFAULT_VALUE_IS_EMPTY    默认值为空,有可空标志
    // AS_RECEIVE_VAR               只能传递变量,相当于传引用,传递过来的肯定不是数组
    // AS_RECEIVE_VAR_ARRAY         传递过来的肯定是数组变量引用
    // AS_RECEIVE_VAR_OR_ARRAY      传递变量或者数组变量引用
    // AS_RECEIVE_ARRAY_DATA        传递数组
    // AS_RECEIVE_ALL_TYPE_DATA     传递数组/非数组
    // AS_RECEIVE_VAR_OR_OTHER      可以传递 变量/数据/返回值数据


    /*000*/ {"端口号", "本参数作为服务启动的端口号", 0, 0, SDT_INT, 0, NULL},
    /*001*/ {"处理函数", "本参数作为服务器端接收到客户请求后，系统自动调用的函数，当有客户端连接或断开与服务器的连接时也可以触发该方法。在该函数内可以得到客户发送过来的消息类型和消息内容。该方法在支持库的内部采用的是多线程的处理机制，该方法内全局变量的修改要通过多线程的许可证机制。该函数带有一个整形参数，参数的内容是客户端发送过来的消息地址，可以通过该地址得到消息的完整内容", 0, 0, SDT_SUB_PTR, 0, NULL},
    /*002*/ {"采用串行处理方式", "本参数作为服务程序的处理函数是否可以并行处理每一个客户端的请求。该参数为真代表处理函数必须串行处理每个客户端的请求，这种方式下，服务器的性能受到一定的限制，优点是不会发生由于客户端对服务器的并发访问而引起的并发冲突，这是默认的方式。该参数为假代表处理函数可以并行处理多个客户端的请求，这种方式下，服务器的性能可以最好的发挥出来，最大可能的支持更多的客户端访问和最快速的响应。如果本参数被省略，默认为真。", 0, 0, SDT_BOOL, 0, AS_DEFAULT_VALUE_IS_EMPTY},

    /*003*/ {"最小线程数", "线程池内的线程数量的最小值", 0, 0, SDT_INT, 0, NULL},
    /*004*/ {"最大线程数", "线程池内的线程数量的最大值", 0, 0, SDT_INT, 0, NULL},

    /*005*/ {"消息地址", "客户端发送过来的消息地址。“取请求文本”方法必须在用户定义的“处理函数”中调用，所以该值就是“处理函数”的参数值", 0, 0, SDT_INT, 0, NULL},
    /*006*/ {"请求代码", "服务器所接收的请求信息来源，该代码唯一标识客户端的一次请求，禁止修改它的值。该参数作为方法“取请求文本”的返回值", 0, 0, SDT_TEXT, 0, AS_RECEIVE_VAR},
    /*007*/ {"请求信息", "服务器所接收到的请求信息的详细内容。该参数作为方法“取请求文本”的返回值", 0, 0, SDT_TEXT, 0, AS_RECEIVE_VAR},

    /*008*/ {"消息地址", "客户端发送过来的消息地址。“取请求字节集”方法必须在用户定义的“处理函数”中调用，所以该值就是“处理函数”的参数值", 0, 0, SDT_INT, 0, NULL},
    /*009*/ {"请求代码", "服务器所接收的请求信息来源，该代码唯一标识客户端的一次请求，禁止修改它的值。该参数作为方法“取请求字节集”的返回值", 0, 0, SDT_TEXT, 0, AS_RECEIVE_VAR},
    /*010*/ {"请求信息", "服务器所接收到的请求信息的详细内容。该参数作为方法“取请求字节集”的返回值", 0, 0, SDT_BIN, 0, AS_RECEIVE_VAR},

    /*011*/ {"目的端", "该参数可以接受两种不同的数据，一个是“请求代码”，一个是“客户句柄”，这两种数据都可以作为服务程序发送数据的目的端，当参数为“请求代码”时，发送的目的端就是该请求代码的来源", 0, 0, _SDT_ALL, 0, NULL},
    /*012*/ {"发送信息", "服务器所要发送的文本形式的信息", 0, 0, SDT_TEXT, 0, NULL},

    /*013*/ {"目的端", "该参数可以接受两种不同的数据，一个是“请求代码”，一个是“客户句柄”，这两种数据都可以作为服务程序发送数据的目的端，当参数为“请求代码”时，发送的目的端就是该请求代码的来源", 0, 0, _SDT_ALL, 0, NULL},
    /*014*/ {"发送信息", "服务器所要发送的字节集形式的结果信息", 0, 0, SDT_BIN, 0, NULL},

    /*015*/ {"消息地址", "客户端发送过来的消息地址。“取客户句柄”方法必须在用户定义的“处理函数”中调用，所以该值就是“处理函数”的参数值", 0, 0, SDT_INT, 0, NULL},
    /*016*/ {"客户句柄", "服务器所接收到的信息来源的客户句柄。该参数作为方法“取客户句柄”的返回值", 0, 0, SDT_INT, 0, AS_RECEIVE_VAR},

    /*017*/ {"客户句柄", "客户端的句柄值", 0, 0, SDT_INT, 0, NULL},
    /*018*/ {"客户IP地址", "客户端的IP地址。该参数作为方法“取客户IP”的返回值", 0, 0, SDT_TEXT, 0, AS_RECEIVE_VAR},

    /*019*/ {"客户句柄数组", "连接到当前的服务程序的所有客户端的句柄数组，该参数作为“取客户数组”的返回值", 0, 0, SDT_INT, 0, AS_RECEIVE_VAR_ARRAY},

    /*020*/ {"客户句柄", "欲断开的客户端的句柄", 0, 0, SDT_INT, 0, NULL},

    /*021*/ {"端口号", "本参数作为欲连接的服务器的端口号，该值的取值范围在0到65535之间", 0, 0, SDT_INT, 0, NULL},
    /*022*/ {"服务器地址", "本参数是欲连接的服务器的IP地址，也可以是服务器的域名或者是内网的计算机名", 0, 0, SDT_TEXT, 0, NULL},
    /*023*/ {"请求方式", "本参数作为客户端的请求方式，该值为真代表客户端采用同步的请求方式，这时忽略该方法的最后一个参数，该值为假代表客户端采用异步的请求方式。同步方式不能发送异步请求，同样异步方式不能发送同步请求", 0, 0, SDT_BOOL, 0, NULL},
    /*024*/ {"处理函数", "同步请求的方式下，该参数没有意义可以省略。异步请求模式下如果客户端接收到数据或者与服务器的连接被断开，该函数就会被系统调用。该函数有一个整形的参数，该参数代表触发该处理函数的消息地址，客户端可以通过该地址得到消息的类型和内容", 0, 0, SDT_SUB_PTR, 0, AS_DEFAULT_VALUE_IS_EMPTY},

    /*025*/ {"请求文本", "客户端发送的请求文本的内容", 0, 0, SDT_TEXT, 0, NULL},
    /*026*/ {"结果文本", "服务器返回的结果内容", 0, 0, SDT_TEXT, 0, AS_RECEIVE_VAR},
    /*027*/ {"超时", "同步机制下“发送请求”方法的最大允许等待时间。单位为毫秒。该值必须大于等于0", 0, 0, SDT_INT, 0, NULL},

    /*028*/ {"请求字节集", "客户端发送的请求字节集的内容", 0, 0, SDT_BIN, 0, NULL},
    /*029*/ {"结果字节集", "服务器返回的结果内容", 0, 0, SDT_BIN, 0, AS_RECEIVE_VAR},
    /*030*/ {"超时", "同步机制下“发送请求”方法的最大允许等待时间。单位为毫秒。该值必须大于等于0", 0, 0, SDT_INT, 0, NULL},

    /*031*/ {"请求信息", "客户端发送的请求信息的内容", 0, 0, SDT_TEXT, 0, NULL},

    /*032*/ {"请求信息", "客户端发送的请求信息的内容", 0, 0, SDT_BIN, 0, NULL},

    /*033*/ {"消息地址", "触发客户端处理函数的信息的地址。“取返回文本”方法必须在用户定义的“接收函数”中调用，所以该值就是“接收函数”的参数值", 0, 0, SDT_INT, 0, NULL},
    /*034*/ {"结果信息", "客户端得到的服务器返回的结果信息，该参数作为方法“取返回文本”的返回值", 0, 0, SDT_TEXT, 0, AS_RECEIVE_VAR},

    /*035*/ {"消息地址", "触发客户端处理函数的信息的地址。“取返回字节集”方法必须在用户定义的“接收函数”中调用，所以该值就是“接收函数”的参数值", 0, 0, SDT_INT, 0, NULL},
    /*036*/ {"结果信息", "客户端得到的服务器返回的结果信息，该参数作为方法“取返回字节集”的返回值", 0, 0, SDT_BIN, 0, AS_RECEIVE_VAR},

    /*037*/ {"消息地址", "触发客户端处理函数的消息地址", 0, 0, SDT_INT, 0, NULL},

    /*038*/ {"消息地址", "触发服务器端处理函数的消息地址", 0, 0, SDT_INT, 0, NULL},

};

#ifdef _DEBUG    // 这里是为了确认参数序号是否正确, 成员数比最后一个序号大1就是正确
const int dbg_cmd_arg_count__ = sizeof(g_argumentInfo_exmlrpc_global_var) / sizeof(g_argumentInfo_exmlrpc_global_var[0]);
#endif


#define EXMLRPC_DEF_CMDINFO(_index, _szName, _szEgName, _szExplain, _shtCategory, _wState, _dtRetValType, _wReserved, _shtUserLevel, _shtBitmapIndex, _shtBitmapCount, _nArgCount, _pBeginArgInfo) \
    { _szName, ______E_FNENAME(_szEgName), _szExplain, _shtCategory, _wState, _dtRetValType, _wReserved, _shtUserLevel, _shtBitmapIndex, _shtBitmapCount, _nArgCount, _pBeginArgInfo },


// 易语言每个命令的定义, 会把信息显示在支持库列表里, 这里每个成员都是详细的描述一个命令的信息
CMD_INFO g_cmdInfo_exmlrpc_global_var[] = 
{
    EXMLRPC_DEF(EXMLRPC_DEF_CMDINFO)
};

int g_cmdInfo_exmlrpc_global_var_count = sizeof(g_cmdInfo_exmlrpc_global_var) / sizeof(g_cmdInfo_exmlrpc_global_var[0]);

#endif

