修改了地址
This commit is contained in:
parent
82b8ffc88b
commit
79f70475b9
997
product/src/fes/iec61850/common/IEC850C_Osicfg-bk.c
Normal file
997
product/src/fes/iec61850/common/IEC850C_Osicfg-bk.c
Normal file
@ -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, "<?xml version=\"%s\" encoding=\"UTF-8\"?>\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, "</%s>", 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;
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user