74e13e7caa14748b572303aa9a4e518d1536335b
[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         BOOL MySendProgress();
84         void OnSendCapabilitySet(H245_TerminalCapabilitySet &);
85         void OnSetLocalCapabilities();
86         void SetCapabilities(int, int, void *, int);
87         BOOL OnReceivedCapabilitySet(const H323Capabilities &, const H245_MultiplexCapability *,
88                         H245_TerminalCapabilitySetReject &);
89         void SetCause(int _cause) { cause = _cause; };
90         virtual BOOL StartControlChannel(const H225_TransportAddress & h245Address);
91         void SetCallOptions(void *opts, BOOL isIncoming);
92         void SetCallDetails(void *callDetails, const H323SignalPDU &setupPDU, BOOL isIncoming);
93 #ifdef TUNNELLING
94         virtual BOOL HandleSignalPDU(H323SignalPDU &pdu);
95         BOOL EmbedTunneledInfo(H323SignalPDU &pdu);
96 #endif
97 #ifdef H323_H450
98         virtual void OnReceivedLocalCallHold(int linkedId);
99         virtual void OnReceivedLocalCallRetrieve(int linkedId);
100 #endif
101         void MyHoldCall(BOOL localHold);
102
103         PString sourceAliases;
104         PString destAliases;
105         PString sourceE164;
106         PString destE164;
107         int cid_presentation;
108         int cid_ton;
109         PString rdnis;
110         int redirect_reason;
111
112         WORD sessionId;
113         BOOL bridging;
114 #ifdef TUNNELLING
115         int remoteTunnelOptions;
116         int tunnelOptions;
117 #endif
118
119         unsigned holdHandling;
120         unsigned progressSetup;
121         unsigned progressAlert;
122         int cause;
123
124         RTP_DataFrame::PayloadTypes dtmfCodec[2];
125         int dtmfMode;
126 };
127
128 class MyH323_ExternalRTPChannel : public H323_ExternalRTPChannel
129 {
130         PCLASSINFO(MyH323_ExternalRTPChannel, H323_ExternalRTPChannel);
131
132 public:
133         MyH323_ExternalRTPChannel(
134                         MyH323Connection & connection,
135                         const H323Capability & capability,
136                         Directions direction,
137                         unsigned sessionID);
138
139         ~MyH323_ExternalRTPChannel();
140
141         /* Overrides */
142         BOOL Start(void);
143         BOOL OnReceivedAckPDU(const H245_H2250LogicalChannelAckParameters & param);
144
145 protected:
146         BYTE payloadCode;
147
148         PIPSocket::Address localIpAddr;
149         PIPSocket::Address remoteIpAddr;
150         WORD localPort;
151         WORD remotePort;
152 };
153
154 /**
155  * The MyProcess is a necessary descendant PProcess class so that the H323EndPoint
156  * objected to be created from within that class. (Solves the who owns main() problem).
157  */
158 class MyProcess : public PProcess
159 {
160         PCLASSINFO(MyProcess, PProcess);
161
162 public:
163         MyProcess();
164         ~MyProcess();
165         void Main();
166 };
167
168 #ifdef H323_H450
169 #include <h450pdu.h>
170
171 class MyH4504Handler : public H4504Handler
172 {
173         PCLASSINFO(MyH4504Handler, H4504Handler);
174
175 public:
176         MyH4504Handler(MyH323Connection &_conn, H450xDispatcher &_disp);
177         virtual void OnReceivedLocalCallHold(int linkedId);
178         virtual void OnReceivedLocalCallRetrieve(int linkedId);
179
180 private:
181         MyH323Connection *conn;
182 };
183 #endif
184
185 #include "compat_h323.h"
186
187 #endif /* !defined AST_H323_H */