Mercurial > projects > hoofbaby
diff deps/Platinum/Source/Core/PltUPnPHelper.h @ 0:3425707ddbf6
Initial import (hopefully this mercurial stuff works...)
author | fraserofthenight |
---|---|
date | Mon, 06 Jul 2009 08:06:28 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/deps/Platinum/Source/Core/PltUPnPHelper.h Mon Jul 06 08:06:28 2009 -0700 @@ -0,0 +1,306 @@ +/***************************************************************** +| +| Platinum - UPnP Helper +| +| Copyright (c) 2004-2008, Plutinosoft, LLC. +| All rights reserved. +| http://www.plutinosoft.com +| +| This program is free software; you can redistribute it and/or +| modify it under the terms of the GNU General Public License +| as published by the Free Software Foundation; either version 2 +| of the License, or (at your option) any later version. +| +| OEMs, ISVs, VARs and other distributors that combine and +| distribute commercially licensed software with Platinum software +| and do not wish to distribute the source code for the commercially +| licensed software under version 2, or (at your option) any later +| version, of the GNU General Public License (the "GPL") must enter +| into a commercial license agreement with Plutinosoft, LLC. +| +| This program is distributed in the hope that it will be useful, +| but WITHOUT ANY WARRANTY; without even the implied warranty of +| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +| GNU General Public License for more details. +| +| You should have received a copy of the GNU General Public License +| along with this program; see the file LICENSE.txt. If not, write to +| the Free Software Foundation, Inc., +| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +| http://www.gnu.org/licenses/gpl-2.0.html +| +****************************************************************/ + +#ifndef _PLT_UPNP_HELPER_H_ +#define _PLT_UPNP_HELPER_H_ + +/*---------------------------------------------------------------------- +| includes ++---------------------------------------------------------------------*/ +#include "Neptune.h" + +/*---------------------------------------------------------------------- +| NPT_StringFinder ++---------------------------------------------------------------------*/ +class NPT_StringFinder +{ +public: + // methods + NPT_StringFinder(const char* value) : m_Value(value) {} + virtual ~NPT_StringFinder() {} + bool operator()(const NPT_String* const & value) const { + return value->Compare(m_Value) ? false : true; + } + bool operator()(const NPT_String& value) const { + return value.Compare(m_Value) ? false : true; + } + +private: + // members + NPT_String m_Value; +}; + +/*---------------------------------------------------------------------- +| PLT_UPnPMessageHelper class ++---------------------------------------------------------------------*/ +class PLT_UPnPMessageHelper +{ +public: + // methods + static const NPT_String* GetST(NPT_HttpMessage& message) { + return message.GetHeaders().GetHeaderValue("ST"); + } + static NPT_Result SetST(NPT_HttpMessage& message, + const char* st) { + return message.GetHeaders().SetHeader("ST", st); + } + static const NPT_String* GetNT(NPT_HttpMessage& message) { + return message.GetHeaders().GetHeaderValue("NT"); + } + static NPT_Result SetNT(NPT_HttpMessage& message, + const char* nt) { + return message.GetHeaders().SetHeader("NT", nt); + } + static const NPT_String* GetNTS(NPT_HttpMessage& message) { + return message.GetHeaders().GetHeaderValue("NTS"); + } + static NPT_Result SetNTS(NPT_HttpMessage& message, + const char* nts) { + return message.GetHeaders().SetHeader("NTS", nts); + } + static const NPT_String* GetMAN(NPT_HttpMessage& message) { + return message.GetHeaders().GetHeaderValue("MAN"); + } + static NPT_Result SetMAN(NPT_HttpMessage& message, + const char* man) { + return message.GetHeaders().SetHeader("MAN", man); + } + static const NPT_String* GetLocation(NPT_HttpMessage& message) { + return message.GetHeaders().GetHeaderValue("LOCATION"); + } + static NPT_Result SetLocation(NPT_HttpMessage& message, + const char* location) { + return message.GetHeaders().SetHeader("LOCATION", location); + } + static const NPT_String* GetServer(NPT_HttpMessage& message) { + return message.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_SERVER); + } + static NPT_Result SetServer(NPT_HttpMessage& message, + const char* server, + bool replace = true) { + return message.GetHeaders().SetHeader( + NPT_HTTP_HEADER_SERVER, + server, + replace); + } + static const NPT_String* GetUSN(NPT_HttpMessage& message) { + return message.GetHeaders().GetHeaderValue("USN"); + } + static NPT_Result SetUSN(NPT_HttpMessage& message, + const char* usn) { + return message.GetHeaders().SetHeader("USN", usn); + } + static const NPT_String* GetCallbacks(NPT_HttpMessage& message) { + return message.GetHeaders().GetHeaderValue("CALLBACK"); + } + static NPT_Result SetCallbacks(NPT_HttpMessage& message, + const char* callbacks) { + return message.GetHeaders().SetHeader("CALLBACK", callbacks); + } + static const NPT_String* GetSID(NPT_HttpMessage& message) { + return message.GetHeaders().GetHeaderValue("SID"); + } + static NPT_Result SetSID(NPT_HttpMessage& message, + const char* sid) { + return message.GetHeaders().SetHeader("SID", sid); + } + static NPT_Result GetLeaseTime(NPT_HttpMessage& message, + NPT_Timeout& value) { + value = 0; + const NPT_String* cc = + message.GetHeaders().GetHeaderValue("CACHE-CONTROL"); + NPT_CHECK_POINTER(cc); + return ExtractLeaseTime(*cc, value); + } + static NPT_Result SetLeaseTime(NPT_HttpMessage& message, + const NPT_Timeout lease) { + return message.GetHeaders().SetHeader( + "CACHE-CONTROL", + "max-age="+NPT_String::FromInteger(lease)); + } + static NPT_Result GetTimeOut(NPT_HttpMessage& message, + NPT_Int32& value) { + value = 0; + const NPT_String* timeout = + message.GetHeaders().GetHeaderValue("TIMEOUT"); + NPT_CHECK_POINTER(timeout); + return ExtractTimeOut(*timeout, value); + } + static NPT_Result SetTimeOut(NPT_HttpMessage& message, + const NPT_Int32 timeout) { + if (timeout >= 0) { + return message.GetHeaders().SetHeader( + "TIMEOUT", + "Second-"+NPT_String::FromInteger(timeout)); + } else { + return message.GetHeaders().SetHeader( + "TIMEOUT", "Second-infinite"); + } + } + static NPT_Result GetMX(NPT_HttpMessage& message, + NPT_UInt32& value) { + value = 0; + const NPT_String* mx = + message.GetHeaders().GetHeaderValue("MX"); + NPT_CHECK_POINTER(mx); + return NPT_ParseInteger32U(*mx, value); + } + static NPT_Result SetMX(NPT_HttpMessage& message, + const NPT_UInt32 mx) { + return message.GetHeaders().SetHeader( + "MX", + NPT_String::FromInteger(mx)); + } + static NPT_Result GetSeq(NPT_HttpMessage& message, + NPT_UInt32& value) { + value = 0; + const NPT_String* seq = + message.GetHeaders().GetHeaderValue("SEQ"); + NPT_CHECK_POINTER(seq); + return NPT_ParseInteger32U(*seq, value); + } + static NPT_Result SetSeq(NPT_HttpMessage& message, + const NPT_UInt32 seq) { + return message.GetHeaders().SetHeader( + "SEQ", + NPT_String::FromInteger(seq)); + } + static const char* GenerateUUID(int count, + NPT_String& uuid) { + uuid = ""; + for (int i=0;i<(count<100?count:100);i++) { + int random = NPT_System::GetRandomInteger(); + uuid += (char)((random % 25) + 66); + } + return uuid; + } + static const char* GenerateGUID(NPT_String& guid) { + guid = ""; + for (int i=0;i<32;i++) { + char nibble = (char)(NPT_System::GetRandomInteger() % 16); + guid += (nibble < 10) ? ('0' + nibble) : ('a' + (nibble-10)); + if (i == 7 || i == 11 || i == 15 || i == 19) { + guid += '-'; + } + } + return guid; + } + static NPT_Result ExtractLeaseTime(const char* cache_control, + NPT_Timeout& lease) { + int value; + if (cache_control && + sscanf(cache_control, "max-age=%d", &value) == 1) { + lease = value; + return NPT_SUCCESS; + } + return NPT_FAILURE; + } + static NPT_Result ExtractTimeOut(const char* timeout, + NPT_Int32& len) { + NPT_String temp = timeout; + if (temp.CompareN("Second-", 7, true)) { + return NPT_ERROR_INVALID_FORMAT; + } + + if (temp.Compare("Second-infinite", true) == 0) { + len = NPT_TIMEOUT_INFINITE; + return NPT_SUCCESS; + } + return temp.SubString(7).ToInteger(len); + } + static NPT_Result GetIPAddresses(NPT_List<NPT_String>& ips) { + NPT_List<NPT_NetworkInterface*> if_list; + NPT_CHECK(NPT_NetworkInterface::GetNetworkInterfaces(if_list)); + + NPT_List<NPT_NetworkInterface*>::Iterator iface = + if_list.GetFirstItem(); + while (iface) { + NPT_String ip = + (*(*iface)->GetAddresses().GetFirstItem()).GetPrimaryAddress().ToString(); + if (ip.Compare("0.0.0.0") && ip.Compare("127.0.0.1")) { + ips.Add(ip); + } + ++iface; + } + + if (ips.GetItemCount() == 0) { + ips.Add("127.0.0.1"); + } + + if_list.Apply(NPT_ObjectDeleter<NPT_NetworkInterface>()); + return NPT_SUCCESS; + } + + static NPT_Result GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& if_list, + bool with_localhost = false) { + NPT_CHECK(_GetNetworkInterfaces(if_list, false)); + + // if no valid interfaces or if requested, add localhost capable interface + if (if_list.GetItemCount() == 0 || with_localhost) { + NPT_CHECK(_GetNetworkInterfaces(if_list, true)); + } + return NPT_SUCCESS; + } + +private: + + static NPT_Result _GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& if_list, + bool only_localhost = false) { + NPT_List<NPT_NetworkInterface*> _if_list; + NPT_CHECK(NPT_NetworkInterface::GetNetworkInterfaces(_if_list)); + + NPT_NetworkInterface* iface; + while (NPT_SUCCEEDED(_if_list.PopHead(iface))) { + NPT_String ip = + iface->GetAddresses().GetFirstItem()->GetPrimaryAddress().ToString(); + if (ip.Compare("0.0.0.0") && + ((!only_localhost && ip.Compare("127.0.0.1")) || + (only_localhost && !ip.Compare("127.0.0.1")))) { + if_list.Add(iface); + + // add localhost only once + if (only_localhost) break; + } else { + delete iface; + } + } + + // cleanup any remaining items in list if we breaked early + _if_list.Apply(NPT_ObjectDeleter<NPT_NetworkInterface>()); + return NPT_SUCCESS; + } + + NPT_String HttpServerHeader; +}; + +#endif /* _PLT_UPNP_HELPER_H_ */