From 79f70475b9e45dd2a0b596d806f284f3c9c0e630 Mon Sep 17 00:00:00 2001 From: shi_jq Date: Wed, 12 Mar 2025 09:54:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fes/iec61850/common/IEC850C_Osicfg-bk.c | 997 ++++++++++++++++++ 1 file changed, 997 insertions(+) create mode 100644 product/src/fes/iec61850/common/IEC850C_Osicfg-bk.c diff --git a/product/src/fes/iec61850/common/IEC850C_Osicfg-bk.c b/product/src/fes/iec61850/common/IEC850C_Osicfg-bk.c new file mode 100644 index 00000000..b0019fe5 --- /dev/null +++ b/product/src/fes/iec61850/common/IEC850C_Osicfg-bk.c @@ -0,0 +1,997 @@ +/*============================================================================= + * 文件描述:osicfg文件生成 + * 文件版本: V1.00 + * 开发人员: LGXY + * 定版时间: + * 版本修订: + * 修订人员: + *============================================================================*/ + + +#include "glbtypes.h" +#include "sysincs.h" +#define I_AM_THE_TRUE_GEN_LIST +#include "gen_list.h" +#include "slog.h" + +#include "IEC850C_Osicfg.h" + +extern char g_szOsiCfgXmlFileName[255]; + +/*============================================================================== + * 内部宏定义 + *============================================================================*/ +#define LOG_ERROR0 printf +#define LOG_ERROR1 printf +#define LOG_ERROR2 printf +#define LOG_ERROR3 printf +#define LOG_ERROR4 printf + +/*============================================================================== + * 内部全局变量定义 + *============================================================================*/ +tagNetworkAddr g_tNetworkAddr = {&g_tNetworkAddr, &g_tNetworkAddr, "S1", "192.168.1.1", 102}; + +tagOsiCfg g_tOSICfg = { 65535, 1024, NULL, &g_tNetworkAddr}; + + +// Tpx通信地址定义 +tagTpxAddr g_tTpxAddr[2] = {{"local1", "1 3 9999 33", "33", "00 00 00 01", "00 01", "00 01"}, // local address + {"remote", "1 1 999 1", "12", "00 00 00 01", "00 01", "00 01"}}; // remote address + + +/*============================================================================== + * 函数实现 + *============================================================================*/ + +#define CN_SCL_EL_BUF_LEN_MAX (1024) // 临时缓冲区 +#define CN_MAX_IDENT_LEN_255 (255) // Identifier变量的最大长度 + +static char *scl_el_buf = NULL; // 缓存文本信息, 动态开辟, 大小由SCL_EL_BUF_LEN_MAX指定 +static FILE *scl_fd; // 写icd文件的句柄 +static unsigned int scl_nest_count = 0; // 元素的嵌套层次, 按元素Tag的打开与关闭自动计数 +static unsigned int whitespace_X = SD_FALSE; // 不需要换行及Tab缩进 + + +#define XML_ADD_XML(version){ \ + if(_xml_create(version) < 0){ \ + LOG_ERROR0("Failed to create XML header info!\n"); \ + return -1; \ + } \ +} + +#define SCL_ADD_EL_0(elname) \ +do { \ + if(_elTagOpen(elname) < 0) \ + { \ + LOG_ERROR1("elment '%s' open error!\n", elname); \ + return -1; \ + } \ +}while(0) + +#define SCL_ADD_EL_1(elname) \ +do { \ + if(_elTagClose(elname) < 0) \ + { \ + LOG_ERROR1("elment '%s' close error!\n", elname); \ + return -1; \ + } \ +}while(0) + + +#define SCL_EL_ADD_ATTR_STRING(name, value) \ +do { \ + if(_el_add_att_str(name, value) < 0) \ + { \ + LOG_ERROR1("elment add att '%s' failured!\n", name); \ + return -1; \ + } \ +}while(0) + +// 增加元素节点属性(忽略空字符串) +#define SCL_EL_ADD_ATTR_IGONRE_EMPTY(name, value) \ +do { \ + if (strlen(value) > 0) \ + SCL_EL_ADD_ATTR_STRING(name, value); \ +} while (0) + +#define SCL_EL_ADD_TEXT_INT(text) \ +do { \ + if(_el_add_text_int(text) < 0) \ + { \ + LOG_ERROR1("elment add text '%d' failured!\n", text); \ + return -1; \ + } \ +}while(0) + +#define SCL_EL_ADD_TEXT(text) \ +do { \ + if((NULL == text) || (strlen(text) == 0)) { \ + LOG_ERROR0("elment add text failured, text is NULL or empty!\n"); \ + return -1; \ + } \ + if(_el_add_text(text) < 0) { \ + LOG_ERROR1("elment add text '%s' failured!\n", text); \ + return -1; \ + } \ +}while(0) + + +// 移动指针, 使其始终指向最后一个字符的位置 +#define ELBUFPTRMOVE(el_buf_ptr) { \ + if(strlen(el_buf_ptr) >= CN_SCL_EL_BUF_LEN_MAX){ \ + LOG_ERROR0("scl_el_buf overflow!"); \ + return -1; \ + } \ + el_buf_ptr = el_buf_ptr + strlen(el_buf_ptr); \ +} + +// 将缓存区的字符写入文件中 +#define SCL_WRITE_FILE(){ \ + assert(scl_fd != NULL && scl_el_buf != NULL); \ + if(scl_el_buf[0] != 0) \ + { \ + fprintf(scl_fd, "%s", scl_el_buf); \ + memset(scl_el_buf, 0, CN_SCL_EL_BUF_LEN_MAX); \ + } \ +} + +static int _check_name_legal(const char *name) +{ + const char *pChar; + + assert(name != NULL); + + if (strlen (name) > CN_MAX_IDENT_LEN_255) + { + LOG_ERROR1("name '%s' is too long", name); + return -1; + } + + for (pChar = name; *pChar != '\0'; pChar++) + { + if ((!(isalnum(*pChar))) && (*pChar != '_') && (*pChar != '$') && (*pChar != ':')) + { + LOG_ERROR1 ("\nIllegal character in name '%s'", name); + return -1; + } + } + + return 0; +} + +static int _whitespace(char *el_buf) +{ + char *buf = el_buf; + unsigned int nest_count; + + if(strlen(buf) >= CN_SCL_EL_BUF_LEN_MAX) + { + LOG_ERROR0("scl_el_buf overflow!"); + return -1; + } + + nest_count = scl_nest_count - 1; + + if(SD_TRUE == whitespace_X) // 不需要Tab + { + whitespace_X = SD_FALSE; + return 0; + } + + sprintf(buf, "\n"); + switch(nest_count) // Tab键 + { + case 0: + break; + case 1: + strcat(buf, "\t"); + break; + case 2: + strcat(buf, "\t\t"); + break; + case 3: + strcat(buf, "\t\t\t"); + break; + case 4: + strcat(buf, "\t\t\t\t"); + break; + case 5: + strcat(buf, "\t\t\t\t\t"); + break; + case 6: + strcat(buf, "\t\t\t\t\t\t"); + break; + case 7: + strcat(buf, "\t\t\t\t\t\t\t"); + break; + case 8: + strcat(buf, "\t\t\t\t\t\t\t\t"); + break; + case 9: + strcat(buf, "\t\t\t\t\t\t\t\t\t"); + break; + case 10: + strcat(buf, "\t\t\t\t\t\t\t\t\t\t"); + break; + case 11: + strcat(buf, "\t\t\t\t\t\t\t\t\t\t\t"); + break; + case 12: + strcat(buf, "\t\t\t\t\t\t\t\t\t\t\t\t"); + break; + default: + LOG_ERROR0("elment too deep!"); + return -1; + } + + return 0; +} + +static int _xml_create(const char *version) +{ + char *el_buf_ptr = scl_el_buf; + + assert(el_buf_ptr != NULL); + + sprintf(el_buf_ptr, "\n", + version ? version : "1.0"); + return 0; +} + +static int _elTagOpen(const char *name) +{ + char *el_buf_ptr = scl_el_buf; + char *bufTemp = NULL; + + // 检查name有效性 + if(_check_name_legal(name) < 0) return -1; + + assert(el_buf_ptr != NULL); + + // 如果有两个'<', 则写文件(为了防止Tag打开太深而导致缓冲区满) + if((bufTemp = strchr(el_buf_ptr, '<')) != NULL) + { + bufTemp++; // skip '<' + if(strchr(bufTemp, '<') != NULL) + SCL_WRITE_FILE(); + } + + ELBUFPTRMOVE(el_buf_ptr); + + scl_nest_count++; // 嵌套层次计数 + + // 添加空格 + if(_whitespace(el_buf_ptr) < 0) return -1; + + ELBUFPTRMOVE(el_buf_ptr); + + // 写eltag + sprintf(el_buf_ptr, "<%s>", name); + + ELBUFPTRMOVE(el_buf_ptr); + + return 0; +} + +static int _elTagClose(const char *name) +{ + char *el_buf_ptr = scl_el_buf; + + assert(el_buf_ptr != NULL); + + ELBUFPTRMOVE(el_buf_ptr); + + if(name != NULL) + { + // 检查name有效性 + if(_check_name_legal(name) < 0) return -1; + + // 添加空格 + if(_whitespace(el_buf_ptr) < 0) return -1; + + ELBUFPTRMOVE(el_buf_ptr); + + sprintf(el_buf_ptr, "", name); + } + else + { + // 移除'>' + el_buf_ptr--; + sprintf(el_buf_ptr, "/>"); + } + + ELBUFPTRMOVE(el_buf_ptr); + + // 完成了一个完整的Tag, 写文件 + SCL_WRITE_FILE(); + + scl_nest_count--; // 嵌套层次计数 + + return 0; +} + +static int _el_add_att_str(const char *name, const char *val ) +{ + char *el_buf_ptr = scl_el_buf; + + // 检查name有效性 + if(_check_name_legal(name) < 0) return -1; + + assert(el_buf_ptr != NULL); + + ELBUFPTRMOVE(el_buf_ptr); + + // 移除'>' + el_buf_ptr--; + + // 写属性 + sprintf(el_buf_ptr, " %s=\"%s\">", name, val); + + ELBUFPTRMOVE(el_buf_ptr); + + return 0; +} + +static int _el_add_text_int(int i) +{ + char *el_buf_ptr = scl_el_buf; + + assert(el_buf_ptr != NULL); + + ELBUFPTRMOVE(el_buf_ptr); + + // 写属性 + sprintf(el_buf_ptr, "%d", i); + + ELBUFPTRMOVE(el_buf_ptr); + + whitespace_X = SD_TRUE; + + return 0; +} + + +static int _el_add_text(const char *text ) +{ + char *el_buf_ptr = scl_el_buf; + + assert(el_buf_ptr != NULL); + + ELBUFPTRMOVE(el_buf_ptr); + + // 写属性 + sprintf(el_buf_ptr, "%s", text); + + ELBUFPTRMOVE(el_buf_ptr); + + whitespace_X = SD_TRUE; + + return 0; +} + + +/*============================================================================== + * 函数功能: 增加RemoteAddress节点 + * 输入参数: ptNetworkAddr 通道IP地址信息 + * 输出参数: 无 + * 返回值: 若成功则返回0,若出错则返回-1 + *============================================================================*/ +static int OSI_Add_Node_RemoteAddress(const tagNetworkAddr *ptNetworkAddr) +{ + assert(ptNetworkAddr != NULL); + + // 创建RemoteAddress节点 + SCL_ADD_EL_0("RemoteAddress"); + + // 创建AR_Name节点 + SCL_ADD_EL_0("AR_Name"); + + SCL_EL_ADD_TEXT(ptNetworkAddr->arName); + + SCL_ADD_EL_1("AR_Name"); + + // 创建AP_Title节点 + SCL_ADD_EL_0("AP_Title"); + + SCL_EL_ADD_TEXT(g_tTpxAddr[1].AP_Title); + + SCL_ADD_EL_1("AP_Title"); + + // 创建AE_Qualifier节点 + SCL_ADD_EL_0("AE_Qualifier"); + + SCL_EL_ADD_TEXT(g_tTpxAddr[1].AE_Qualifier); + + SCL_ADD_EL_1("AE_Qualifier"); + + // 创建Psel节点 + SCL_ADD_EL_0("Psel"); + + SCL_EL_ADD_TEXT(g_tTpxAddr[1].Psel); + + SCL_ADD_EL_1("Psel"); + + // 创建Ssel节点 + SCL_ADD_EL_0("Ssel"); + + SCL_EL_ADD_TEXT(g_tTpxAddr[1].Ssel); + + SCL_ADD_EL_1("Ssel"); + + // 创建Tsel节点 + SCL_ADD_EL_0("Tsel"); + + SCL_EL_ADD_TEXT(g_tTpxAddr[1].Tsel); + + SCL_ADD_EL_1("Tsel"); + + // 创建TransportType节点 + SCL_ADD_EL_0("NetAddr"); + + // 添加元素属性 + SCL_EL_ADD_ATTR_IGONRE_EMPTY("Type", "IPADDR"); + + SCL_EL_ADD_TEXT(ptNetworkAddr->ip); + + SCL_ADD_EL_1("NetAddr"); + + // 创建Tsel节点 + SCL_ADD_EL_0("Port"); + + SCL_EL_ADD_TEXT_INT(ptNetworkAddr->port); + + SCL_ADD_EL_1("Port"); + + SCL_ADD_EL_1("RemoteAddress"); + + return 0; +} + +/*============================================================================== + * 函数功能: 增加RemoteAddressList节点 + * 输入参数: ptOSICfg + * 输出参数: 无 + * 返回值: 若成功则返回0,若出错则返回-1 + *============================================================================*/ +static int OSI_Add_Node_RemoteAddressList(const tagOsiCfg *ptOSICfg) +{ + tagNetworkAddr *ptRemoteAddress; // 通道地址信息 + + assert(ptOSICfg != NULL); + + // 创建RemoteAddressList节点 + SCL_ADD_EL_0("RemoteAddressList"); + + for (ptRemoteAddress = (tagNetworkAddr *) list_find_last ((DBL_LNK *) ptOSICfg->ptRemoteAddr); + ptRemoteAddress != NULL; + ptRemoteAddress = (tagNetworkAddr *) list_find_prev ((DBL_LNK *) ptOSICfg->ptRemoteAddr, (DBL_LNK *) ptRemoteAddress)) + { + if(OSI_Add_Node_RemoteAddress(ptRemoteAddress) < 0) + { + LOG_ERROR1("Failed to add node '%s'!", "RemoteAddress"); + return -1; + } + } + + SCL_ADD_EL_1("RemoteAddressList"); + + return 0; +} + +/*============================================================================== + * 函数功能: 增加LocalAddress节点 + * 输入参数: ptOSICfg + * 输出参数: 无 + * 返回值: 若成功则返回0,若出错则返回-1 + *============================================================================*/ +static int OSI_Add_Node_LocalAddress(const tagNetworkAddr *ptLocalAddr) +{ +// assert(ptLocalAddr != NULL); + + // 创建LocalAddress节点 + SCL_ADD_EL_0("LocalAddress"); + + // 创建AR_Name节点 + SCL_ADD_EL_0("AR_Name"); + + SCL_EL_ADD_TEXT(g_tTpxAddr[0].AR_Name); + + SCL_ADD_EL_1("AR_Name"); + + // 创建AP_Title节点 + SCL_ADD_EL_0("AP_Title"); + + SCL_EL_ADD_TEXT(g_tTpxAddr[0].AP_Title); + + SCL_ADD_EL_1("AP_Title"); + + // 创建AE_Qualifier节点 + SCL_ADD_EL_0("AE_Qualifier"); + + SCL_EL_ADD_TEXT(g_tTpxAddr[0].AE_Qualifier); + + SCL_ADD_EL_1("AE_Qualifier"); + + // 创建Psel节点 + SCL_ADD_EL_0("Psel"); + + SCL_EL_ADD_TEXT(g_tTpxAddr[0].Psel); + + SCL_ADD_EL_1("Psel"); + + // 创建Ssel节点 + SCL_ADD_EL_0("Ssel"); + + SCL_EL_ADD_TEXT(g_tTpxAddr[0].Ssel); + + SCL_ADD_EL_1("Ssel"); + + // 创建Tsel节点 + SCL_ADD_EL_0("Tsel"); + + SCL_EL_ADD_TEXT(g_tTpxAddr[0].Tsel); + + SCL_ADD_EL_1("Tsel"); + + // 创建TransportType节点 + SCL_ADD_EL_0("TransportType"); + + SCL_EL_ADD_TEXT("TCP"); + + SCL_ADD_EL_1("TransportType"); + + + SCL_ADD_EL_1("LocalAddress"); + + return 0; +} + + +/*============================================================================== + * 函数功能: 增加LocalAddressList节点 + * 输入参数: ptOSICfg + * 输出参数: 无 + * 返回值: 若成功则返回0,若出错则返回-1 + *============================================================================*/ +static int OSI_Add_Node_LocalAddressList(const tagOsiCfg *ptOSICfg) +{ + assert(ptOSICfg != NULL); + + // 创建LocalAddressList节点 + SCL_ADD_EL_0("LocalAddressList"); + + // 客户端本地ip地址信息只创建1个 + if(OSI_Add_Node_LocalAddress(ptOSICfg->ptLocalAddr) < 0) + { + LOG_ERROR1("Failed to add node '%s'!", "LocalAddress"); + return -1; + } + + SCL_ADD_EL_1("LocalAddressList"); + + return 0; +} + +/*============================================================================== + * 函数功能: 增加NetworkAddressing节点 + * 输入参数: ptOSICfg + * 输出参数: 无 + * 返回值: 若成功则返回0,若出错则返回-1 + *============================================================================*/ +static int OSI_Add_Node_NetworkAddressing(const tagOsiCfg *ptOSICfg) +{ + assert(ptOSICfg != NULL); + + // 创建NetworkAddressing节点 + SCL_ADD_EL_0("NetworkAddressing"); + + if(OSI_Add_Node_LocalAddressList(ptOSICfg) < 0) + { + LOG_ERROR1("Failed to add node '%s'!", "LocalAddressList"); + return -1; + } + + if(OSI_Add_Node_RemoteAddressList(ptOSICfg) < 0) + { + LOG_ERROR1("Failed to add node '%s'!", "RemoteAddressList"); + return -1; + } + + SCL_ADD_EL_1("NetworkAddressing"); + + return 0; +} + +/*============================================================================== + * 函数功能: 增加Tcp节点 + * 输入参数: ptOSICfg + * 输出参数: 无 + * 返回值: 若成功则返回0,若出错则返回-1 + *============================================================================*/ +static int OSI_Add_Node_Tcp(const tagOsiCfg *ptOSICfg) +{ + assert(ptOSICfg != NULL); + + // 创建Tcp节点 + SCL_ADD_EL_0("Tcp"); + + // 创建Rfc1006_Max_Tpdu_Len节点 + SCL_ADD_EL_0("Rfc1006_Max_Tpdu_Len"); + + SCL_EL_ADD_TEXT_INT(1024); + + SCL_ADD_EL_1("Rfc1006_Max_Tpdu_Len"); + + // 创建Rfc1006_Max_Spdu_Outstanding节点 + SCL_ADD_EL_0("Rfc1006_Max_Spdu_Outstanding"); + + SCL_EL_ADD_TEXT_INT(50); + + SCL_ADD_EL_1("Rfc1006_Max_Spdu_Outstanding"); + + + SCL_ADD_EL_1("Tcp"); + + return 0; +} + + +/*============================================================================== + * 函数功能: 增加Tp4节点 + * 输入参数: ptOSICfg + * 输出参数: 无 + * 返回值: 若成功则返回0,若出错则返回-1 + *============================================================================*/ +static int OSI_Add_Node_Tp4(const tagOsiCfg *ptOSICfg) +{ + assert(ptOSICfg != NULL); + + // 创建Network节点 + SCL_ADD_EL_0("Tp4"); + + // 创建Max_Tpdu_Length节点 + SCL_ADD_EL_0("Max_Tpdu_Length"); + + SCL_EL_ADD_TEXT_INT(1024); + + SCL_ADD_EL_1("Max_Tpdu_Length"); + + // 创建Max_Remote_Cdt节点 + SCL_ADD_EL_0("Max_Remote_Cdt"); + + SCL_EL_ADD_TEXT_INT(4); + + SCL_ADD_EL_1("Max_Remote_Cdt"); + + // 创建Local_Cdt节点 + SCL_ADD_EL_0("Local_Cdt"); + + SCL_EL_ADD_TEXT_INT(4); + + SCL_ADD_EL_1("Local_Cdt"); + + // 创建Max_Spdu_Outstanding节点 + SCL_ADD_EL_0("Max_Spdu_Outstanding"); + + SCL_EL_ADD_TEXT_INT(16); + + SCL_ADD_EL_1("Max_Spdu_Outstanding"); + + // 创建Window_Time节点 + SCL_ADD_EL_0("Window_Time"); + + SCL_EL_ADD_TEXT_INT(10); + + SCL_ADD_EL_1("Window_Time"); + + // 创建Inactivity_Time节点 + SCL_ADD_EL_0("Inactivity_Time"); + + SCL_EL_ADD_TEXT_INT(120); + + SCL_ADD_EL_1("Inactivity_Time"); + + // 创建Retransmission_Time节点 + SCL_ADD_EL_0("Retransmission_Time"); + + SCL_EL_ADD_TEXT_INT(10); + + SCL_ADD_EL_1("Retransmission_Time"); + + // 创建Max_Transmissions节点 + SCL_ADD_EL_0("Max_Transmissions"); + + SCL_EL_ADD_TEXT_INT(2); + + SCL_ADD_EL_1("Max_Transmissions"); + + // 创建Ak_Delay节点 + SCL_ADD_EL_0("Ak_Delay"); + + SCL_EL_ADD_TEXT_INT(2); + + SCL_ADD_EL_1("Ak_Delay"); + + SCL_ADD_EL_1("Tp4"); + + return 0; +} + + +/*============================================================================== + * 函数功能: 增加Transport节点 + * 输入参数: ptOSICfg + * 输出参数: 无 + * 返回值: 若成功则返回0,若出错则返回-1 + *============================================================================*/ +static int OSI_Add_Node_Transport(const tagOsiCfg *ptOSICfg) +{ + assert(ptOSICfg != NULL); + + // 创建Transport节点 + SCL_ADD_EL_0("Transport"); + + if(OSI_Add_Node_Tp4(ptOSICfg) < 0) + { + LOG_ERROR1("Failed to add node '%s'!", "Tp4"); + return -1; + } + + if(OSI_Add_Node_Tcp(ptOSICfg) < 0) + { + LOG_ERROR1("Failed to add node '%s'!", "Tcp"); + return -1; + } + + SCL_ADD_EL_1("Transport"); + + return 0; +} + + +/*============================================================================== + * 函数功能: 增加Network节点 + * 输入参数: ptOSICfg + * 输出参数: 无 + * 返回值: 若成功则返回0,若出错则返回-1 + *============================================================================*/ +static int OSI_Add_Node_Clnp(const tagOsiCfg *ptOSICfg) +{ + assert(ptOSICfg != NULL); + + // 创建Network节点 + SCL_ADD_EL_0("Clnp"); + + // 创建Lifetime节点 + SCL_ADD_EL_0("Lifetime"); + + SCL_EL_ADD_TEXT_INT(50); + + SCL_ADD_EL_1("Lifetime"); + + // 创建Lifetime_Decrement节点 + SCL_ADD_EL_0("Lifetime_Decrement"); + + SCL_EL_ADD_TEXT_INT(1); + + SCL_ADD_EL_1("Lifetime_Decrement"); + + // 创建Cfg_Timer节点 + SCL_ADD_EL_0("Cfg_Timer"); + + SCL_EL_ADD_TEXT_INT(120); + + SCL_ADD_EL_1("Cfg_Timer"); + + // 创建Esh_Delay节点 + SCL_ADD_EL_0("Esh_Delay"); + + SCL_EL_ADD_TEXT_INT(5); + + SCL_ADD_EL_1("Esh_Delay"); + + // 创建Local_NSAP节点 + SCL_ADD_EL_0("Local_NSAP"); + + SCL_EL_ADD_TEXT("49 00 01 53 49 53 43 21 00 01"); + + SCL_ADD_EL_1("Local_NSAP"); + + SCL_ADD_EL_1("Clnp"); + + return 0; +} + + +/*============================================================================== + * 函数功能: 增加Network节点 + * 输入参数: ptOSICfg + * 输出参数: 无 + * 返回值: 若成功则返回0,若出错则返回-1 + *============================================================================*/ +static int OSI_Add_Node_Network(const tagOsiCfg *ptOSICfg) +{ + assert(ptOSICfg != NULL); + + // 创建Network节点 + SCL_ADD_EL_0("Network"); + + if(OSI_Add_Node_Clnp(ptOSICfg) < 0) + { + LOG_ERROR1("Failed to add node '%s'!", "Clnp"); + return -1; + } + + SCL_ADD_EL_1("Network"); + + return 0; +} + + +/*============================================================================== + * 函数功能: 增加MMS节点 + * 输入参数: ptOSICfg + * 输出参数: 无 + * 返回值: 若成功则返回0,若出错则返回-1 + *============================================================================*/ +static int OSI_Add_Node_MMS(const tagOsiCfg *ptOSICfg) +{ + assert(ptOSICfg != NULL); + + // 创建MMS节点 + SCL_ADD_EL_0("MMS"); + + // 添加Max_Mms_Pdu_Length节点信息 + SCL_ADD_EL_0("Max_Mms_Pdu_Length"); + + SCL_EL_ADD_TEXT_INT(ptOSICfg->mmsPDUSize); + + SCL_ADD_EL_1("Max_Mms_Pdu_Length"); + + // 添加Max_Calling_Connections节点信息 + SCL_ADD_EL_0("Max_Calling_Connections"); + + SCL_EL_ADD_TEXT_INT(ptOSICfg->maxCalling); + + SCL_ADD_EL_1("Max_Calling_Connections"); + + // 添加Max_Called_Connections节点信息 + SCL_ADD_EL_0("Max_Called_Connections"); + + SCL_EL_ADD_TEXT_INT(0); // 客户端, 默认为0 + + SCL_ADD_EL_1("Max_Called_Connections"); + + SCL_ADD_EL_1("MMS"); + + return 0; +} + +/*============================================================================== + * 函数功能: 创建STACK_CFG节点 + * 输入参数: ptOSICfg 模板信息 + * 输出参数: 无 + * 返回值: 若成功则返回0,若出错则返回-1 + *============================================================================*/ +static int OSI_Add_Node_Root(const tagOsiCfg *ptOSICfg) +{ + assert(ptOSICfg != NULL); + + XML_ADD_XML("1.0"); + + // 添加tab符 + whitespace_X = SD_TRUE; + + // 添加元素节点 + SCL_ADD_EL_0("STACK_CFG"); + + // 添加MMS节点信息 + if (OSI_Add_Node_MMS(ptOSICfg) < 0) + { + LOG_ERROR1("Failed to add node '%s'!", "MMS"); + return -1; + } + + // 添加Network节点信息 + if (OSI_Add_Node_Network(ptOSICfg) < 0) + { + LOG_ERROR1("Failed to add node '%s'!", "Network"); + return -1; + } + + // 添加Transport节点信息 + if (OSI_Add_Node_Transport(ptOSICfg) < 0) + { + LOG_ERROR1("Failed to add node '%s'!", "Transport"); + return -1; + } + + // 添加NetworkAddressing节点信息 + if (OSI_Add_Node_NetworkAddressing(ptOSICfg) < 0) + { + LOG_ERROR1("Failed to add node '%s'!", "NetworkAddressing"); + return -1; + } + + SCL_ADD_EL_1("STACK_CFG"); + + return 0; +} + +/*============================================================================== + * 函数功能: 模板信息保存为ICD + * 输入参数: pszFilePath 文件存储路径 + * ptOSICfg osi配置信息 + * 输出参数: 无 + * 返回值: 若成功则返回0,若出错则返回-1 + *============================================================================*/ +int XML_Save_File(const char *pszFilePath, const tagOsiCfg *ptOSICfg,const char *osicfgName) +{ + FILE *fd; + char *buf; + char szFileName[255] = {0}; + + if((NULL == pszFilePath) || (strlen(pszFilePath) > 128)) return SD_FAILURE; + + // 文件全路径 + #ifndef _WIN32 + sprintf(szFileName, "%s/%s", pszFilePath, osicfgName); + #else + sprintf(szFileName, "%s\\%s", pszFilePath, osicfgName); + #endif + + strcpy(g_szOsiCfgXmlFileName, szFileName); + + fd = fopen(szFileName, "w"); + if(NULL == fd) + { + LOG_ERROR0("\nFile '%s' Open Error!", szFileName); + return -1; + } + + buf = (char *)calloc(CN_SCL_EL_BUF_LEN_MAX, sizeof(char)); + if(NULL == buf) + { + fclose(fd); + LOG_ERROR0("\nel_buf malloc failed!"); + return -1; + } + + scl_fd = fd; // save the 'fd' + scl_el_buf = buf; // save the buf ptr + + if(OSI_Add_Node_Root(ptOSICfg) < 0) + { + fclose(fd); + free(buf); + LOG_ERROR0("Add Node 'STACK_CFG' failed!"); + return -1; + } + + assert(scl_nest_count == 0); + + fclose(fd); + free(buf); + scl_fd = NULL; + scl_el_buf = NULL; + + return 0; +} + +int main2 () +{ + + if(XML_Save_File("", &g_tOSICfg, "osicfg.xml") < 0) + { + printf("osicfg_11.xml create failed!"); + } + else + { + printf("osicfg_11.xml create success!"); + } + + system("pause"); + return 0; +} +