Used in Live Traffic Update Nokia LCD Display Project
Fork of NetServices by
Diff: services/http/util/url.cpp
- Revision:
- 0:ac1725ba162c
diff -r 000000000000 -r ac1725ba162c services/http/util/url.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/services/http/util/url.cpp Tue Nov 09 20:54:15 2010 +0000 @@ -0,0 +1,151 @@ + +/* +Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include "url.h" + +Url::Url() : m_port(0) +{ + +} + +string Url::getProtocol() +{ + return m_protocol; +} + +string Url::getHost() +{ + return m_host; +} + +bool Url::getHostIp(IpAddr* ip) +{ + unsigned int ipArr[4] = {0}; + if ( sscanf(m_host.c_str(), "%u.%u.%u.%u", &ipArr[0], &ipArr[1], &ipArr[2], &ipArr[3]) != 4 ) + { + return false; + } + *ip = IpAddr(ipArr[0], ipArr[1], ipArr[2], ipArr[3]); + return true; +} + +uint16_t Url::getPort() +{ + return m_port; +} + +string Url::getPath() +{ + return m_path; +} + +void Url::setProtocol(string protocol) +{ + m_protocol = protocol; +} + +void Url::setHost(string host) +{ + m_host = host; +} + +void Url::setPort(uint16_t port) +{ + m_port = port; +} + +void Url::setPath(string path) +{ + m_path = path; +} + +void Url::fromString(string str) +{ + //URI form [protocol://]host[:port]/path + int pos = 0; + int len = str.find("://"); + if( len > 0) + { + m_protocol = str.substr(0, len); + pos += len + 3; + } + else + { + m_protocol = ""; + } + + bool isPort = false; + int cln_pos = str.find(":", pos); + int slash_pos = str.find("/", pos); + if( slash_pos == -1 ) + { + slash_pos = str.length(); + } + if( (cln_pos != -1) && (cln_pos < slash_pos) ) + { + isPort = true; + len = cln_pos - pos; + } + else + { + len = slash_pos - pos; + } + + m_host = str.substr(pos, len); + + pos += len; + if( isPort ) + { + pos+=1; //Do not keep : + unsigned int port = 0; + sscanf(str.substr(pos, cln_pos-pos).c_str(),"%u", &port); + m_port = (uint16_t)port; + pos = slash_pos; + } + + m_path = str.substr(pos); +} + +string Url::toString() +{ + string url; + if( !m_protocol.empty() ) + { + url.append(m_protocol); + url.append("://"); + } + url.append(m_host); + if( m_port ) + { + char c_port[6] = {0}; + sprintf(c_port, "%d", m_port); + url.append(":"); + url.append(c_port); + } + if(m_path[0]!='/') + { + url.append("/"); + } + url.append(m_path); + return url; +}