OPAL  Version 3.18.8
h323neg.h
Go to the documentation of this file.
1 /*
2  * h323neg.h
3  *
4  * H.323 protocol handler
5  *
6  * Open H323 Library
7  *
8  * Copyright (c) 1998-2001 Equivalence Pty. Ltd.
9  *
10  * The contents of this file are subject to the Mozilla Public License
11  * Version 1.0 (the "License"); you may not use this file except in
12  * compliance with the License. You may obtain a copy of the License at
13  * http://www.mozilla.org/MPL/
14  *
15  * Software distributed under the License is distributed on an "AS IS"
16  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
17  * the License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * The Original Code is Open H323 Library.
21  *
22  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
23  *
24  * Portions of this code were written with the assisance of funding from
25  * Vovida Networks, Inc. http://www.vovida.com.
26  *
27  * Contributor(s): ______________________________________.
28  */
29 
30 #ifndef OPAL_H323_H323NEG_H
31 #define OPAL_H323_H323NEG_H
32 
33 #ifdef P_USE_PRAGMA
34 #pragma interface
35 #endif
36 
37 #include <opal_config.h>
38 
39 #if OPAL_H323
40 
41 #include <h323/h323pdu.h>
42 #include <h323/channels.h>
43 
44 
45 class H323EndPoint;
46 class H323Connection;
47 
48 
50 
53 class H245Negotiator : public PObject
54 {
55  PCLASSINFO(H245Negotiator, PObject);
56 
57  public:
59 
60  protected:
61  PDECLARE_NOTIFIER(PTimer, H245Negotiator, HandleTimeoutUnlocked);
62  virtual void HandleTimeout();
63 
66  PTimer replyTimer;
67 };
68 
69 
73 {
75 
76  public:
78 
79  PBoolean Start(PBoolean renegotiate);
80  void Stop();
81  PBoolean HandleIncoming(const H245_MasterSlaveDetermination & pdu);
82  PBoolean HandleAck(const H245_MasterSlaveDeterminationAck & pdu);
83  PBoolean HandleReject(const H245_MasterSlaveDeterminationReject & pdu);
84  PBoolean HandleRelease(const H245_MasterSlaveDeterminationRelease & pdu);
85  void HandleTimeout();
86 
87  PBoolean IsMaster() const { return m_status == e_DeterminedMaster; }
88  PBoolean IsDetermined() const { return m_status != e_Indeterminate; }
89 
90  protected:
91  PBoolean Restart();
92 
93  P_DECLARE_TRACED_ENUM(States, e_Idle, e_Outgoing, e_Incoming);
94  States m_state;
95 
97  unsigned m_retryCount;
98 
99  P_DECLARE_TRACED_ENUM(MasterSlaveStatus, e_Indeterminate, e_DeterminedMaster, e_DeterminedSlave);
100  MasterSlaveStatus m_status;
101 };
102 
103 
107 {
109 
110  public:
112 
113  PBoolean Start(PBoolean renegotiate, PBoolean empty = false);
114  void Stop(PBoolean dec = false);
115  PBoolean HandleIncoming(const H245_TerminalCapabilitySet & pdu);
116  PBoolean HandleAck(const H245_TerminalCapabilitySetAck & pdu);
117  PBoolean HandleReject(const H245_TerminalCapabilitySetReject & pdu);
118  PBoolean HandleRelease(const H245_TerminalCapabilitySetRelease & pdu);
119  void HandleTimeout();
120 
121  bool HasSentCapabilities() const { return state >= e_InProgress; }
122  bool IsSendingCapabilities() const { return state == e_InProgress; }
123  bool ConfrimedCapabilitiesSent() const { return state == e_Confirmed; }
125 
126  protected:
127  P_DECLARE_TRACED_ENUM(States, e_Idle, e_InProgress, e_Confirmed);
128  States state;
129 
132 
134 };
135 
136 
140 {
142 
143  public:
148  H323Connection & connection,
149  H323Channel & channel);
151 
152  virtual PBoolean Open(
153  const H323Capability & capability,
154  unsigned sessionID,
155  unsigned replacementFor = 0,
156  OpalMediaStreamPtr mediaStream = NULL
157  );
158  virtual PBoolean Close();
159  virtual PBoolean HandleOpen(const H245_OpenLogicalChannel & pdu);
160  virtual PBoolean HandleOpenAck(const H245_OpenLogicalChannelAck & pdu);
161  virtual PBoolean HandleOpenConfirm(const H245_OpenLogicalChannelConfirm & pdu);
162  virtual PBoolean HandleReject(const H245_OpenLogicalChannelReject & pdu);
163  virtual PBoolean HandleClose(const H245_CloseLogicalChannel & pdu);
164  virtual PBoolean HandleCloseAck(const H245_CloseLogicalChannelAck & pdu);
165  virtual PBoolean HandleRequestClose(const H245_RequestChannelClose & pdu);
166  virtual PBoolean HandleRequestCloseAck(const H245_RequestChannelCloseAck & pdu);
167  virtual PBoolean HandleRequestCloseReject(const H245_RequestChannelCloseReject & pdu);
168  virtual PBoolean HandleRequestCloseRelease(const H245_RequestChannelCloseRelease & pdu);
169  virtual void HandleTimeout();
170 
171  H323Channel * GetChannel() const;
172 
173  bool IsAwaitingEstablishment() const { return state == e_AwaitingEstablishment || state == e_Establishing; }
174  bool IsEstablished() const { return state == e_Established; }
175 
176  protected:
177  virtual void Release();
178 
179 
181 
183 
184  P_DECLARE_TRACED_ENUM(States,
185  e_Released,
186  e_AwaitingEstablishment,
187  e_Establishing,
188  e_Established,
189  e_AwaitingRelease,
190  e_AwaitingConfirmation,
191  e_AwaitingResponse,
192  e_NumStates
193  );
194  States state;
195 
197 };
198 
199 
200 PDICTIONARY(H245LogicalChannelDict, H323ChannelNumber, H245NegLogicalChannel);
201 
205 {
207 
208  public:
210 
211  virtual void Add(H323Channel & channel);
212 
213  virtual PBoolean Open(
214  const H323Capability & capability,
215  unsigned sessionID,
216  unsigned replacementFor = 0,
217  OpalMediaStreamPtr mediaStream = NULL
218  );
219  virtual PBoolean Close(unsigned channelNumber, PBoolean fromRemote);
220  virtual PBoolean HandleOpen(const H245_OpenLogicalChannel & pdu);
221  virtual PBoolean HandleOpenAck(const H245_OpenLogicalChannelAck & pdu);
222  virtual PBoolean HandleOpenConfirm(const H245_OpenLogicalChannelConfirm & pdu);
223  virtual PBoolean HandleReject(const H245_OpenLogicalChannelReject & pdu);
224  virtual PBoolean HandleClose(const H245_CloseLogicalChannel & pdu);
225  virtual PBoolean HandleCloseAck(const H245_CloseLogicalChannelAck & pdu);
226  virtual PBoolean HandleRequestClose(const H245_RequestChannelClose & pdu);
227  virtual PBoolean HandleRequestCloseAck(const H245_RequestChannelCloseAck & pdu);
228  virtual PBoolean HandleRequestCloseReject(const H245_RequestChannelCloseReject & pdu);
229  virtual PBoolean HandleRequestCloseRelease(const H245_RequestChannelCloseRelease & pdu);
230 
231  H323ChannelNumber GetNextChannelNumber(bool toRemote = false);
232  H245LogicalChannelDict & GetChannels() { return channels; }
233  const H245LogicalChannelDict & GetChannels() const { return channels; }
234  H323Channel * FindChannel(unsigned channelNumber, PBoolean fromRemote);
235  H245NegLogicalChannel * FindNegLogicalChannel(unsigned channelNumber, PBoolean fromRemote);
236  H323Channel * FindChannelBySession(unsigned rtpSessionId, bool fromRemote, bool anyState);
237  void RemoveAll();
238 
239  protected:
242  H245LogicalChannelDict channels;
243 };
244 
245 
249 {
250  PCLASSINFO(H245NegRequestMode, H245Negotiator);
251 
252  public:
254 
255  virtual PBoolean StartRequest(const PString & newModes);
256  virtual PBoolean StartRequest(const H245_ArrayOf_ModeDescription & newModes);
257  virtual PBoolean HandleRequest(const H245_RequestMode & pdu);
258  virtual PBoolean HandleAck(const H245_RequestModeAck & pdu);
259  virtual PBoolean HandleReject(const H245_RequestModeReject & pdu);
260  virtual PBoolean HandleRelease(const H245_RequestModeRelease & pdu);
261  virtual void HandleTimeout();
262 
263  protected:
267 };
268 
269 
273 {
275 
276  public:
278 
279  PBoolean StartRequest();
280  PBoolean HandleRequest(const H245_RoundTripDelayRequest & pdu);
281  PBoolean HandleResponse(const H245_RoundTripDelayResponse & pdu);
282  void HandleTimeout();
283 
284  PTimeInterval GetRoundTripDelay() const { return roundTripTime; }
285  PBoolean IsRemoteOffline() const { return retryCount == 0; }
286 
287  protected:
289  unsigned sequenceNumber;
290  PTimeInterval tripStartTime;
291  PTimeInterval roundTripTime;
292  unsigned retryCount;
293 };
294 
295 
296 #endif // OPAL_H323
297 
298 #endif // OPAL_H323_H323NEG_H
299 
300 
States state
Definition: h323neg.h:128
void Stop(PBoolean dec=false)
PBoolean HandleIncoming(const H245_TerminalCapabilitySet &pdu)
virtual PBoolean Open(const H323Capability &capability, unsigned sessionID, unsigned replacementFor=0, OpalMediaStreamPtr mediaStream=NULL)
Definition: h323neg.h:139
virtual PBoolean HandleRequest(const H245_RequestMode &pdu)
bool IsSendingCapabilities() const
Definition: h323neg.h:122
P_DECLARE_TRACED_ENUM(States, e_Idle, e_Outgoing, e_Incoming)
virtual PBoolean HandleReject(const H245_OpenLogicalChannelReject &pdu)
H323Connection & connection
Definition: h323neg.h:65
virtual PBoolean HandleRequestCloseRelease(const H245_RequestChannelCloseRelease &pdu)
P_DECLARE_TRACED_ENUM(States, e_Idle, e_InProgress, e_Confirmed)
PBoolean HandleRelease(const H245_MasterSlaveDeterminationRelease &pdu)
H245NegLogicalChannel * FindNegLogicalChannel(unsigned channelNumber, PBoolean fromRemote)
H323Channel * FindChannel(unsigned channelNumber, PBoolean fromRemote)
virtual PBoolean HandleRequestCloseReject(const H245_RequestChannelCloseReject &pdu)
PBoolean HandleReject(const H245_TerminalCapabilitySetReject &pdu)
virtual PBoolean HandleOpenConfirm(const H245_OpenLogicalChannelConfirm &pdu)
Definition: h323neg.h:204
H323ChannelNumber m_lastChannelNumberToRemote
Definition: h323neg.h:240
H323ChannelNumber channelNumber
Definition: h323neg.h:182
H245LogicalChannelDict channels
Definition: h323neg.h:242
virtual void HandleTimeout()
Definition: h323caps.h:95
virtual PBoolean HandleRequestCloseReject(const H245_RequestChannelCloseReject &pdu)
H245NegLogicalChannel(H323EndPoint &endpoint, H323Connection &connection, const H323ChannelNumber &channelNumber)
States m_state
Definition: h323neg.h:94
PSafePtr< OpalMediaStream > OpalMediaStreamPtr
Definition: mediastrm.h:493
virtual PBoolean HandleCloseAck(const H245_CloseLogicalChannelAck &pdu)
virtual void Add(H323Channel &channel)
Definition: h323neg.h:53
H245LogicalChannelDict & GetChannels()
Definition: h323neg.h:232
Definition: h323neg.h:272
PBoolean awaitingResponse
Definition: h323neg.h:264
H245NegLogicalChannels(H323EndPoint &endpoint, H323Connection &connection)
bool HasReceivedCapabilities() const
Definition: h323neg.h:124
virtual PBoolean HandleOpenConfirm(const H245_OpenLogicalChannelConfirm &pdu)
unsigned m_retryCount
Definition: h323neg.h:97
virtual PBoolean HandleRequestCloseAck(const H245_RequestChannelCloseAck &pdu)
unsigned retryCount
Definition: h323neg.h:292
bool IsAwaitingEstablishment() const
Definition: h323neg.h:173
bool ConfrimedCapabilitiesSent() const
Definition: h323neg.h:123
PTimeInterval tripStartTime
Definition: h323neg.h:290
virtual PBoolean Close(unsigned channelNumber, PBoolean fromRemote)
H323ChannelNumber m_lastChannelNumberFromRemote
Definition: h323neg.h:241
virtual PBoolean HandleRequestClose(const H245_RequestChannelClose &pdu)
H245NegMasterSlaveDetermination(H323EndPoint &endpoint, H323Connection &connection)
virtual PBoolean HandleClose(const H245_CloseLogicalChannel &pdu)
PBoolean HandleRelease(const H245_TerminalCapabilitySetRelease &pdu)
Definition: channels.h:95
DWORD m_determinationNumber
Definition: h323neg.h:96
virtual PBoolean HandleAck(const H245_RequestModeAck &pdu)
unsigned inSequenceNumber
Definition: h323neg.h:265
PBoolean HandleReject(const H245_MasterSlaveDeterminationReject &pdu)
bool HasSentCapabilities() const
Definition: h323neg.h:121
unsigned outSequenceNumber
Definition: h323neg.h:131
PBoolean awaitingResponse
Definition: h323neg.h:288
PBoolean Start(PBoolean renegotiate)
bool IsEstablished() const
Definition: h323neg.h:174
PBoolean HandleAck(const H245_TerminalCapabilitySetAck &pdu)
PTimeInterval GetRoundTripDelay() const
Definition: h323neg.h:284
const H245LogicalChannelDict & GetChannels() const
Definition: h323neg.h:233
PBoolean receivedCapabilites
Definition: h323neg.h:133
Definition: h323con.h:137
virtual PBoolean HandleOpen(const H245_OpenLogicalChannel &pdu)
H323Channel * FindChannelBySession(unsigned rtpSessionId, bool fromRemote, bool anyState)
unsigned inSequenceNumber
Definition: h323neg.h:130
MasterSlaveStatus m_status
Definition: h323neg.h:100
virtual PBoolean HandleClose(const H245_CloseLogicalChannel &pdu)
virtual void Release()
virtual PBoolean HandleOpenAck(const H245_OpenLogicalChannelAck &pdu)
P_DECLARE_TRACED_ENUM(States, e_Released, e_AwaitingEstablishment, e_Establishing, e_Established, e_AwaitingRelease, e_AwaitingConfirmation, e_AwaitingResponse, e_NumStates)
H323Channel * channel
Definition: h323neg.h:180
PBoolean IsMaster() const
Definition: h323neg.h:87
H323EndPoint & endpoint
Definition: h323neg.h:64
virtual PBoolean HandleRelease(const H245_RequestModeRelease &pdu)
PTimeInterval roundTripTime
Definition: h323neg.h:291
H245NegRequestMode(H323EndPoint &endpoint, H323Connection &connection)
States state
Definition: h323neg.h:194
PBoolean IsDetermined() const
Definition: h323neg.h:88
Definition: h323neg.h:106
virtual PBoolean HandleOpenAck(const H245_OpenLogicalChannelAck &pdu)
virtual PBoolean HandleCloseAck(const H245_CloseLogicalChannelAck &pdu)
virtual PBoolean StartRequest(const PString &newModes)
PDICTIONARY(H323CallIdentityDict, PString, H323Connection)
virtual PBoolean Close()
H323ChannelNumber GetNextChannelNumber(bool toRemote=false)
virtual PBoolean HandleOpen(const H245_OpenLogicalChannel &pdu)
Definition: channels.h:66
PBoolean HandleIncoming(const H245_MasterSlaveDetermination &pdu)
virtual PBoolean HandleRequestClose(const H245_RequestChannelClose &pdu)
PBoolean HandleRequest(const H245_RoundTripDelayRequest &pdu)
virtual PBoolean HandleReject(const H245_OpenLogicalChannelReject &pdu)
virtual PBoolean HandleRequestCloseAck(const H245_RequestChannelCloseAck &pdu)
H245NegTerminalCapabilitySet(H323EndPoint &endpoint, H323Connection &connection)
PBoolean IsRemoteOffline() const
Definition: h323neg.h:285
virtual void HandleTimeout()
PDECLARE_NOTIFIER(PTimer, H245Negotiator, HandleTimeoutUnlocked)
Definition: h323ep.h:82
virtual void HandleTimeout()
virtual PBoolean HandleRequestCloseRelease(const H245_RequestChannelCloseRelease &pdu)
H245Negotiator(H323EndPoint &endpoint, H323Connection &connection)
H323Channel * GetChannel() const
unsigned sequenceNumber
Definition: h323neg.h:289
unsigned outSequenceNumber
Definition: h323neg.h:266
Definition: h323neg.h:72
PBoolean Start(PBoolean renegotiate, PBoolean empty=false)
virtual PBoolean Open(const H323Capability &capability, unsigned sessionID, unsigned replacementFor=0, OpalMediaStreamPtr mediaStream=NULL)
virtual PBoolean HandleReject(const H245_RequestModeReject &pdu)
PBoolean HandleResponse(const H245_RoundTripDelayResponse &pdu)
PTimer replyTimer
Definition: h323neg.h:66
PBoolean HandleAck(const H245_MasterSlaveDeterminationAck &pdu)
H245NegRoundTripDelay(H323EndPoint &endpoint, H323Connection &connection)
Definition: h323neg.h:248