summaryrefslogtreecommitdiff
path: root/TAO/tao/target_specification.h
blob: 59b1268fee0da7641f60082f8e9850c8d50803f3 (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
//-*- C++ -*-
// $Id$

// ============================================================================
//
// = LIBRARY
//    TAO
//
// = FILENAME
//    target_identifier.h
//
// = DESCRIPTION
//    A class that encapsulates the target identification details.
//    
//    
// = AUTHOR
//     Balachandran  Natarajan <bala@cs.wustl.edu>
// ============================================================================

#ifndef TAO_TARGET_SPECIFICATION_H
#define TAO_TARGET_SPECIFICATION_H
#include "ace/pre.h"

#include "tao/Object_KeyC.h"
#include "tao/IOPC.h"


class TAO_Target_Specification
{
  // = TITLE
  //   A class to encapsulate all the ways of specifying targets.
  //
  // = DESCRIPTION
  //   @@ Bala: do we have examples of how other protocols map object
  //      keys?  
  //   @@ Carlos: The way HTTP-NG does is not quite intuitive. But
  //      they too have a sequnce of Octet which more or less fits this
  //      model. You are also allowed to specify is a Cache Index (14
  //      bits). I think that can also be worked out and shouldn't be
  //      a big deal.  
  //   @@ Bala:What if they pass something around that does not fit
  //      this model?
  //   @@ Carlos:As long as we dont know it is ok. But then if we get
  //      to some point where we have something floating around,
  //      obviously we would have well defined data structure in
  //      TAO. BTW, in IMHO it is not possible for me to think the
  //      myriad data structures that a designer can come up with. So,
  //      I can look ahead possibily a couple of days but not a life
  //      time  :-) But you have a good question though. Please sont
  //      remove these discussions. It could be useful for someone
  //      someday. 
  //   The motivation behind this is GIOP 1.2 althought I foresee
  //   other messaging protocols doing something similar.
  //   The Invocation classes (client side) were
  //   passing the object key that they had extracted from the
  //   profiles with every invocation. This extraction would be done
  //   based on the policies that are specified for the client side
  //   ORB. Further the client side  ORB need not just send the object
  //   key. They can send send the IOP::TaggedProfile or IOP::IOR
  //   profile. So I am putting these possibilites in this class and
  //   pass it to the messaging layer. It would extract what is
  //   required. 
public:
  
  TAO_Target_Specification (void);
  // Ctor
  enum TAO_Target_Address
  {
    // Note that this could be extended for other protocols
    Key_Addr = 0,
    Profile_Addr,
    Reference_Addr
  };

  // Note: Please do not pass in a identifiers that is allocated on
  // stack. These methods does not make a copy but holds the pointer
  // passed in. 
  void target_specifier (const TAO_ObjectKey &key);
  // Set the target specification by giving the object key.


  void target_specifier (IOP::TaggedProfile *profile);
  // Set the target specification by passing in an IOP::TaggedProfile.

  void target_specifier (IOP::IOR *ior, 
                         CORBA::ULong prof_index);
  // Specify the target by passing in the IOP::IOR with a profile
  // index. Please see the header file IOPC.h on why a profile index
  // is required.


  const TAO_ObjectKey* object_key (void);
  // Returns the object key after a check of the stored specifier. If
  // the stored specifier is not of the right type then this would
  // return a NULL
  
  const IOP::TaggedProfile *profile (void);
  // Returns the IOP::TaggedProfile after a check of the stored specifier. If
  // the stored specifier is not of the right type then this would
  // return a NULL
  
  CORBA::ULong iop_ior (IOP::IOR *&ior);
  // Returns a  pointer to IOP::IOR through the parameters and the
  // index of the selected profile as a return parameter after a check
  // of the stored specifier. If the stored specifier is not of the
  // right type then this would return a NULL. 
  
  TAO_Target_Address specifier (void);
  // Access the TArget_Address specifier
  
private:
  union
  {
    TAO_ObjectKey *object_key_;
    IOP::TaggedProfile *profile_;
    IOP::IOR *ior_;
  } u_;
  // The union of all the possibilities
  
  TAO_Target_Address specifier_;
  // The enum identifier

  CORBA::ULong profile_index_;
  // The profile index
};

#if defined (__ACE_INLINE__)
#include "target_specification.i"
#endif /* defined INLINE */

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