FuJuntang
2022-07-06 e5cff5a3ef373a5090f45cd1dfb0b85d9c851d5d
comm/proto_comm.c
@@ -1,73 +1,131 @@
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <signal.h>
#include "proto_comm.h"
#include "proto_dbg.h"
int timer_init(timer_t *timer_index, void (*timer_handler)(union sigval para)) {
  struct sigevent event;
  timer_t timer;
  int ret;
  memset(&event, 0x00, sizeof(event));
  event.sigev_value.sival_int = ENABLE;
  event.sigev_value.sival_ptr = NULL;
  event.sigev_notify = SIGEV_THREAD;
  event.sigev_notify_function = timer_handler;
  ret = timer_create(CLOCK_REALTIME, &event, &timer);
  if (ret) {
    return -1;
  }
  if (timer_index != NULL) {
    *timer_index = timer;
  }
  return 0;
}
int timer_start(timer_t timer_index, int sec) {
  int ret;
  struct itimerspec ts;
  ts.it_interval.tv_sec = 0;
  ts.it_interval.tv_nsec = 0;
  ts.it_value.tv_sec = sec;
  ts.it_value.tv_nsec = 0;
  ret = timer_settime(timer_index, 0, &ts, NULL);
  if (ret) {
    return -1;
  }
  return ret;
}
int timer_stop(timer_t timer_index) {
  int ret = timer_start(timer_index, 0);
  return ret;
}
int timer_destroy(timer_t timer_index) {
  int ret;
  ret = timer_delete(timer_index);
  return ret;
}
void soap_perror(struct soap *soap, const char *str)
{
    if (NULL == str) {
        SOAP_DBGERR("[soap] error: %d, %s, %s\n", soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
    } else {
        SOAP_DBGERR("[soap] %s error: %d, %s, %s\n", str, soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
    }
    return;
  if (NULL == str) {
    SOAP_DBGERR("[soap] error: %d, %s, %s\n", soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
  } else {
    SOAP_DBGERR("[soap] %s error: %d, %s, %s\n", str, soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
  }
  return;
}
void* proto_soap_malloc(struct soap *soap, unsigned int n)
{
    void *p = NULL;
  void *p = NULL;
    if (n > 0) {
        p = soap_malloc(soap, n);
        SOAP_ASSERT(NULL != p);
        memset(p, 0x00 ,n);
    }
    return p;
  if (n > 0) {
    p = soap_malloc(soap, n);
    SOAP_ASSERT(NULL != p);
    memset(p, 0x00 ,n);
  }
  return p;
}
struct soap *proto_soap_new(int timeout)
{
    struct soap *soap = NULL;                                                   // soap环境变量
  struct soap *soap = NULL;
    SOAP_ASSERT(NULL != (soap = soap_new()));
  SOAP_ASSERT(NULL != (soap = soap_new()));
    soap_set_namespaces(soap, namespaces);                                      // 设置soap的namespaces
    soap->recv_timeout    = timeout;
    soap->send_timeout    = timeout;
    soap->connect_timeout = timeout;
  soap_set_namespaces(soap, namespaces);
  soap->recv_timeout    = timeout;
  soap->send_timeout    = timeout;
  soap->connect_timeout = timeout;
#if defined(__linux__) || defined(__linux)                                     
    soap->socket_flags = MSG_NOSIGNAL;
  soap->socket_flags = MSG_NOSIGNAL;
#endif
    soap_set_mode(soap, SOAP_C_UTFSTRING);
  soap_set_mode(soap, SOAP_C_UTFSTRING);
    return soap;
  return soap;
}
void proto_soap_delete(struct soap *soap)
{
    soap_destroy(soap);                                                         // remove deserialized class instances (C++ only)
    soap_end(soap);                                                             // Clean up deserialized data (except class instances) and temporary data
    soap_done(soap);                                                            // Reset, close communications, and remove callbacks
    soap_free(soap);                                                            // Reset and deallocate the context created with soap_new or soap_copy
  soap_destroy(soap);                                                         // remove deserialized class instances (C++ only)
  soap_end(soap);                                                             // Clean up deserialized data (except class instances) and temporary data
  soap_done(soap);                                                            // Reset, close communications, and remove callbacks
  soap_free(soap);                                                            // Reset and deallocate the context created with soap_new or soap_copy
}
int proto_SetAuthInfo(struct soap *soap, const char *username, const char *password)
{
    int result = 0;
  int result = 0;
    SOAP_ASSERT(NULL != username);
    SOAP_ASSERT(NULL != password);
  SOAP_ASSERT(NULL != username);
  SOAP_ASSERT(NULL != password);
    result = soap_wsse_add_UsernameTokenDigest(soap, NULL, username, password);
    SOAP_CHECK_ERROR(result, soap, "add_UsernameTokenDigest");
  result = soap_wsse_add_UsernameTokenDigest(soap, NULL, username, password);
  SOAP_CHECK_ERROR(result, soap, "add_UsernameTokenDigest");
EXIT:
    return result;
  return result;
}
float para_check(float data)
@@ -85,11 +143,6 @@
  return ret;
}
/************************************************************************
  *初始化soap描述消息头
  *在本函数内部通过proto_soap_malloc分配的内存,将在proto_soap_delete中被释放
************************************************************************/
void proto_init_header(struct soap *soap)
{
    struct SOAP_ENV__Header *header = NULL;
@@ -109,27 +162,22 @@
    return;
}
/************************************************************************
  *初始化探测设备的范围和类型
  *在本函数内部通过proto_soap_malloc分配的内存,将在proto_soap_delete中被释放
************************************************************************/
void proto_init_ProbeType(struct soap *soap, struct wsdd__ProbeType *probe)
{
    struct wsdd__ScopesType *scope = NULL;                                      // 用于描述查找哪类的Web服务
    struct wsdd__ScopesType *scope = NULL;
    SOAP_ASSERT(NULL != soap);
    SOAP_ASSERT(NULL != probe);
    scope = (struct wsdd__ScopesType *)proto_soap_malloc(soap, sizeof(struct wsdd__ScopesType));
    soap_default_wsdd__ScopesType(soap, scope);                                 // 设置寻找设备的范围
    soap_default_wsdd__ScopesType(soap, scope);
    scope->__item = (char*)proto_soap_malloc(soap, strlen(SOAP_ITEM) + 1);
    strcpy(scope->__item, SOAP_ITEM);
    memset(probe, 0x00, sizeof(struct wsdd__ProbeType));
    soap_default_wsdd__ProbeType(soap, probe);
    probe->Scopes = scope;
    probe->Types  = (char*)proto_soap_malloc(soap, strlen(SOAP_TYPES) + 1);     // 设置寻找设备的类型
    probe->Types  = (char*)proto_soap_malloc(soap, strlen(SOAP_TYPES) + 1);
    strcpy(probe->Types, SOAP_TYPES);
    return;
@@ -139,7 +187,7 @@
  *rtsp://100.100.100.140:554/av0_0
  *rtsp://username:password@100.100.100.140:554/av0_0
************************************************************************/
int make_uri_withauth(char *src_uri, char *username, char *password, char *dest_uri, unsigned int size_dest_uri)
int bridge_uri(char *src_uri, const char *username, const char *password, char *dest_uri, unsigned int size_dest_uri)
{
    int result = 0;
    unsigned int needBufSize = 0;
@@ -150,14 +198,14 @@
    SOAP_ASSERT(NULL != dest_uri);
    memset(dest_uri, 0x00, size_dest_uri);
    needBufSize = strlen(src_uri) + strlen(username) + strlen(password) + 3;    // 检查缓存是否足够,包括‘:’和‘@’和字符串结束符
    needBufSize = strlen(src_uri) + strlen(username) + strlen(password) + 3;    //check buf size with character ‘:’ and ‘@'
    if (size_dest_uri < needBufSize) {
        SOAP_DBGERR("dest uri buf size is not enough.\n");
        result = -1;
        goto EXIT;
    }
    if (0 == strlen(username) && 0 == strlen(password)) {                       // 生成新的uri地址
    if (0 == strlen(username) && 0 == strlen(password)) {
        strcpy(dest_uri, src_uri);
    } else {
        char *p = strstr(src_uri, "//");