00001
00002
00003 #include "ACEXML/common/URL_Addr.h"
00004
00005 ACE_RCSID(common, ACEXML_URL_Addr, "$Id: URL_Addr.cpp 78637 2007-06-28 16:15:15Z mesnier_p $")
00006
00007 #if !defined (__ACEXML_INLINE__)
00008 #include "ACEXML/common/URL_Addr.inl"
00009 #endif
00010
00011 #include "ace/Log_Msg.h"
00012 #include "ace/Auto_Ptr.h"
00013 #include "ace/OS_Memory.h"
00014 #include "ace/OS_NS_stdio.h"
00015 #include "ace/OS_NS_stdlib.h"
00016 #include "ace/OS_NS_string.h"
00017
00018 ACEXML_URL_Addr::ACEXML_URL_Addr (void)
00019 : path_name_ (0),
00020 addr_string_ (0),
00021 addr_string_len_ (0)
00022 {
00023 }
00024
00025 int
00026 ACEXML_URL_Addr::addr_to_string (ACEXML_Char *s,
00027 size_t size,
00028 int ipaddr_format) const
00029 {
00030 size_t total_len = this->calculate_length (ipaddr_format);
00031 if (size < total_len)
00032 return -1;
00033 else
00034 {
00035 ACE_OS::sprintf (s, ACE_TEXT ("%s:%d/%s"),
00036 ACE_TEXT_CHAR_TO_TCHAR (ipaddr_format == 0
00037 ? this->get_host_name ()
00038 : this->get_host_addr ()),
00039 this->get_port_number (),
00040 this->get_path_name ());
00041 return 0;
00042 }
00043 }
00044
00045 const ACEXML_Char *
00046 ACEXML_URL_Addr::addr_to_string (int ipaddr_format)
00047 {
00048 size_t size = this->calculate_length (ipaddr_format);
00049 if (size > this->addr_string_len_)
00050 {
00051 ACE_ALLOCATOR_RETURN (this->addr_string_,
00052 (ACEXML_Char *) ACE_OS::realloc(this->addr_string_,
00053 size), 0);
00054 this->addr_string_len_ = size;
00055 }
00056 ACE_OS::sprintf (this->addr_string_,
00057 ACE_TEXT ("%s:%d/%s"),
00058 ACE_TEXT_CHAR_TO_TCHAR (ipaddr_format == 0
00059 ? this->get_host_name ()
00060 : this->get_host_addr ()),
00061 this->get_port_number (),
00062 this->get_path_name ());
00063 return this->addr_string_;
00064 }
00065
00066 #if defined (ACE_USES_WCHAR)
00067 int
00068 ACEXML_URL_Addr::string_to_addr (const char* s,
00069 int address_family)
00070 {
00071 return this->string_to_addr (ACE_TEXT_CHAR_TO_TCHAR (s), address_family);
00072 }
00073 #endif
00074
00075 int
00076 ACEXML_URL_Addr::string_to_addr (const ACEXML_Char* s,
00077 int )
00078 {
00079 if (s == 0)
00080 return -1;
00081
00082 const ACEXML_Char* http = ACE_TEXT ("http://");
00083 size_t http_len = ACE_OS::strlen (http);
00084
00085
00086 if (ACE_OS::strncmp (http, s, http_len) != 0)
00087 ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Invalid URL %s\n"), s), -1);
00088
00089 const ACEXML_Char* url = 0;
00090
00091 for (url = s + http_len; *url != '\0' && *url != ':' && *url != '/'; ++url)
00092 ;
00093
00094 size_t host_len = url - s;
00095 host_len -= http_len;
00096
00097 ACEXML_Char* host_name = 0;
00098 ACE_NEW_RETURN (host_name, ACEXML_Char[host_len + 1], -1);
00099 ACE_OS::strncpy (host_name, s + http_len, host_len);
00100 host_name[host_len] = '\0';
00101 ACE_Auto_Basic_Array_Ptr<ACEXML_Char> cleanup_host_name (host_name);
00102
00103
00104 unsigned short port = ACE_DEFAULT_HTTP_PORT;
00105 if (*url == ':')
00106 {
00107 port = (unsigned short) ACE_OS::strtol (++url, 0, 10);
00108 while ( *url != '\0' && *url != '/' )
00109 ++url;
00110 }
00111
00112
00113 int result = this->ACE_INET_Addr::set (port, host_name);
00114
00115 if (result == -1)
00116 return -1;
00117
00118
00119 const ACEXML_Char* path_name = 0;
00120 if (*url == '\0')
00121 path_name = ACE_TEXT ("/");
00122 else
00123 path_name = url;
00124
00125 ACE_ALLOCATOR_RETURN (this->path_name_, ACE_OS::strdup (path_name), -1);
00126 return result;
00127 }
00128
00129 ACEXML_URL_Addr::ACEXML_URL_Addr (const ACEXML_URL_Addr &addr)
00130 : ACE_INET_Addr (),
00131 path_name_ (0),
00132 addr_string_ (0),
00133 addr_string_len_ (0)
00134 {
00135 if (this->set (addr) == -1)
00136 ACE_ERROR ((LM_ERROR,
00137 ACE_TEXT ("%p\n"),
00138 ACE_TEXT ("ACEXML_URL_Addr::ACEXML_URL_Addr")));
00139 }
00140
00141 int
00142 ACEXML_URL_Addr::set (const ACEXML_URL_Addr &addr)
00143 {
00144 ACE_OS::free (this->path_name_);
00145 ACE_OS::free (this->addr_string_);
00146 if (this->ACE_INET_Addr::set (addr) == -1)
00147 return -1;
00148 else
00149 {
00150 if (addr.path_name_)
00151 ACE_ALLOCATOR_RETURN (this->path_name_,
00152 ACE_OS::strdup (addr.path_name_),
00153 -1);
00154 if (addr.addr_string_)
00155 ACE_ALLOCATOR_RETURN (this->addr_string_,
00156 ACE_OS::strdup (addr.addr_string_),
00157 -1);
00158 this->addr_string_len_ = addr.addr_string_len_;
00159 return 0;
00160 }
00161 }
00162
00163 ACEXML_URL_Addr::ACEXML_URL_Addr (const ACEXML_Char *host_name,
00164 const ACEXML_Char *path_name,
00165 unsigned short port)
00166 : ACE_INET_Addr (port, host_name),
00167 path_name_ (ACE_OS::strdup (path_name)),
00168 addr_string_ (0),
00169 addr_string_len_ (0)
00170 {
00171 }
00172
00173 ACEXML_URL_Addr::~ACEXML_URL_Addr (void)
00174 {
00175 ACE_OS::free (this->path_name_);
00176 ACE_OS::free (this->addr_string_);
00177 this->path_name_ = 0;
00178 }