Remove dynamic exceptions
[anna.git] / include / anna / ldap / Response.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_ldap_Response_hpp
10 #define anna_ldap_Response_hpp
11
12 #include <anna/core/util/Recycler.hpp>
13 #include <anna/core/Allocator.hpp>
14
15 #include <anna/ldap/defines.hpp>
16 #include <anna/ldap/ClassCode.hpp>
17 #include <anna/ldap/ResultCode.hpp>
18
19 namespace anna {
20
21 namespace ldap {
22
23 class Session;
24 class Attribute;
25 class Timer;
26 class Request;
27
28 /**
29    Modela las respuesta que podemos recibir de un servidor LDAP.
30
31    La respuesta correspondiente a una peticion se genera automaticamente al invocar a ldap::Session::send.
32    El nucleo de ANNA.ldap notifica el resultado de la operacion solicitada mediante la invocacion
33    al metodo-menejador ldap::Session::eventResponse de nuestra sesion.
34 */
35 class Response {
36 public:
37   typedef Recycler<Attribute> attribute_container;
38   typedef attribute_container::iterator attribute_iterator;
39   typedef attribute_container::const_iterator const_attribute_iterator;
40
41   typedef Recycler<std::string> referral_container;
42   typedef referral_container::const_iterator const_referral_iterator;
43
44   /**
45      Devuelve el tipo de la clase de esta respuesta.
46      \return El tipo de la clase de esta respuesta.
47   */
48   ClassCode::_v getClassCode() const { return a_classCode; }
49
50   /**
51      Devuelve la identificacion del mensaje LDAP.
52      Esta identificacion sera generada automaticamente al enviar la peticion.
53      \return Identificacion del mensaje asociado a esta peticion/respuesta.
54      \see ldap::Session::send
55   */
56   IdMessage getIdMessage() const { return a_idMessage; }
57
58   /**
59      Devuelve la sesion que genera esta respuesta.
60      \return La instancia de la sesion que genera esta respuesta.
61   */
62   const Session* getSession() const { return a_session; }
63
64   /**
65      Devuelve el resultado de la peticion LDAP solicitada.
66      \return El resultado de la peticion LDAP solicitada.
67   */
68   const ResultCode& getResultCode() const { return a_resultCode; }
69
70   /**
71      Devuelve el nombre del DN asociado a esta peticion.
72      \return El nombre del DN asociado a esta peticion.
73   */
74   const std::string& getName() const { return a_name; }
75
76   /**
77      Devuelve la peticion que origino la creacion de esta respuesta.
78      \return La peticion que origino la creacion de esta respuesta.
79      \see ldap::Session::send
80   */
81   const Request* getRequest()const  { return a_request; }
82
83   /**
84      Devuelve la sesion que origino la creacion de esta respuesta.
85      \return La sesion que origino la creacion de esta respuesta.
86   */
87   Session* getSession() { return a_session; }
88
89   /**
90    * Devuelve el nº de atributos que contiene la respuesta.
91    * \return el nº de atributos que contiene la respuesta.
92    */
93   int attribute_size() const { return a_attributes.size(); }
94
95   /**
96      Devuelve el iterador al comienzo de la lista de atributos asociados a esta respuesta.
97      \return El iterador al comienzo de la lista de atributos asociados a esta respuesta.
98   */
99   const_attribute_iterator attribute_begin() const { return a_attributes.begin(); }
100
101   /**
102      Devuelve el iterador al final de la lista de atributos asociados a esta respuesta.
103      \return El iterador al final de la lista de atributos asociados a esta respuesta.
104   */
105   const_attribute_iterator attribute_end() const { return a_attributes.end(); }
106
107   /**
108    * Devuelve el nº de referencias que contiene la respuesta.
109    * \return el nº de referencias que contiene la respuesta.
110    */
111   int referral_size() const { return a_referrals.size(); }
112
113   /**
114      Devuelve el iterador al comienzo de la lista de referencias asociados a esta respuesta.
115      \return El iterador al comienzo de la lista de referencias asociados a esta respuesta.
116   */
117   const_referral_iterator referral_begin() const { return a_referrals.begin(); }
118
119   /**
120      Devuelve el iterador al final de la lista de referencias asociados a esta respuesta.
121      \return El iterador al final de la lista de referencias asociados a esta respuesta.
122   */
123   const_referral_iterator referral_end() const { return a_referrals.end(); }
124
125   /**
126      Devuelve el atributo asociado al iterador recibido como parametro.
127      \param ii Instancia del iterador usado para recorrer los datos. Estara comprendido
128      entre [#attribute_begin, #attribute_end).
129      \return El atributo referenciado por el iterador.
130   */
131   static const Attribute* attribute(const_attribute_iterator ii) { return attribute_container::data(ii); }
132
133   /**
134      Devuelve la referencia asociada al iterador recibido como parametro.
135      \param ii Instancia del iterador usado para recorrer los datos. Estara comprendido
136      entre [#referral_begin, #referral_end).
137      \return La referencia apuntada por el iterador.
138   */
139   static const std::string& referral(const_referral_iterator ii) { return *referral_container::data(ii); }
140
141   /**
142      Devuelve una cadena con la informacion relevante sobre esta instancia.
143      \return Una cadena con la informacion relevante sobre esta instancia.
144   */
145   std::string asString() const ;
146
147 private:
148   ClassCode::_v a_classCode;
149   IdMessage a_idMessage;
150   Session* a_session;
151   ResultCode a_resultCode;
152   std::string a_name;
153   attribute_container a_attributes;
154   referral_container a_referrals;
155   Timer* a_timer;
156   const Request* a_request;
157
158   typedef Recycler<Response> response_pool;
159   static response_pool st_responses;
160
161   Response();
162
163   static Response* instance(const ClassCode::_v, const IdMessage) noexcept(false);
164   static void release(Response* response) ;
165
166   void clear() ;
167
168   void setName(const std::string& name) { a_name = name; }
169   void setSession(Session* session) { a_session = session; }
170   void setRequest(const Request* request) { a_request = request; }
171   void activateTimer() noexcept(false);
172   void cancelTimer() ;
173   void setResultCode(const ResultCode& resultCode) { a_resultCode = resultCode; }
174
175   Attribute* createAttribute(const std::string& name) noexcept(false);
176
177   void createReferral(const char* value) noexcept(false) {
178     std::string* newReferral = a_referrals.create();
179     *newReferral = value;
180   }
181
182
183   attribute_iterator attribute_begin() { return a_attributes.begin(); }
184   attribute_iterator attribute_end() { return a_attributes.end(); }
185   static Attribute* attribute(attribute_iterator ii) { return attribute_container::data(ii); }
186
187   friend class Session;
188   friend class Allocator<Response>;
189 };
190
191 }
192 }
193
194 #endif
195