summaryrefslogtreecommitdiff
path: root/ACE/ACEXML/common/URL_Addr.h
blob: 871d1c1bee8c02f0bb40ddff4b72ae498a5343a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* -*- C++ -*- */

/** @file   URL_Addr.h
 *
 *  @author Douglas C. Schmidt <schmidt@cs.wustl.edu>
 *  @author Krishnakumar B <kitty@cs.wustl.edu>
 */

#ifndef _ACEXML_URL_ADDR_H
#define _ACEXML_URL_ADDR_H

#include /**/ "ace/pre.h"
#include "ACEXML/common/ACEXML_Export.h"

#if !defined (ACE_LACKS_PRAGMA_ONCE)
#pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */

#include "ace/Default_Constants.h"
#include "ace/INET_Addr.h"
#include "ACEXML/common/XML_Types.h"
#include "ACEXML/common/ACEXML_Export.h"

/**
 *  @class ACEXML_URL_Addr
 *
 *  Defines a URL address family address format.
 */
class ACEXML_Export ACEXML_URL_Addr : public ACE_INET_Addr
{
public:
  /// Initialization and termination methods.
  ACEXML_URL_Addr (void);

  /// Constructor.
  ACEXML_URL_Addr (const ACEXML_Char *host_name,
                   const ACEXML_Char *path_name,
                   unsigned short port = ACE_DEFAULT_HTTP_PORT);

  /// Copy constructor.
  ACEXML_URL_Addr (const ACEXML_URL_Addr &addr);

  /// Essentially the copy constructor.
  int set (const ACEXML_URL_Addr &addr);

  /**
   *  Initializes an <ACEXML_URL_Addr> from the <address>, which can be
   *  "ip-number:port-number/path-name" (e.g.,
   *  "www.cs.wustl.edu:1234/~schmidt/" "ip-number:port-number/path-name"
   *  (e.g., "128.252.166.57:1234/~schmidt"). If there is no ':' in the
   *  <address> it is assumed to be an ip-number or ip-address number, with
   *  the port number <ACE_DEFAULT_HTTP_PORT>.
   */
  virtual int string_to_addr (const ACEXML_Char* address,
                              int address_family = AF_UNSPEC);

  //  Function to shut up Borland C++
#if defined (ACE_USES_WCHAR)
  virtual int string_to_addr (const char* addresss,
                              int address_family = AF_UNSPEC);
#endif

  /**
   *  Transform the current <ACE_INET_Addr> address into string format. If
   *  <ipaddr_format> is non-0 this produces
   *  "ip-number:port-number/path-name" (e.g.,
   *  "128.252.166.57:80/~schmidt/"), whereas if <ipaddr_format> is 0 this
   *  produces "ip-name:port-number" (e.g.,
   *  "www.cs.wustl.edu:80/~schmidt/"). Returns -1 if the <size> of the
   *  <buffer> is too small, else 0.
   */
  virtual int addr_to_string (ACEXML_Char *s,
                              size_t size,
                              int ipaddr_format = 1) const;

  /**
   *  Transform the current <ACE_INET_Addr> address into string format. If
   *  <ipaddr_format> is non-0 this produces
   *  "ip-number:port-number/path-name" (e.g.,
   *  "128.252.166.57:80/~schmidt/"), whereas if <ipaddr_format> is 0 this
   *  produces "ip-name:port-number" (e.g.,
   *  "www.cs.wustl.edu:80/~schmidt/"). Uses dynamic memory, which is
   *  allocated on demand and deallocated when the object is destroyed.
   *  Returns -1 if dynamic memory fails, else 0.
   */
  virtual const ACEXML_Char *addr_to_string (int ipaddr_format = 1);

  /// Assignment operator.
  void operator= (const ACEXML_URL_Addr &addr);

  /// Destructor.
  ~ACEXML_URL_Addr (void);

  /**
   *  Compare two addresses for equality.  The addresses are considered
   *  equal if they contain the same IP address, port number, and path name.
   */
  bool operator == (const ACEXML_URL_Addr &SAP) const;

  /// Compare two addresses for inequality.
  bool operator != (const ACEXML_URL_Addr &SAP) const;

  /// Computes and returns hash value.
  virtual u_long hash (void) const;

  /// Return the path name.
  const ACEXML_Char *get_path_name (void) const;

  /// Commit suicide.
  int destroy (void);

private:

  /// Calculate the maximum length of the address string
  size_t calculate_length (int ipaddr_format) const;

  /// Our path name.
  ACEXML_Char *path_name_;

  /// The dynamically created address string that's used for the
  /// <addr_to_string> method.
  ACEXML_Char *addr_string_;

  /// Current length of the <addr_string_>
  size_t addr_string_len_;
};

#if defined (__ACEXML_INLINE__)
# include "ACEXML/common/URL_Addr.inl"
#endif /* __ACEXML_INLINE__ */

#include /**/ "ace/post.h"

#endif /* _ACEXML_URL_ADDR_H */