diff options
Diffstat (limited to 'misc/util.cpp')
-rw-r--r-- | misc/util.cpp | 488 |
1 files changed, 488 insertions, 0 deletions
diff --git a/misc/util.cpp b/misc/util.cpp new file mode 100644 index 0000000..dc75706 --- /dev/null +++ b/misc/util.cpp @@ -0,0 +1,488 @@ +/* + * 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 <string.h> +#include <string> +#include <sys/ioctl.h> +#include <net/if.h> +#include <upnp/ixml.h> +#include <arpa/inet.h> +#include <iosfwd> + +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; +} |