Handle HOLD/RETRIEVE notifications
[asterisk/asterisk.git] / channels / h323 / ast_h323.h
1 /*
2  * ast_h323.h
3  *
4  * OpenH323 Channel Driver for ASTERISK PBX.
5  *                      By Jeremy McNamara
6  *                      For The NuFone Network 
7  * 
8  * This code has been derived from code created by
9  *              Michael Manousos and Mark Spencer
10  *
11  * This file is part of the chan_h323 driver for Asterisk
12  *
13  * chan_h323 is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version.
17  *
18  * chan_h323 is distributed WITHOUT ANY WARRANTY; without even
19  * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20  * PURPOSE. See the GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25  *
26  * Version Info: $Id$
27  */
28
29 #ifndef AST_H323_H
30 #define AST_H323_H
31
32 #define VERSION(a,b,c) ((a)*10000+(b)*100+(c))
33
34 class MyH323EndPoint : public H323EndPoint
35 {
36         PCLASSINFO(MyH323EndPoint, H323EndPoint);
37
38 public:
39         MyH323EndPoint();
40         int MyMakeCall(const PString &, PString &, void *_callReference, void *_opts);
41         BOOL ClearCall(const PString &, H323Connection::CallEndReason reason);
42         BOOL ClearCall(const PString &);
43
44         void OnClosedLogicalChannel(H323Connection &, const H323Channel &);
45         void OnConnectionEstablished(H323Connection &, const PString &);
46         void OnConnectionCleared(H323Connection &, const PString &);
47         virtual H323Connection * CreateConnection(unsigned, void *, H323Transport *, H323SignalPDU *);
48         void SendUserTone(const PString &, char);
49         BOOL OnConnectionForwarded(H323Connection &, const PString &, const H323SignalPDU &);
50         BOOL ForwardConnection(H323Connection &, const PString &, const H323SignalPDU &);
51         void SetEndpointTypeInfo( H225_EndpointType & info ) const;
52         void SetGateway(void);
53         PStringArray SupportedPrefixes;
54 };
55
56 class MyH323Connection : public H323Connection
57 {
58         PCLASSINFO(MyH323Connection, H323Connection);
59
60 public:
61         MyH323Connection(MyH323EndPoint &, unsigned, unsigned);
62         ~MyH323Connection();
63         H323Channel * CreateRealTimeLogicalChannel(const H323Capability &,
64                         H323Channel::Directions,
65                         unsigned,
66                         const H245_H2250LogicalChannelParameters *,
67                         RTP_QOS *);
68         H323Connection::AnswerCallResponse OnAnswerCall(const PString &,
69                         const H323SignalPDU &,
70                         H323SignalPDU &);
71         void OnReceivedReleaseComplete(const H323SignalPDU &);
72         BOOL OnAlerting(const H323SignalPDU &, const PString &);
73         BOOL OnSendReleaseComplete(H323SignalPDU &);
74         BOOL OnReceivedSignalSetup(const H323SignalPDU &);
75         BOOL OnReceivedFacility(const H323SignalPDU &);
76         BOOL OnSendSignalSetup(H323SignalPDU &);
77         BOOL OnStartLogicalChannel(H323Channel &);
78         BOOL OnClosingLogicalChannel(H323Channel &);
79         virtual void SendUserInputTone(char tone, unsigned duration = 0, unsigned logicalChannel = 0, unsigned rtpTimestamp = 0);
80         virtual void OnUserInputTone(char, unsigned, unsigned, unsigned);
81         virtual void OnUserInputString(const PString &value);
82         BOOL OnReceivedProgress(const H323SignalPDU &);
83         void OnSendCapabilitySet(H245_TerminalCapabilitySet &);
84         void OnSetLocalCapabilities();
85         void SetCapabilities(int, int, void *, int);
86         BOOL OnReceivedCapabilitySet(const H323Capabilities &, const H245_MultiplexCapability *,
87                         H245_TerminalCapabilitySetReject &);
88         void SetCause(int _cause) { cause = _cause; };
89         virtual BOOL StartControlChannel(const H225_TransportAddress & h245Address);
90         void SetCallOptions(void *opts, BOOL isIncoming);
91         void SetCallDetails(void *callDetails, const H323SignalPDU &setupPDU, BOOL isIncoming);
92 #ifdef TUNNELLING
93         virtual BOOL HandleSignalPDU(H323SignalPDU &pdu);
94         BOOL EmbedTunneledInfo(H323SignalPDU &pdu);
95 #endif
96 #ifdef H323_H450
97         virtual void OnReceivedLocalCallHold(int linkedId);
98         virtual void OnReceivedLocalCallRetrieve(int linkedId);
99 #endif
100         void MyHoldCall(BOOL localHold);
101
102         PString sourceAliases;
103         PString destAliases;
104         PString sourceE164;
105         PString destE164;
106         PString rdnis;
107         int redirect_reason;
108
109         WORD sessionId;
110         BOOL bridging;
111 #ifdef TUNNELLING
112         int remoteTunnelOptions;
113         int tunnelOptions;
114 #endif
115
116         unsigned holdHandling;
117         unsigned progressSetup;
118         unsigned progressAlert;
119         int cause;
120
121         RTP_DataFrame::PayloadTypes dtmfCodec[2];
122         int dtmfMode;
123 };
124
125 class MyH323_ExternalRTPChannel : public H323_ExternalRTPChannel
126 {
127         PCLASSINFO(MyH323_ExternalRTPChannel, H323_ExternalRTPChannel);
128
129 public:
130         MyH323_ExternalRTPChannel(
131                         MyH323Connection & connection,
132                         const H323Capability & capability,
133                         Directions direction,
134                         unsigned sessionID);
135
136         ~MyH323_ExternalRTPChannel();
137
138         /* Overrides */
139         BOOL Start(void);
140         BOOL OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters & param);
141
142 protected:
143         BYTE payloadCode;
144
145         PIPSocket::Address localIpAddr;
146         PIPSocket::Address remoteIpAddr;
147         WORD localPort;
148         WORD remotePort;
149 };
150
151 /**
152  * The MyProcess is a necessary descendant PProcess class so that the H323EndPoint
153  * objected to be created from within that class. (Solves the who owns main() problem).
154  */
155 class MyProcess : public PProcess
156 {
157         PCLASSINFO(MyProcess, PProcess);
158
159 public:
160         MyProcess();
161         ~MyProcess();
162         void Main();
163 };
164
165 #ifdef H323_H450
166 #include <h450pdu.h>
167
168 class MyH4504Handler : public H4504Handler
169 {
170         PCLASSINFO(MyH4504Handler, H4504Handler);
171
172 public:
173         MyH4504Handler(MyH323Connection &_conn, H450xDispatcher &_disp);
174         virtual void OnReceivedLocalCallHold(int linkedId);
175         virtual void OnReceivedLocalCallRetrieve(int linkedId);
176
177 private:
178         MyH323Connection *conn;
179 };
180 #endif
181
182 #include "compat_h323.h"
183
184 #endif /* !defined AST_H323_H */