URL_Addr.cpp

Go to the documentation of this file.
00001 // $Id: URL_Addr.cpp 78637 2007-06-28 16:15:15Z mesnier_p $
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 /* __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                                  int address_family)
00070 {
00071   return this->string_to_addr (ACE_TEXT_CHAR_TO_TCHAR (s), address_family);
00072 }
00073 #endif /* ACE_USES_WCHAR */
00074 
00075 int
00076 ACEXML_URL_Addr::string_to_addr (const ACEXML_Char* s,
00077                                  int /*address_family */)
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   // Check validity of URL
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   // Get the host name
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   // Get the port number (if any)
00104   unsigned short port = ACE_DEFAULT_HTTP_PORT;
00105   if (*url == ':')
00106     {
00107       port = (unsigned short) ACE_OS::strtol (++url, 0, 10); // Skip over ':'
00108       while ( *url != '\0' && *url != '/' )
00109         ++url;
00110     }
00111 
00112   // Set the addr
00113   int result = this->ACE_INET_Addr::set (port, host_name);
00114 
00115   if (result == -1)
00116     return -1;
00117 
00118   // Get the path name
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 }

Generated on Sun Jan 27 13:04:15 2008 for ACEXML by doxygen 1.3.6