URL_Addr.cpp

Go to the documentation of this file.
00001 // URL_Addr.cpp,v 1.13 2006/04/20 09:55:37 jwillemsen Exp
00002 
00003 #include "ACEXML/common/URL_Addr.h"
00004 
00005 ACE_RCSID(common, ACEXML_URL_Addr, "URL_Addr.cpp,v 1.13 2006/04/20 09:55:37 jwillemsen Exp")
00006 
00007 #if !defined (__ACEXML_INLINE__)
00008 #include "ACEXML/common/URL_Addr.inl"
00009 #endif /* __ACEXML_INLINE__ */
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 {
00070   return this->string_to_addr (ACE_TEXT_CHAR_TO_TCHAR (s));
00071 }
00072 #endif /* ACE_USES_WCHAR */
00073 
00074 int
00075 ACEXML_URL_Addr::string_to_addr (const ACEXML_Char* s)
00076 {
00077   if (s == 0)
00078     return -1;
00079 
00080   const ACEXML_Char* http = ACE_TEXT ("http://");
00081   size_t http_len = ACE_OS::strlen (http);
00082 
00083   // Check validity of URL
00084   if (ACE_OS::strncmp (http, s, http_len) != 0)
00085     ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Invalid URL %s\n"), s), -1);
00086 
00087   const ACEXML_Char* url = 0;
00088   // Get the host name
00089   for (url = s + http_len; *url != '\0' && *url != ':' && *url != '/'; ++url)
00090     ;
00091 
00092   size_t host_len = url - s;
00093   host_len -= http_len;
00094 
00095   ACEXML_Char* host_name = 0;
00096   ACE_NEW_RETURN (host_name, ACEXML_Char[host_len + 1], -1);
00097   ACE_OS::strncpy (host_name, s + http_len, host_len);
00098   host_name[host_len] = '\0';
00099   ACE_Auto_Basic_Array_Ptr<ACEXML_Char> cleanup_host_name (host_name);
00100 
00101   // Get the port number (if any)
00102   unsigned short port = ACE_DEFAULT_HTTP_PORT;
00103   if (*url == ':')
00104     {
00105       port = (unsigned short) ACE_OS::strtol (++url, 0, 10); // Skip over ':'
00106       while ( *url != '\0' && *url != '/' )
00107         ++url;
00108     }
00109 
00110   // Set the addr
00111   int result = this->ACE_INET_Addr::set (port, host_name);
00112 
00113   if (result == -1)
00114     return -1;
00115 
00116   // Get the path name
00117   const ACEXML_Char* path_name = 0;
00118   if (*url == '\0')
00119     path_name = ACE_TEXT ("/");
00120   else
00121     path_name = url;
00122 
00123   ACE_ALLOCATOR_RETURN (this->path_name_, ACE_OS::strdup (path_name), -1);
00124   return result;
00125 }
00126 
00127 ACEXML_URL_Addr::ACEXML_URL_Addr (const ACEXML_URL_Addr &addr)
00128   : ACE_INET_Addr (),
00129     path_name_ (0),
00130     addr_string_ (0),
00131     addr_string_len_ (0)
00132 {
00133   if (this->set (addr) == -1)
00134     ACE_ERROR ((LM_ERROR,
00135                 ACE_TEXT ("%p\n"),
00136                 ACE_TEXT ("ACEXML_URL_Addr::ACEXML_URL_Addr")));
00137 }
00138 
00139 int
00140 ACEXML_URL_Addr::set (const ACEXML_URL_Addr &addr)
00141 {
00142   ACE_OS::free (this->path_name_);
00143   ACE_OS::free (this->addr_string_);
00144   if (this->ACE_INET_Addr::set (addr) == -1)
00145     return -1;
00146   else
00147     {
00148       if (addr.path_name_)
00149         ACE_ALLOCATOR_RETURN (this->path_name_,
00150                               ACE_OS::strdup (addr.path_name_),
00151                               -1);
00152       if (addr.addr_string_)
00153         ACE_ALLOCATOR_RETURN (this->addr_string_,
00154                               ACE_OS::strdup (addr.addr_string_),
00155                               -1);
00156       this->addr_string_len_ = addr.addr_string_len_;
00157       return 0;
00158     }
00159 }
00160 
00161 ACEXML_URL_Addr::ACEXML_URL_Addr (const ACEXML_Char *host_name,
00162                             const ACEXML_Char *path_name,
00163                             unsigned short port)
00164   : ACE_INET_Addr (port, host_name),
00165     path_name_ (ACE_OS::strdup (path_name)),
00166     addr_string_ (0),
00167     addr_string_len_ (0)
00168 {
00169 }
00170 
00171 ACEXML_URL_Addr::~ACEXML_URL_Addr (void)
00172 {
00173   ACE_OS::free (this->path_name_);
00174   ACE_OS::free (this->addr_string_);
00175   this->path_name_ = 0;
00176 }
00177 

Generated on Thu Nov 9 11:45:40 2006 for ACEXML by doxygen 1.3.6