diff options
author | jeremy <jeremy@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-03-31 07:13:36 +0000 |
---|---|---|
committer | jeremy <jeremy@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-03-31 07:13:36 +0000 |
commit | e87ec82e085f525e025784b59b7c6c963688e876 (patch) | |
tree | b1f49afdb738ce50543831306c4bff41e894c05f /channels/h323/ast_h323.h | |
parent | d53be73ebe9f97b545594f1c2db16926aaddf524 (diff) |
first commit of chan_h323
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@724 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/h323/ast_h323.h')
-rwxr-xr-x | channels/h323/ast_h323.h | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/channels/h323/ast_h323.h b/channels/h323/ast_h323.h new file mode 100755 index 000000000..a7604834e --- /dev/null +++ b/channels/h323/ast_h323.h @@ -0,0 +1,249 @@ +/* + * h323wrap.h + * + * OpenH323 Channel Driver for ASTERISK PBX. + * By Jeremy McNamara + * For The NuFone Network + * + * This code has been derived from code created by + * Michael Manousos and Mark Spencer + * + * This file is part of the chan_h323 driver for Asterisk + * + * chan_h323 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * chan_h323 is distributed WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + + +#include <ptlib.h> +#include <h323.h> +#include <h323pdu.h> +#include <mediafmt.h> +#include <lid.h> + +#include <list> +#include <string> +#include <algorithm> + +#include "chan_h323.h" + +/** These need to be redefined here because the C++ + side of this driver is blind to the asterisk headers */ + +/*! G.723.1 compression */ +#define AST_FORMAT_G723_1 (1 << 0) +/*! GSM compression */ +#define AST_FORMAT_GSM (1 << 1) +/*! Raw mu-law data (G.711) */ +#define AST_FORMAT_ULAW (1 << 2) +/*! Raw A-law data (G.711) */ +#define AST_FORMAT_ALAW (1 << 3) +/*! MPEG-2 layer 3 */ +#define AST_FORMAT_MP3 (1 << 4) +/*! ADPCM (whose?) */ +#define AST_FORMAT_ADPCM (1 << 5) +/*! Raw 16-bit Signed Linear (8000 Hz) PCM */ +#define AST_FORMAT_SLINEAR (1 << 6) +/*! LPC10, 180 samples/frame */ +#define AST_FORMAT_LPC10 (1 << 7) +/*! G.729A audio */ +#define AST_FORMAT_G729A (1 << 8) +/*! SpeeX Free Compression */ +#define AST_FORMAT_SPEEX (1 << 9) + + +/**This class describes the G.723.1 codec capability. + */ +class H323_G7231Capability : public H323AudioCapability +{ + PCLASSINFO(H323_G7231Capability, H323AudioCapability); + public: + H323_G7231Capability( + BOOL annexA = TRUE /// Enable Annex A silence insertion descriptors + ); + Comparison Compare(const PObject & obj) const; + + PObject * Clone() const; + + virtual H323Codec * CreateCodec( + H323Codec::Direction direction /// Direction in which this instance runs + ) const; + + unsigned GetSubType() const; + PString GetFormatName() const; + BOOL OnSendingPDU( + H245_AudioCapability & pdu, /// PDU to set information on + unsigned packetSize /// Packet size to use in capability + ) const; + + BOOL OnReceivedPDU( + const H245_AudioCapability & pdu, /// PDU to get information from + unsigned & packetSize /// Packet size to use in capability + ); + + protected: + BOOL annexA; +}; + +class MyH323EndPoint : public H323EndPoint { + + PCLASSINFO(MyH323EndPoint, H323EndPoint); + + public: + + int MakeCall(const PString &, PString &, unsigned int *, unsigned int); + BOOL ClearCall(const PString &); +// BOOL OnIncomingCall( H323Connection & connection, const H323SignalPDU &, H323SignalPDU &); + + void OnClosedLogicalChannel(H323Connection &, const H323Channel &); + void OnConnectionEstablished(H323Connection &, const PString &); + void OnConnectionCleared(H323Connection &, const PString &); + H323Connection * CreateConnection(unsigned, void *); + void SendUserTone(const PString &, char); + H323Capabilities GetCapabilities(void); + + PStringArray SupportedPrefixes; + + void SetEndpointTypeInfo( H225_EndpointType & info ) const; + void SetGateway(void); +}; + + +class MyH323Connection : public H323Connection { + + PCLASSINFO(MyH323Connection, H323Connection); + + public: + MyH323Connection(MyH323EndPoint &, unsigned, unsigned, WORD); + ~MyH323Connection(); + + H323Channel * CreateRealTimeLogicalChannel(const H323Capability &, H323Channel::Directions, unsigned, + const H245_H2250LogicalChannelParameters *); + H323Connection::AnswerCallResponse OnAnswerCall(const PString &, const H323SignalPDU &, H323SignalPDU &); + BOOL OnAlerting(const H323SignalPDU &, const PString &); + BOOL OnReceivedSignalSetup(const H323SignalPDU &); + void OnReceivedReleaseComplete(const H323SignalPDU &); + BOOL OnSendSignalSetup(H323SignalPDU &); + BOOL OnStartLogicalChannel(H323Channel &); + BOOL OnClosingLogicalChannel(H323Channel &); + void SendUserInputTone(char, unsigned); + void OnUserInputTone(char, unsigned, unsigned, unsigned); + void OnUserInputString(const PString &value); + + PString sourceAliases; + PString destAliases; + PString sourceE164; + PString destE164; + + PIPSocket::Address externalIpAddress; // IP address of media server + PIPSocket::Address remoteIpAddress; // IP Address of remote endpoint + WORD externalPort; // local media server Data port (control is dataPort+1) + WORD remotePort; // remote endpoint Data port (control is dataPort+1) +}; + + +#if 0 +class MyGatekeeperServer : public H323GatekeeperServer +{ + PCLASSINFO(MyGatekeeperServer, H323GatekeeperServer); + public: + MyGatekeeperServer(MyH323EndPoint & ep); + + // Overrides + virtual H323GatekeeperCall * CreateCall( + const OpalGloballyUniqueID & callIdentifier, + H323GatekeeperCall::Direction direction + ); + virtual BOOL TranslateAliasAddressToSignalAddress( + const H225_AliasAddress & alias, + H323TransportAddress & address + ); + + // new functions + BOOL Initialise(); + + private: + class RouteMap : public PObject { + PCLASSINFO(RouteMap, PObject); + public: + RouteMap( + const PString & alias, + const PString & host + ); + RouteMap( + const RouteMap & map + ) : alias(map.alias), regex(map.alias), host(map.host) { } + + void PrintOn( + ostream & strm + ) const; + + BOOL IsValid() const; + + BOOL IsMatch( + const PString & alias + ) const; + + const H323TransportAddress & GetHost() const { return host; } + + private: + PString alias; + PRegularExpression regex; + H323TransportAddress host; + }; + PList<RouteMap> routes; + + PMutex reconfigurationMutex; +}; + +#endif + +/** + * The MyProcess is a necessary descendant PProcess class so that the H323EndPoint + * objected to be created from within that class. (Who owns main() problem). + */ +class MyProcess : public PProcess { + + PCLASSINFO(MyProcess, PProcess); + + public: + MyProcess(); + ~MyProcess(); + + void Main(); + + +}; + + +/** + * This class handles the termination of a call. + * Note that OpenH323 Library requires that the termination + * of a call should be done inside a separate thread of execution. + */ +class ClearCallThread : public PThread { + + PCLASSINFO(ClearCallThread, PThread); + + public: + ClearCallThread(const char *tc); + ~ClearCallThread(); + + void Main(); + + protected: + PString token; +}; + + |