diff options
Diffstat (limited to 'mcast/client/.svn/text-base/mmi_handler.c.svn-base')
-rw-r--r-- | mcast/client/.svn/text-base/mmi_handler.c.svn-base | 336 |
1 files changed, 0 insertions, 336 deletions
diff --git a/mcast/client/.svn/text-base/mmi_handler.c.svn-base b/mcast/client/.svn/text-base/mmi_handler.c.svn-base deleted file mode 100644 index 716c7f1..0000000 --- a/mcast/client/.svn/text-base/mmi_handler.c.svn-base +++ /dev/null @@ -1,336 +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. - * - * modified by Reel Multimedia, http://www.reel-multimedia.com, info@reel-multimedia.com - * 01042010 DL: use a single thread for reading from network layer (uses less resources) - * - */ - -#include "headers.h" - -//--------------------------------------------------------------------------------------------- -void mmi_print_info (mmi_info_t * m) -{ - char str[INET6_ADDRSTRLEN]; - printf ("------------------\n"); - inet_ntop (AF_INET6, &m->ipv6, (char *) str, INET6_ADDRSTRLEN); - printf ("IP: %s\n", str); - printf ("UUID: %s\n", m->uuid); - printf ("Slot: %d\n", m->slot); - - int i; - for (i = 0; i < m->caid_num; i++) { - caid_mcg_t *cm = m->caids + i; - printf ("%i.SID: %d\n", i, cm->caid); - inet_ntop (AF_INET6, &cm->mcg, (char *) str, INET6_ADDRSTRLEN); - printf ("%i.MCG: %s\n", i, str); - } - printf ("TEXT:\n===================\n %s \n===================\n", m->mmi_text); - -} - -//--------------------------------------------------------------------------------------------- -int mmi_open_menu_session (char *uuid, char *intf, int port, int cmd) -{ - int ret; - int j, sockfd; - struct in6_addr ipv6; - char iface[IFNAMSIZ]; - - inet_pton (AF_INET6, uuid, &ipv6); - - if (!intf || !strlen (intf)) { - struct intnode *intn = int_find_first (); - if (intn) { - strcpy (iface, intn->name); - } - } else { - strncpy (iface, intf, sizeof (iface)); - iface[sizeof (iface) - 1] = 0; - } - if (!port) { - port = 23013; - } - - sockfd = socket (PF_INET6, SOCK_STREAM, 0); - j = 1; - if (setsockopt (sockfd, SOL_SOCKET, SO_REUSEADDR, (_SOTYPE) & j, sizeof (j)) < 0) { - err ("setsockopt REUSEADDR\n"); - } - - j = 1; - if (setsockopt (sockfd, SOL_SOCKET, TCP_NODELAY, (_SOTYPE) & j, sizeof (j)) < 0) { - warn ("setsockopt TCP_NODELAY\n"); - } - - dbg ("Connect To: %s\n", uuid); - - struct sockaddr_in6 addr; - memset (&addr, 0, sizeof (struct sockaddr_in6)); - - addr.sin6_family = AF_INET6; - addr.sin6_port = htons (port); - addr.sin6_addr = ipv6; - addr.sin6_scope_id = if_nametoindex (iface); - - ret = connect (sockfd, (struct sockaddr *) &addr, sizeof (struct sockaddr_in6)); - if (ret < 0) { - dbg ("Failed to access NetCeiver MMI support\n"); - return -1; - } - //send init cmd - char buf[128]; - memset (buf, 0, sizeof (buf)); - dbg ("Request CAM slot %d \n", cmd); - sprintf (buf, "%x", cmd); - int n = send (sockfd, buf, strlen (buf) + 1, 0); - if (n < 0) { - dbg ("unable to sent mmi connection cmd !\n"); - closesocket (sockfd); - return -1; - } - dbg ("MMI SESSION : OK\n"); - return sockfd; -} - -//--------------------------------------------------------------------------------------------- -void mmi_close_menu_session (int s) -{ - closesocket (s); -} - -//--------------------------------------------------------------------------------------------- -int mmi_cam_reset (char *uuid, char *intf, int port, int slot) -{ - int cmd = (slot << 12) | 0xfff; - printf ("Reseting slot %d (cmd %x)...\n", slot, cmd); - int sock = mmi_open_menu_session (uuid, intf, port, cmd); - if (sock < 1) { - printf ("Unable to reset slot %d on netceiver %s...\n", slot, uuid); - } - closesocket (sock); - return 0; -} -//--------------------------------------------------------------------------------------------- -int mmi_cam_reinit (char *uuid, char *intf, int port, int slot) -{ - int cmd = (slot << 12) | 0xeee; - printf ("Reinitializing slot %d (cmd %x)...\n", slot, cmd); - int sock = mmi_open_menu_session (uuid, intf, port, cmd); - if (sock < 1) { - printf ("Unable to reset slot %d on netceiver %s...\n", slot, uuid); - } - closesocket (sock); - return 0; -} -//--------------------------------------------------------------------------------------------- -int mmi_get_menu_text (int sockfd, char *buf, int buf_len, int timeout) -{ - int n = -1; - struct pollfd p; - memset (buf, 0, buf_len); - p.fd = sockfd; - p.events = POLLIN; - if (poll (&p, 1, (timeout+999)>>10) > 0) { - n = recv (sockfd, buf, buf_len, 0); //MSG_DONTWAIT); - } - if (n > 0) { - dbg ("recv:\n%s \n", buf); - } - return n; -} - -//--------------------------------------------------------------------------------------------- -int mmi_send_menu_answer (int sockfd, char *buf, int buf_len) -{ - dbg ("send: %s len %d \n", buf, buf_len); - int n; - n = send (sockfd, buf, buf_len, 0); - if (n < 0) { - dbg ("mmi_send_answer: error sending !\n"); - } - return n; -} - -//--------------------------------------------------------------------------------------------- -UDPContext *mmi_broadcast_client_init (int port, char *intf) -{ - UDPContext *s; - char mcg[1024]; - char iface[IFNAMSIZ]; - //FIXME: move to common - strcpy (mcg, "ff18:6000::"); - if (!intf || !strlen (intf)) { - struct intnode *intn = int_find_first (); - if (intn) { - strcpy (iface, intn->name); - } - } else { - strncpy (iface, intf, sizeof (iface)); - iface[sizeof (iface) - 1] = 0; - } - if (!port) { - port = 23000; - } - - s = client_udp_open_host (mcg, port, iface); - if (!s) { - dbg ("client udp open host error !\n"); - } - - return s; -} - -void mmi_broadcast_client_exit (UDPContext * s) -{ - udp_close (s); -} - -//--------------------------------------------------------------------------------------------- -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 mmi_get_data (xmlChar * xmlbuff, int buffersize, mmi_info_t * mmi_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); - root_element = xmlDocGetRootElement (c.doc); - pthread_cleanup_push (clean_xml_parser_thread, &c); - - - 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; - } - if (c.str && (!xmlStrcmp (c.str, (const xmlChar *) "MMIData"))) { - cur_node = cur_node->children; - while (cur_node != NULL) { - 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, &mmi_info->ipv6); - 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); - strcpy (mmi_info->uuid, (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); - mmi_info->slot = atoi ((char *) c.key); - xmlFree (c.key); - } - } else if ((!xmlStrcmp (cur_node->name, (const xmlChar *) "TEXT"))) { - c.key = xmlNodeListGetString (c.doc, cur_node->xmlChildrenNode, 1); - if (c.key) { - dbg ("TEXT: %s\n", c.key); - int olen = MMI_TEXT_LENGTH, ilen = strlen ((char *) c.key); - - UTF8Toisolat1 ((unsigned char *) mmi_info->mmi_text, &olen, c.key, &ilen); - - xmlFree (c.key); - } - } - cur_node = cur_node->next; - } - } else if (c.str && (!xmlStrcmp (c.str, (const xmlChar *) "ProgramNumberIDs"))) { - cur_node = cur_node->children; - while (cur_node != NULL) { - 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); - struct in6_addr mcg; - inet_pton (AF_INET6, (char *) c.key, &mcg); - int sid; - mcg_get_id (&mcg, &sid); - mcg_set_id (&mcg, 0); - mmi_info->caids = (caid_mcg_t *) realloc (mmi_info->caids, sizeof (caid_mcg_t) * (mmi_info->caid_num + 1)); - if (!mmi_info->caids) - err ("mmi_get_data: out of memory\n"); - caid_mcg_t *cm = mmi_info->caids + mmi_info->caid_num; - cm->caid = sid; - cm->mcg = mcg; - mmi_info->caid_num++; - xmlFree (c.key); - } - } - cur_node = cur_node->next; - } - } - xmlFree (c.str); - root_element = root_element->next; - } - } - } - - xmlFreeDoc (c.doc); - pthread_cleanup_pop (0); - return 1; -} - -//--------------------------------------------------------------------------------------------- -int mmi_poll_for_menu_text (UDPContext * s, mmi_info_t * m, int timeout) -{ - char buf[8192]; - int n = 0; - if (s) { - n = udp_read (s, (unsigned char *) buf, sizeof (buf), timeout, NULL); - if (n > 0) { - dbg ("recv:\n%s \n", buf); - memset (m, 0, sizeof (mmi_info_t)); - mmi_get_data ((xmlChar *) buf, n, m); - } - } - return n; -} -//--------------------------------------------------------------------------------------------- |