/* * File: util.cpp * Author: savop, andreas * * Created on 21. Mai 2009, 21:25 * * Extracted from streamdev-server plugin common.c * $Id: common.c,v 1.6 2008/03/31 10:34:26 schmirl Exp $ */ #include "util.h" #include "../common.h" #include #include #include #include #include #include #include char* substr(const char* str, unsigned int offset, unsigned int length){ if(offset > strlen(str)) return NULL; if(length > strlen(str+offset)) length = strlen(str+offset); char* substring = (char*)malloc(sizeof(substring)*length+1); strncpy(substring, str+offset, length); substring[length] = '\0'; return substring; } const char* getMACFromInterface(const char* Interface) { int fd; struct ifreq ifr; fd = socket(AF_INET, SOCK_DGRAM, 0); ifr.ifr_addr.sa_family = AF_INET; strncpy(ifr.ifr_name, Interface, IFNAMSIZ-1); ioctl(fd, SIOCGIFHWADDR, &ifr); close(fd); char *ret = new char[18]; sprintf(ret, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", (unsigned char)ifr.ifr_hwaddr.sa_data[0], (unsigned char)ifr.ifr_hwaddr.sa_data[1], (unsigned char)ifr.ifr_hwaddr.sa_data[2], (unsigned char)ifr.ifr_hwaddr.sa_data[3], (unsigned char)ifr.ifr_hwaddr.sa_data[4], (unsigned char)ifr.ifr_hwaddr.sa_data[5]); return ret; } char** getNetworkInterfaces(int *count){ int fd; struct ifconf ifc; struct ifreq ifr[10]; int nifaces, i; char** ifaces; *count = 0; memset(&ifc,0,sizeof(ifc)); ifc.ifc_buf = (char*) (ifr); ifc.ifc_len = sizeof(ifr); fd = socket(AF_INET, SOCK_DGRAM, 0); int ret = ioctl(fd, SIOCGIFCONF, &ifc); close(fd); if(ret==0){ nifaces = ifc.ifc_len/sizeof(struct ifreq); ifaces = new char* [nifaces+1]; for(i = 0; i < nifaces; i++){ ifaces[i] = new char[IFNAMSIZ]; ifaces[i] = strdup(ifr[i].ifr_name); } ifaces[i] = NULL; *count = nifaces; return ifaces; } else { return NULL; } } const sockaddr_in* getIPFromInterface(const char* Interface){ if(Interface==NULL) return NULL; int fd; struct ifreq ifr; fd = socket(AF_INET, SOCK_DGRAM, 0); /* I want to get an IPv4 IP address */ ifr.ifr_addr.sa_family = AF_INET; /* I want IP address attached to "eth0" */ strncpy(ifr.ifr_name, Interface, IFNAMSIZ-1); int ret = ioctl(fd, SIOCGIFADDR, &ifr); close(fd); const sockaddr_in* IpAddress = new sockaddr_in; if(ret==0){ IpAddress = (sockaddr_in *)&ifr.ifr_addr; return IpAddress; } else { delete IpAddress; return NULL; } } cMenuEditIpItem::cMenuEditIpItem(const char *Name, char *Value):cMenuEditItem(Name) { value = Value; curNum = -1; pos = -1; step = false; Set(); } cMenuEditIpItem::~cMenuEditIpItem() { } void cMenuEditIpItem::Set(void) { char buf[1000]; if (pos >= 0) { in_addr_t addr = inet_addr(value); if ((int)addr == -1) addr = 0; int p = 0; for (int i = 0; i < 4; ++i) { p += snprintf(buf + p, sizeof(buf) - p, pos == i ? "[%d]" : "%d", pos == i ? curNum : (addr >> (i * 8)) & 0xff); if (i < 3) buf[p++] = '.'; } SetValue(buf); } else SetValue(value); } eOSState cMenuEditIpItem::ProcessKey(eKeys Key) { in_addr addr; addr.s_addr = inet_addr(value); if ((int)addr.s_addr == -1) addr.s_addr = 0; switch (Key) { case kUp: if (pos >= 0) { if (curNum < 255) ++curNum; } else return cMenuEditItem::ProcessKey(Key); break; case kDown: if (pos >= 0) { if (curNum > 0) --curNum; } else return cMenuEditItem::ProcessKey(Key); break; case kOk: if (pos >= 0) { addr.s_addr = inet_addr(value); if ((int)addr.s_addr == -1) addr.s_addr = 0; addr.s_addr &= ~(0xff << (pos * 8)); addr.s_addr |= curNum << (pos * 8); strcpy(value, inet_ntoa(addr)); } else return cMenuEditItem::ProcessKey(Key); curNum = -1; pos = -1; break; case kRight: if (pos >= 0) { addr.s_addr = inet_addr(value); if ((int)addr.s_addr == -1) addr.s_addr = 0; addr.s_addr &= ~(0xff << (pos * 8)); addr.s_addr |= curNum << (pos * 8); strcpy(value, inet_ntoa(addr)); } if (pos == -1 || pos == 3) pos = 0; else ++pos; curNum = (addr.s_addr >> (pos * 8)) & 0xff; step = true; break; case kLeft: if (pos >= 0) { addr.s_addr = inet_addr(value); if ((int)addr.s_addr == -1) addr.s_addr = 0; addr.s_addr &= ~(0xff << (pos * 8)); addr.s_addr |= curNum << (pos * 8); strcpy(value, inet_ntoa(addr)); } if (pos <= 0) pos = 3; else --pos; curNum = (addr.s_addr >> (pos * 8)) & 0xff; step = true; break; case k0 ... k9: /* Netbeans reports error with this line (.. is okay but wrong) */ if (pos == -1) pos = 0; if (curNum == -1 || step) { curNum = Key - k0; step = false; } else curNum = curNum * 10 + (Key - k0); if ((curNum * 10 > 255) || (curNum == 0)) { in_addr addr; addr.s_addr = inet_addr(value); if ((int)addr.s_addr == -1) addr.s_addr = 0; addr.s_addr &= ~(0xff << (pos * 8)); addr.s_addr |= curNum << (pos * 8); strcpy(value, inet_ntoa(addr)); if (++pos == 4) pos = 0; curNum = (addr.s_addr >> (pos * 8)) & 0xff; step = true; } break; default: return cMenuEditItem::ProcessKey(Key); } Set(); return osContinue; } const char* escapeSQLite(const char* Data, char** Buf){ if(!Data){ *Buf = NULL; } else { std::string NewData = ""; int Char = 0; for(unsigned int i = 0; i < strlen(Data); i++){ Char = Data[i]; switch(Char){ case L'\'': NewData += "''"; break; default: NewData += Data[i]; break; } } *Buf = strdup(NewData.c_str()); } return (*Buf); } const char* escapeXMLCharacters(const char* Data, char** Buf){ if(Data==NULL){ ERROR("Escape XML: No data to escape"); return NULL; } std::string NewData = ""; int Char = 0; for(unsigned int i = 0; i < strlen(Data); i++){ Char = Data[i]; switch(Char){ case L'€': NewData += "€"; break; case L'"': NewData += """; break; case L'&': NewData += "&"; break; case L'<': NewData += "<"; break; case L'>': NewData += ">"; break; case L'¡': NewData += "¡"; break; case L'¢': NewData += "¢"; break; case L'£': NewData += "£"; break; case L'¤': NewData += "¤"; break; case L'¥': NewData += "¥"; break; case L'¦': NewData += "¦"; break; case L'§': NewData += "§"; break; case L'¨': NewData += "¨"; break; case L'©': NewData += "©"; break; case L'ª': NewData += "ª"; break; case L'¬': NewData += "¬"; break; case L'­': NewData += "­"; break; case L'®': NewData += "®"; break; case L'¯': NewData += "¯"; break; case L'°': NewData += "°"; break; case L'±': NewData += "±"; break; case L'²': NewData += "²"; break; case L'³': NewData += "³"; break; case L'´': NewData += "´"; break; case L'µ': NewData += "µ"; break; case L'¶': NewData += "¶"; break; case L'·': NewData += "·"; break; case L'¸': NewData += "¸"; break; case L'¹': NewData += "¹"; break; case L'º': NewData += "º"; break; case L'»': NewData += "»"; break; case L'«': NewData += "«"; break; case L'¼': NewData += "¼"; break; case L'½': NewData += "½"; break; case L'¾': NewData += "¾"; break; case L'¿': NewData += "¿"; break; case L'À': NewData += "À"; break; case L'Á': NewData += "Á"; break; case L'Â': NewData += "Â"; break; case L'Ã': NewData += "Ã"; break; case L'Ä': NewData += "Ä"; break; case L'Å': NewData += "Å"; break; case L'Æ': NewData += "Æ"; break; case L'Ç': NewData += "Ç"; break; case L'È': NewData += "È"; break; case L'É': NewData += "É"; break; case L'Ê': NewData += "Ê"; break; case L'Ë': NewData += "Ë"; break; case L'Ì': NewData += "Ì"; break; case L'Í': NewData += "Í"; break; case L'Î': NewData += "Î"; break; case L'Ï': NewData += "Ï"; break; case L'Ð': NewData += "Ð"; break; case L'Ñ': NewData += "Ñ"; break; case L'Ò': NewData += "Ò"; break; case L'Ó': NewData += "Ó"; break; case L'Ô': NewData += "Ô"; break; case L'Õ': NewData += "Õ"; break; case L'Ö': NewData += "Ö"; break; case L'×': NewData += "×"; break; case L'Ø': NewData += "Ø"; break; case L'Ù': NewData += "Ù"; break; case L'Ú': NewData += "Ú"; break; case L'Û': NewData += "Û"; break; case L'Ü': NewData += "Ü"; break; case L'Ý': NewData += "Ý"; break; case L'Þ': NewData += "Þ"; break; case L'ß': NewData += "ß"; break; case L'à': NewData += "à"; break; case L'á': NewData += "á"; break; case L'â': NewData += "â"; break; case L'ã': NewData += "ã"; break; case L'ä': NewData += "ä"; break; case L'å': NewData += "å"; break; case L'æ': NewData += "æ"; break; case L'ç': NewData += "ç"; break; case L'è': NewData += "è"; break; case L'é': NewData += "é"; break; case L'ê': NewData += "ê"; break; case L'ë': NewData += "ë"; break; case L'ì': NewData += "ì"; break; case L'í': NewData += "í"; break; case L'î': NewData += "î"; break; case L'ï': NewData += "ï"; break; case L'ð': NewData += "ð"; break; case L'ñ': NewData += "ñ"; break; case L'ò': NewData += "ò"; break; case L'ó': NewData += "ó"; break; case L'ô': NewData += "ô"; break; case L'õ': NewData += "õ"; break; case L'ö': NewData += "ö"; break; case L'÷': NewData += "÷"; break; case L'ø': NewData += "ø"; break; case L'ù': NewData += "ù"; break; case L'ú': NewData += "ú"; break; case L'û': NewData += "û"; break; case L'ü': NewData += "ü"; break; case L'ý': NewData += "ý"; break; case L'þ': NewData += "þ"; break; default: NewData += Data[i]; break; } } *Buf = strdup(NewData.c_str()); return (*Buf); } //Function copied from Intel SDK /////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// /******************************************************************************** * SampleUtil_GetFirstDocumentItem * * Description: * Given a document node, this routine searches for the first element * named by the input string item, and returns its value as a string. * String must be freed by caller using free. * Parameters: * doc -- The DOM document from which to extract the value * item -- The item to search for * * ********************************************************************************/ char* ixmlGetFirstDocumentItem( IN IXML_Document * doc, IN const char *item, int* error ) { IXML_NodeList *nodeList = NULL; IXML_Node *textNode = NULL; IXML_Node *tmpNode = NULL; char *ret = NULL; *error = 0; nodeList = ixmlDocument_getElementsByTagName( doc, ( char * )item ); if( nodeList != NULL ) { if( ( tmpNode = ixmlNodeList_item( nodeList, 0 ) ) ) { textNode = ixmlNode_getFirstChild( tmpNode ); if(textNode != NULL){ ret = strdup( ixmlNode_getNodeValue( textNode ) ); } } } else { *error = -1; } if( nodeList != NULL) { ixmlNodeList_free( nodeList ); } return ret; } int ixmlAddProperty(IXML_Document* document, IXML_Element* node, const char* upnpproperty, const char* value){ if(!node) return -1; IXML_Element* PropertyNode = NULL; const char* attribute = att(upnpproperty); const char* property = prop(upnpproperty); if(attribute){ if(strcasecmp(property,"")){ ixmlElement_setAttribute(node, attribute, value); } else { IXML_NodeList* NodeList = ixmlElement_getElementsByTagName(node, property); if(NodeList!=NULL){ IXML_Node* Node = ixmlNodeList_item(NodeList, 0); PropertyNode = (IXML_Element*) ixmlNode_getFirstChild(Node); if(PropertyNode){ ixmlElement_setAttribute(PropertyNode, attribute, value); } else { ixmlNodeList_free(NodeList); return -1; } } else { return -1; } } } else { PropertyNode = ixmlDocument_createElement(document, property); IXML_Node* PropertyText = ixmlDocument_createTextNode(document, value); ixmlNode_appendChild((IXML_Node*) PropertyNode, PropertyText); ixmlNode_appendChild((IXML_Node*) node, (IXML_Node*) PropertyNode); } return 0; }