| | |
| | |
|
| | | #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)
|
| | |
| | | return ret;
|
| | | }
|
| | |
|
| | | /************************************************************************
|
| | | *初始化soap描述消息头
|
| | |
|
| | | *在本函数内部通过proto_soap_malloc分配的内存,将在proto_soap_delete中被释放
|
| | | ************************************************************************/
|
| | | void proto_init_header(struct soap *soap)
|
| | | {
|
| | | struct SOAP_ENV__Header *header = NULL;
|
| | |
| | | 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;
|
| | |
| | | *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;
|
| | |
| | | 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, "//");
|