diff options
Diffstat (limited to 'mcast/common/.svn/text-base/recv_ccpp.c.svn-base')
-rw-r--r-- | mcast/common/.svn/text-base/recv_ccpp.c.svn-base | 1333 |
1 files changed, 0 insertions, 1333 deletions
diff --git a/mcast/common/.svn/text-base/recv_ccpp.c.svn-base b/mcast/common/.svn/text-base/recv_ccpp.c.svn-base deleted file mode 100644 index ce15e4c..0000000 --- a/mcast/common/.svn/text-base/recv_ccpp.c.svn-base +++ /dev/null @@ -1,1333 +0,0 @@ -/* - * (c) BayCom GmbH, http://www.baycom.de, info@baycom.de - * - * See the COPYING file for copyright information and - * how to reach the author. - * - */ - -#undef DEBUG -#include "headers.h" - -extern int port; -extern char iface[IFNAMSIZ]; - -typedef struct -{ - xmlDocPtr doc; - xmlChar *str, *key; -} xml_parser_context_t; - -STATIC void clean_xml_parser_thread (void *arg) -{ - xml_parser_context_t *c = (xml_parser_context_t *) arg; - if (c->str) { - xmlFree (c->str); - } - if (c->key) { - xmlFree (c->key); - } - if (c->doc) { - xmlFreeDoc (c->doc); - } - dbg ("Free XML parser structures!\n"); -} - -int get_tra_data (xmlChar * xmlbuff, int buffersize, tra_info_t * tra_info) -{ - xml_parser_context_t c; - xmlNode *root_element = NULL, *cur_node = NULL; - -// xmlKeepBlanksDefault (0); //reomve this f. "text" nodes -// c.doc = xmlParseMemory ((char *) xmlbuff, buffersize); -// xmlKeepBlanksDefault doesn't work after patching cam flags - c.doc = xmlReadMemory((char *) xmlbuff, buffersize, NULL, "UTF-8", XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_NOBLANKS ); - root_element = xmlDocGetRootElement (c.doc); - pthread_cleanup_push (clean_xml_parser_thread, &c); - time_t t=time(NULL); - - if (root_element != NULL) { - - cur_node = root_element->children; - - if (!xmlStrcmp (cur_node->name, (xmlChar *) "Description")) { - - root_element = cur_node->children; - while (root_element != NULL) { - c.key = NULL; - c.str = NULL; - if ((xmlStrcmp (root_element->name, (const xmlChar *) "component"))) { - warn ("Cannot parse XML data\n"); - root_element = root_element->next; - continue; - } - - cur_node = root_element->children; - if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Description"))) { - c.str = xmlGetProp (cur_node, (unsigned char *) "about"); -// fprintf(stdout,"\n%s:\n",c.str); -// fprintf(stdout,"-----------------------------------------------------------\n"); - } else { - warn ("Cannot parse XML data\n"); - root_element = root_element->next; - continue; - } -#ifdef P2P - if (c.str && (!xmlStrcmp (c.str, (const xmlChar *) "P2P_Data"))) { - cur_node = cur_node->children; - while (cur_node != NULL) { - if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Quit"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Quit: %s\n", c.key); - tra_info->quit = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "TCA_ID"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("TCA_ID: %s\n", c.key); - tra_info->tca_id = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "MC_Groups"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("MC_Groups: %s\n", c.key); - tra_info->mca_grps = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "IP"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("IP: %s\n", c.key); - inet_pton (AF_INET6, (char *) c.key, &tra_info->ipv6); - xmlFree (c.key); - } - } - cur_node = cur_node->next; - } - } else if (c.str && (!xmlStrcmp (c.str, (const xmlChar *) "Tuner_Status"))) { -#else - if (c.str && (!xmlStrcmp (c.str, (const xmlChar *) "Tuner_Status"))) { -#endif - cur_node = cur_node->children; - tra_info->tra = (tra_t *) realloc (tra_info->tra, (tra_info->tra_num + 1) * sizeof (tra_t)); - if (!tra_info->tra) { - err ("Cannot get memory for tra_t\n"); - } - tra_t *tra = tra_info->tra + tra_info->tra_num; - memset(tra, 0, sizeof (tra_t)); - tra->magic=MCLI_MAGIC; - tra->version=MCLI_VERSION; - - while (cur_node != NULL) { - if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Status"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Status: %s\n", c.key); - tra->s.st = (fe_status_t) atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Signal"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Signal: %s\n", c.key); - tra->s.strength = (u_int16_t) atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "SNR"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("SNR: %s\n", c.key); - tra->s.snr = (u_int16_t) atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "BER"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("BER: %s\n", c.key); - tra->s.ber = (u_int32_t) atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "UNC"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("UNC: %s\n", c.key); - tra->s.ucblocks = (u_int32_t) atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Slot"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Slot: %s\n", c.key); - tra->slot = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "RotorStatus"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Rotor: %s\n", c.key); - tra->rotor_status = (u_int32_t) atoi ((char *) c.key); - xmlFree (c.key); - } - - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "RotorDiff"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Rotor: %s\n", c.key); - tra->rotor_diff = (u_int32_t) atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "UUID"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("UUID: %s\n", c.key); - strncpy (tra->uuid, (char *) c.key, UUID_SIZE-1); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "MCG"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("MCG: %s\n", c.key); - inet_pton (AF_INET6, (char *) c.key, &tra->mcg); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Redirect"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Redirect: %s\n", c.key); - tra->redirect = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "NIMCurrent"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("NIMCurrent: %s\n", c.key); - tra->NIMCurrent = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "InUse"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("InUse: %s\n", c.key); - tra->InUse = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Frequency"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Frequency: %s\n", c.key); - tra->fep.frequency = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Inversion"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Inversion: %s\n", c.key); - tra->fep.inversion = (fe_spectral_inversion_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Type"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Type: %s\n", c.key); - tra->fe_type = (fe_type_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } -#ifdef P2P - else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Token"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Token: %s\n", c.key); - tra->token = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Preference"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Preference: %s\n", c.key); - tra->preference = atoi ((char *) c.key); - xmlFree (c.key); - } - } -#endif - else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "SymbolRate"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("SymbolRate: %s\n", c.key); - int val=atoi ((char *) c.key); - switch((int)tra->fe_type) { - case FE_DVBS2: - case FE_QPSK: - tra->fep.u.qpsk.symbol_rate=val; - break; - case FE_QAM: - tra->fep.u.qam.symbol_rate=val; - break; - case FE_OFDM: - default: - break; - } - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "FecInner"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("FecInner: %s\n", c.key); - int val=atoi ((char *) c.key); - switch((int)tra->fe_type) { - case FE_DVBS2: - case FE_QPSK: - tra->fep.u.qpsk.fec_inner=(fe_code_rate_t)val; - break; - case FE_QAM: - tra->fep.u.qam.fec_inner=(fe_code_rate_t)val; - break; - case FE_OFDM: - default: - break; - } - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Modulation"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Modulation: %s\n", c.key); - int val=atoi ((char *) c.key); - switch((int)tra->fe_type) { - case FE_QAM: - tra->fep.u.qam.modulation=(fe_modulation_t)val; - break; - case FE_ATSC: - tra->fep.u.vsb.modulation=(fe_modulation_t)val; - break; - case FE_DVBS2: - case FE_QPSK: - case FE_OFDM: - default: - break; - - } - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Bandwidth"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Bandwidth: %s\n", c.key); - tra->fep.u.ofdm.bandwidth=(fe_bandwidth_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "CodeRateHP"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("CodeRateHP: %s\n", c.key); - tra->fep.u.ofdm.code_rate_HP=(fe_code_rate_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "CodeRateLP"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("CodeRateLP: %s\n", c.key); - tra->fep.u.ofdm.code_rate_LP=(fe_code_rate_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Constellation"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Constellation: %s\n", c.key); - tra->fep.u.ofdm.constellation=(fe_modulation_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "TransmissionMode"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("TransmissionMode: %s\n", c.key); - tra->fep.u.ofdm.transmission_mode=(fe_transmit_mode_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "GuardInterval"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("GuardInterval: %s\n", c.key); - tra->fep.u.ofdm.guard_interval=(fe_guard_interval_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "HierarchyInformation"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("HierarchyInformation: %s\n", c.key); - tra->fep.u.ofdm.hierarchy_information=(fe_hierarchy_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } - cur_node = cur_node->next; - } - tra->lastseen=t; - tra_info->tra_num++; - } else if (c.str && (!xmlStrcmp (c.str, (const xmlChar *) "CAM"))) { - cur_node = cur_node->children; - cam_info_t *cam = tra_info->cam + tra_info->cam_num; - while(cur_node) { - if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Slot"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - cam->slot = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Status"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - cam->status = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "MenuString"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - strncpy(cam->menu_string, (char *) c.key, MAX_MENU_STR_LEN-1); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Flags"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - cam->flags = (nc_ca_caps_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "MaxSids"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - cam->max_sids = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "UseSids"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - cam->use_sids = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "PmtFlag"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - cam->capmt_flag = atoi ((char *) c.key); - xmlFree (c.key); - } - } - cur_node = cur_node->next; - } - tra_info->cam_num++; - } - xmlFree (c.str); - root_element = root_element->next; - } - } - } - xmlFreeDoc (c.doc); - pthread_cleanup_pop (0); - return (1); -} - -#ifdef CLIENT -//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -typedef struct ccpp_thread_context -{ - UDPContext *s; - xmlChar *buf; - xmlChar *dst; - int run; -} ccpp_thread_context_t; - - -//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -STATIC void clean_ccpp_thread (void *arg) -{ - ccpp_thread_context_t *c = (ccpp_thread_context_t *) arg; - if (c->s) { -#ifdef MULTI_THREAD_RECEIVER - udp_close (c->s); -#else - udp_close_buff (c->s); -#endif - } - if(c->buf) { - free (c->buf); - } - if(c->dst) { - free (c->dst); - } - dbg ("CCPP thread data buffer for tid %d freed !\n", gettid ()); -} - -void *recv_ten (void *arg) -{ - recv_info_t *r = (recv_info_t *) arg; - ccpp_thread_context_t c; - struct in6_addr ten = r->mcg; - int n; - tra_info_t tra_info; - unsigned int dstlen; - clock_t lastrecv=0; - int donetimeout=0; - - pthread_cleanup_push (clean_ccpp_thread, &c); - memset (&c, 0, sizeof (ccpp_thread_context_t)); - - c.buf=(xmlChar *)malloc(XML_BUFLEN); - if (!c.buf) { - err ("Cannot get memory for TEN buffer\n"); - } - c.dst=(xmlChar *)malloc(XML_BUFLEN * 5); - if (!c.dst) { - err ("Cannot get memory for TEN destination buffer\n"); - } - -#ifdef FE_STATUS_CLEAR - memset (&r->fe_status, 0, sizeof(recv_festatus_t)); - ioctl (r->fd, DVBLO_SET_FRONTEND_STATUS, &r->fe_status); -#endif - memset (&tra_info, 0, sizeof (tra_info_t)); - tra_info.magic=MCLI_MAGIC; - tra_info.version=MCLI_VERSION; - - mcg_set_streaming_group (&ten, STREAMING_TEN); -#ifdef MULTI_THREAD_RECEIVER - c.s = client_udp_open (&ten, port, iface); -#else - c.s = client_udp_open_buff (&ten, port, iface, XML_BUFLEN); -#endif - if (!c.s) { - warn ("client_udp_open error !\n"); - } else { -#ifdef DEBUG - char host[INET6_ADDRSTRLEN]; - inet_ntop (AF_INET6, &ten, (char *) host, INET6_ADDRSTRLEN); - dbg ("Start receive TEN for tid %d receiver %p at %s port %d %s\n", gettid (), r, host, port, iface); -#endif - r->ten_run = 1; - while (r->ten_run) { -#ifdef MULTI_THREAD_RECEIVER - if ((n = udp_read (c.s, c.buf, XML_BUFLEN, 1000, NULL)) > 0) { -#else - usleep(100000); // 10 times per seconds should be enough - if ((n = udp_read_buff (c.s, c.buf, XML_BUFLEN, 1000, NULL)) > 0) { -#endif - dstlen = XML_BUFLEN*5; - if (!gunzip (c.dst, &dstlen, c.buf, n)) { - memset (&tra_info, 0, sizeof (tra_info_t)); - tra_info.magic=MCLI_MAGIC; - tra_info.version=MCLI_VERSION; - - pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL); - if (get_tra_data (c.dst, dstlen, &tra_info)) { - lastrecv=clock(); - donetimeout=0; - if (tra_info.tra_num) { - r->fe_status = tra_info.tra->s; - if(r->handle_ten) { - r->handle_ten (tra_info.tra, r->handle_ten_context); - } - - if (tra_info.tra->redirect) { -#ifdef DEBUG - char hostname[INET6_ADDRSTRLEN]; - inet_ntop (AF_INET6, &tra_info.tra->mcg, hostname, INET6_ADDRSTRLEN); - dbg ("Redirect for receiver %p: MCG is at %s\n", r, hostname); -#endif - int ret = recv_redirect (r, tra_info.tra->mcg); - - if (ret) { - printf("New MCG for recv_ten !\n"); -#ifdef MULTI_THREAD_RECEIVER - udp_close (c.s); -#else - udp_close_buff (c.s); -#endif - struct in6_addr ten = r->mcg; - mcg_set_streaming_group (&ten, STREAMING_TEN); -#ifdef MULTI_THREAD_RECEIVER - c.s = client_udp_open (&ten, port, iface); -#else - c.s = client_udp_open_buff (&ten, port, iface, XML_BUFLEN); -#endif - if (!c.s) { - warn ("client_udp_open error !\n"); - break; - } - } - } - } - free (tra_info.tra); - tra_info.tra=NULL; - } - pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); - } else { - dbg ("uncompress failed\n"); - } - } else { - if (!donetimeout && (clock()-lastrecv)>(TEN_TIMEOUT*CLOCKS_PER_SEC)) { - donetimeout=1; - memset (&r->fe_status, 0, sizeof(recv_festatus_t)); - if(r->handle_ten) { - r->handle_ten (NULL, r->handle_ten_context); - } - dbg ("Signal Timeout on receiver %p!\n", r); - } - } - pthread_testcancel(); - } -#ifdef DEBUG - dbg ("Stop receive TEN on receiver %p %s %d %s\n", r, host, port, iface); -#endif - } - pthread_cleanup_pop (1); - r->ten_run = 1; - return NULL; -} - -int register_ten_handler (recv_info_t * r, int (*p) (tra_t *, void *c), void *c) -{ - r->handle_ten=p; - r->handle_ten_context=c; - return 0; -} - -void *recv_tra (void *arg) -{ - ccpp_thread_context_t c; - int n; - tra_info_t tra_info; - unsigned int dstlen; - struct in6_addr tra; - - pthread_cleanup_push (clean_ccpp_thread, &c); - memset (&c, 0, sizeof (ccpp_thread_context_t)); - - c.buf=(xmlChar *)malloc(XML_BUFLEN); - if (!c.buf) { - err ("Cannot get memory for TRA buffer\n"); - } - c.dst=(xmlChar *)malloc(XML_BUFLEN * 5); - if (!c.dst) { - err ("Cannot get memory for TRA destination buffer\n"); - } - - mcg_init_streaming_group (&tra, STREAMING_TRA); - -#ifdef MULTI_THREAD_RECEIVER - c.s = client_udp_open (&tra, port, iface); -#else - c.s = client_udp_open_buff (&tra, port, iface, XML_BUFLEN); -#endif - if (!c.s) { - warn ("client_udp_open error !\n"); - } else { - c.run=1; -#ifdef DEBUG - char host[INET6_ADDRSTRLEN]; - inet_ntop (AF_INET6, &tra, (char *) host, INET6_ADDRSTRLEN); - dbg ("Start receive TRA at %s port %d %s\n", host, port, iface); -#endif - while (c.run) { -#ifdef MULTI_THREAD_RECEIVER - if ((n = udp_read (c.s, c.buf, XML_BUFLEN, 500000, NULL)) > 0) { -#else - usleep(100000); // 10 times per seconds should be enough - if ((n = udp_read_buff (c.s, c.buf, XML_BUFLEN, 500000, NULL)) > 0) { -#endif - dstlen = XML_BUFLEN*5; - if (!gunzip (c.dst, &dstlen, c.buf, n)) { - memset (&tra_info, 0, sizeof (tra_info_t)); - tra_info.magic=MCLI_MAGIC; - tra_info.version=MCLI_VERSION; - - pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL); - if (get_tra_data (c.dst, dstlen, &tra_info)) { - handle_tra (&tra_info); - } - pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); - } else { - dbg ("uncompress failed\n"); - } - } -#ifdef DEBUG - dbg ("Stop receive TRA on %s %d %s len:%d\n", host, port, iface, n); -#endif - pthread_testcancel(); - } - } - pthread_cleanup_pop (1); - return NULL; -} -#endif - -//-------------------------------------------------------------------------------------------------------------------------- -int get_tca_data (xmlChar * xmlbuff, int buffersize, netceiver_info_t * nc_info) -{ - xml_parser_context_t c; - xmlNode *root_element, *cur_node; - -// xmlKeepBlanksDefault (0); //reomve this f. "text" nodes -// c.doc = xmlParseMemory ((char *) xmlbuff, buffersize); -// xmlKeepBlanksDefault doesn't work after patching cam flags - c.doc = xmlReadMemory((char *) xmlbuff, buffersize, NULL, "UTF-8", XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_NOBLANKS ); - root_element = xmlDocGetRootElement (c.doc); - pthread_cleanup_push (clean_xml_parser_thread, &c); - nc_info->magic=MCLI_MAGIC; - nc_info->version=MCLI_VERSION; - - if (root_element != NULL) { - cur_node = root_element->children; - - if (!xmlStrcmp (cur_node->name, (xmlChar *) "Description")) { - - root_element = cur_node->children; - while (root_element != NULL) { - c.key = NULL; - c.str = NULL; - if ((xmlStrcmp (root_element->name, (const xmlChar *) "component"))) { - warn ("Cannot parse XML data\n"); - root_element = root_element->next; - continue; - } - - cur_node = root_element->children; - if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Description"))) { - c.str = xmlGetProp (cur_node, (unsigned char *) "about"); - } else { - warn ("Cannot parse XML data\n"); - root_element = root_element->next; - continue; - } - if (c.str && (!xmlStrcmp (c.str, (const xmlChar *) "Platform"))) { - cur_node = cur_node->children; - while (cur_node != NULL) { - if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "OSVersion"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("OSVersion: %s\n", c.key); - strncpy (nc_info->OSVersion, (char *) c.key, UUID_SIZE-1); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "AppVersion"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("AppVersion: %s\n", c.key); - strncpy (nc_info->AppVersion, (char *) c.key, UUID_SIZE-1); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "FirmwareVersion"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("FirmwareVersion: %s\n", c.key); - strncpy (nc_info->FirmwareVersion, (char *) c.key, UUID_SIZE-1); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "HardwareVersion"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("HardwareVersion: %s\n", c.key); - strncpy (nc_info->HardwareVersion, (char *) c.key, UUID_SIZE-1); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Serial"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Serial: %s\n", c.key); - strncpy (nc_info->Serial, (char *) c.key, UUID_SIZE-1); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Vendor"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Vendor: %s\n", c.key); - strncpy (nc_info->Vendor, (char *) c.key, UUID_SIZE-1); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "DefCon"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("DefCon: %s\n", c.key); - nc_info->DefCon = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "UUID"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("UUID: %s\n", c.key); - strncpy (nc_info->uuid, (char *) c.key, UUID_SIZE-1); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Description"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("Description: %s\n", c.key); - strncpy (nc_info->Description, (char *) c.key, UUID_SIZE-1); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "IP"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("IP: %s\n", c.key); - inet_pton (AF_INET6, (char *) c.key, &nc_info->ip); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "ProcessUptime"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("ProcessUptime: %s\n", c.key); - nc_info->ProcessUptime=atoi((char *)c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "SystemUptime"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("SystemUptime: %s\n", c.key); - nc_info->SystemUptime=atoi((char *)c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "TunerTimeout"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("TunerTimeout: %s\n", c.key); - nc_info->TunerTimeout=atoi((char *)c.key); - xmlFree (c.key); - } - } - cur_node = cur_node->next; - } - } else if (c.str && (!xmlStrcmp (c.str, (const xmlChar *) "Tuner"))) { - cur_node = cur_node->children; - nc_info->tuner = (tuner_info_t *) realloc (nc_info->tuner, (nc_info->tuner_num + 1) * sizeof (tuner_info_t)); - if (!nc_info->tuner) { - err ("Cannot get memory for tuner_info\n"); - } - - tuner_info_t *t = nc_info->tuner + nc_info->tuner_num; - memset (t, 0, sizeof (tuner_info_t)); - t->magic=MCLI_MAGIC; - t->version=MCLI_VERSION; - - while (cur_node != NULL) { - if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Name"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - strncpy (t->fe_info.name, (char *) c.key, 127); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Type"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - if ((!xmlStrcmp (c.key, (const xmlChar *) "DVB-S"))) - t->fe_info.type = FE_QPSK; - if ((!xmlStrcmp (c.key, (const xmlChar *) "DVB-S2"))) - t->fe_info.type = (fe_type_t)FE_DVBS2; - if ((!xmlStrcmp (c.key, (const xmlChar *) "DVB-C"))) - t->fe_info.type = FE_QAM; - if ((!xmlStrcmp (c.key, (const xmlChar *) "DVB-T"))) - t->fe_info.type = FE_OFDM; - if ((!xmlStrcmp (c.key, (const xmlChar *) "ATSC"))) - t->fe_info.type = FE_ATSC; - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "FrequencyMin"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - t->fe_info.frequency_min = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "FrequencyMax"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - t->fe_info.frequency_max = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "FrequencyStepSize"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - t->fe_info.frequency_stepsize = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "FrequencyTolerance"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - t->fe_info.frequency_tolerance = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "SymbolRateMin"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - t->fe_info.symbol_rate_min = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "SymbolRateMax"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - t->fe_info.symbol_rate_max = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "SymbolRateTolerance"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - t->fe_info.symbol_rate_tolerance = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Caps"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - t->fe_info.caps = (fe_caps_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Slot"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - t->slot = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Preference"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - t->preference = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "UUID"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - strncpy (t->uuid, (char *) c.key, UUID_SIZE-1); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "SatelliteListName"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - strncpy (t->SatelliteListName, (char *) c.key, UUID_SIZE-1); - xmlFree (c.key); - } - } - cur_node = cur_node->next; - } - nc_info->tuner_num++; - } else if (c.str && !(xmlStrcmp (c.str, (xmlChar *) "CI"))) { - cur_node = cur_node->children; - recv_cacaps_t *ci=&nc_info->ci; - while(cur_node) { - if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "component"))) { - xmlNode *l2_node = cur_node->children; - if ((!xmlStrcmp (l2_node->name, (const xmlChar *) "Description"))) { - c.key = xmlGetProp (l2_node, (unsigned char *) "about"); - dbg ("Parsing CI-Description: %s\n", c.key); - if (c.key && !xmlStrcmp (c.key, (xmlChar *) "Capabilities")) { - xmlFree (c.key); - xmlNode * l3_node = l2_node->children; - while (l3_node != NULL) { - dbg ("Capability-Element: %s\n", l3_node->name); - if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "SlotNum"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("SlotNum: %s\n", c.key); - ci->cap.slot_num=atoi((char*)c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "SlotType"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("SlotType: %s\n", c.key); - ci->cap.slot_type=atoi((char*)c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "DescrNum"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("DescrNum: %s\n", c.key); - ci->cap.descr_num=atoi((char*)c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "DescrType"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("DescrType: %s\n", c.key); - ci->cap.descr_type=atoi((char*)c.key); - xmlFree (c.key); - } - } - l3_node = l3_node->next; - } - } else if (c.key && !xmlStrcmp (c.key, (xmlChar *) "Slot")) { - xmlFree (c.key); - xmlNode *l3_node = l2_node->children; - int slot=-1; - while (l3_node != NULL) { - dbg ("Slot-Element: %s\n", l3_node->name); - if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "Num"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("Num: %s\n", c.key); - int x=atoi((char*)c.key); - if( (x < 0) || (x >= CA_MAX_SLOTS) ) { - continue; - } - slot=x; - ci->info[slot].num=slot; - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "Type"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("Type: %s\n", c.key); - if(slot>=0) { - ci->info[slot].type=atoi((char*)c.key); - } - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "Flags"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("Flags: %s\n", c.key); - if(slot>=0) { - ci->info[slot].flags=atoi((char*)c.key); - } - xmlFree (c.key); - } - } - l3_node = l3_node->next; - } - } - } - } - cur_node = cur_node->next; - } - //CAM start - } else if (c.str && !(xmlStrcmp (c.str, (xmlChar *) "CAM"))) { - cur_node = cur_node->children; - cam_info_t *cam = nc_info->cam + nc_info->cam_num; - while(cur_node) { - if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Slot"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - cam->slot = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Status"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - cam->status = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "MenuString"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - strncpy(cam->menu_string, (char *) c.key, MAX_MENU_STR_LEN-1); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "Flags"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - cam->flags = (nc_ca_caps_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "MaxSids"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - cam->max_sids = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "UseSids"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - cam->use_sids = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "PmtFlag"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - cam->capmt_flag = atoi ((char *) c.key); - xmlFree (c.key); - } - } - cur_node = cur_node->next; - } - nc_info->cam_num++; - //CAM end - } else if (c.str && !(xmlStrcmp (c.str, (xmlChar *) "SatelliteList"))) { - cur_node = cur_node->children; - nc_info->sat_list = (satellite_list_t *) realloc (nc_info->sat_list, (nc_info->sat_list_num + 1) * sizeof (satellite_list_t)); - if (!nc_info->sat_list) { - err ("Cannot get memory for sat_list\n"); - } - - satellite_list_t *sat_list = nc_info->sat_list + nc_info->sat_list_num; - memset (sat_list, 0, sizeof (satellite_list_t)); - sat_list->magic=MCLI_MAGIC; - sat_list->version=MCLI_VERSION; - - while (cur_node != NULL) { - if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "SatelliteListName"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("SatelliteListName: %s\n", c.key); - strncpy (sat_list->Name, (char *) c.key, UUID_SIZE-1); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "component"))) { - xmlNode *l2_node = cur_node->children; - if ((!xmlStrcmp (l2_node->name, (const xmlChar *) "Description"))) { - c.key = xmlGetProp (l2_node, (unsigned char *) "about"); - dbg ("Parsing L2-Description: %s\n", c.key); - if (c.key && !xmlStrcmp (c.key, (xmlChar *) "Satellite")) { - xmlFree (c.key); - l2_node = l2_node->children; - sat_list->sat = (satellite_info_t *) realloc (sat_list->sat, (sat_list->sat_num + 1) * sizeof (satellite_info_t)); - if (!sat_list->sat) { - err ("Cannot get memory for sat\n"); - } - - satellite_info_t *sat = sat_list->sat + sat_list->sat_num; - memset (sat, 0, sizeof (satellite_info_t)); - sat->magic=MCLI_MAGIC; - sat->version=MCLI_VERSION; - - while (l2_node != NULL) { - dbg ("L2-Element: %s\n", l2_node->name); - if ((!xmlStrcmp (l2_node->name, (const xmlChar *) "Name"))) { - c.key = xmlNodeListGetString (c.doc, l2_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("Name: %s\n", c.key); - strncpy (sat->Name, (char *) c.key, UUID_SIZE-1); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l2_node->name, (const xmlChar *) "Position"))) { - c.key = xmlNodeListGetString (c.doc, l2_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("Position: %s\n", c.key); - sat->SatPos = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l2_node->name, (const xmlChar *) "PositionMin"))) { - c.key = xmlNodeListGetString (c.doc, l2_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("PositionMin: %s\n", c.key); - sat->SatPosMin = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l2_node->name, (const xmlChar *) "PositionMax"))) { - c.key = xmlNodeListGetString (c.doc, l2_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("PositionMax: %s\n", c.key); - sat->SatPosMax = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l2_node->name, (const xmlChar *) "AutoFocus"))) { - c.key = xmlNodeListGetString (c.doc, l2_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("AutoFocus: %s\n", c.key); - sat->AutoFocus = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l2_node->name, (const xmlChar *) "Latitude"))) { - c.key = xmlNodeListGetString (c.doc, l2_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("Latitude: %s\n", c.key); - sat->Latitude = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l2_node->name, (const xmlChar *) "Longitude"))) { - c.key = xmlNodeListGetString (c.doc, l2_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("Longitude: %s\n", c.key); - sat->Longitude = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l2_node->name, (const xmlChar *) "Type"))) { - c.key = xmlNodeListGetString (c.doc, l2_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("Type: %s\n", c.key); - sat->type = (satellite_source_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l2_node->name, (const xmlChar *) "component"))) { - xmlNode *l3_node = l2_node->children; - - if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "Description"))) { - c.key = xmlGetProp (l3_node, (unsigned char *) "about"); - dbg ("Parsing L3-Description: %s\n", c.key); - if (c.key && !xmlStrcmp (c.key, (xmlChar *) "SatelliteComponent")) { - xmlFree (c.key); - l3_node = l3_node->children; - dbg ("Now checking for SatelliteCompontents\n"); - sat->comp = (satellite_component_t *) realloc (sat->comp, (sat->comp_num + 1) * sizeof (satellite_component_t)); - if (!sat->comp) { - err ("Cannot get memory for comp\n"); - } - - satellite_component_t *comp = sat->comp + sat->comp_num; - memset (comp, 0, sizeof (satellite_component_t)); - comp->magic=MCLI_MAGIC; - comp->version=MCLI_VERSION; - - while (l3_node != NULL) { - dbg ("L3-Element: %s\n", l3_node->name); - if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "Polarisation"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("Polarisation: %s\n", c.key); - comp->Polarisation = (polarisation_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "RangeMin"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("RangeMin: %s\n", c.key); - comp->RangeMin = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "RangeMax"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("RangeMax: %s\n", c.key); - comp->RangeMax = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "LOF"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("LOF: %s\n", c.key); - comp->LOF = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "Voltage"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("Voltage: %s\n", c.key); - comp->sec.voltage = (fe_sec_voltage_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "Tone"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("Tone: %s\n", c.key); - comp->sec.tone_mode = (fe_sec_tone_mode_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "MiniCmd"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - if(c.key) { - dbg ("MiniCmd: %s\n", c.key); - comp->sec.mini_cmd = (fe_sec_mini_cmd_t)atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (l3_node->name, (const xmlChar *) "DiSEqC_Cmd"))) { - c.key = xmlNodeListGetString (c.doc, l3_node->xmlChildrenNode, 1); - dbg ("DiSEqC_Cmd: %s\n", c.key); - if(c.key) { - int v[6], i, n=0; - char *s= (char *)c.key; - struct dvb_diseqc_master_cmd *diseqc_cmd=&comp->sec.diseqc_cmd; - do { - dbg("Parsing: %s\n",s); - diseqc_cmd->msg_len = sscanf (s, "%x %x %x %x %x %x", v, v + 1, v + 2, v + 3, v + 4, v + 5); - for (i = 0; i < diseqc_cmd->msg_len; i++) { - diseqc_cmd->msg[i] = v[i]; - } - s=strchr(s,','); - if(s) { - s++; - } - diseqc_cmd=comp->diseqc_cmd+n; - n++; - } while(s && n<=DISEQC_MAX_EXTRA); - xmlFree (c.key); - comp->diseqc_cmd_num=n; - } - } - l3_node = l3_node->next; - } - sat->comp_num++; - } else { - xmlFree (c.key); - } - } - } - l2_node = l2_node->next; - } - sat_list->sat_num++; - } else { - xmlFree (c.key); - } - } - } - cur_node = cur_node->next; - } - nc_info->sat_list_num++; - } - xmlFree (c.str); - root_element = root_element->next; - } - } - } - - xmlFreeDoc (c.doc); - pthread_cleanup_pop (0); - return (1); -} - -#ifdef CLIENT - -void *recv_tca (void *arg) -{ - int n; - ccpp_thread_context_t c; - unsigned int dstlen; - netceiver_info_t nc_info; - struct in6_addr tca; - - pthread_cleanup_push (clean_ccpp_thread, &c); - - c.buf=(xmlChar *)malloc(XML_BUFLEN); - if (!c.buf) { - err ("Cannot get memory for TRA buffer\n"); - } - c.dst=(xmlChar *)malloc(XML_BUFLEN * 5); - if (!c.dst) { - err ("Cannot get memory for TRA destination buffer\n"); - } - - mcg_init_streaming_group (&tca, STREAMING_TCA); - -#ifdef MULTI_THREAD_RECEIVER - c.s = client_udp_open (&tca, port, iface); -#else - c.s = client_udp_open_buff (&tca, port, iface, XML_BUFLEN); -#endif - if (!c.s) { - warn ("client_udp_open error !\n"); - } else { - c.run=1; -#ifdef DEBUG - char host[INET6_ADDRSTRLEN]; - inet_ntop (AF_INET6, &tca, (char *) host, INET6_ADDRSTRLEN); - dbg ("Start Receive TCA on interface %s port %d\n", iface, port); -#endif - while (c.run) { -#ifdef MULTI_THREAD_RECEIVER - if ((n = udp_read (c.s, c.buf, XML_BUFLEN, 500000, NULL)) > 0) { -#else - usleep(100000); // 10 times per seconds should be enough - if ((n = udp_read_buff (c.s, c.buf, XML_BUFLEN, 500000, NULL)) > 0) { -#endif - dstlen = XML_BUFLEN * 5; - if (!gunzip (c.dst, &dstlen, c.buf, n)) { - memset (&nc_info, 0, sizeof (netceiver_info_t)); - - pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL); - get_tca_data (c.dst, dstlen, &nc_info); - handle_tca (&nc_info); - pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); - } else { - dbg ("uncompress failed\n"); - } - } - pthread_testcancel(); - } - } - pthread_cleanup_pop (1); - return NULL; -} -#endif |