aboutsummaryrefslogtreecommitdiffstats
path: root/channels/h323
diff options
context:
space:
mode:
Diffstat (limited to 'channels/h323')
-rw-r--r--channels/h323/ast_h323.cxx137
-rw-r--r--channels/h323/ast_h323.h28
-rw-r--r--channels/h323/chan_h323.h1
-rw-r--r--channels/h323/compat_h323.cxx1
-rw-r--r--channels/h323/compat_h323.h2
5 files changed, 99 insertions, 70 deletions
diff --git a/channels/h323/ast_h323.cxx b/channels/h323/ast_h323.cxx
index 0c31569f3..489cf7a12 100644
--- a/channels/h323/ast_h323.cxx
+++ b/channels/h323/ast_h323.cxx
@@ -30,6 +30,7 @@
*/
#include "asterisk.h"
+#define VERSION(a,b,c) ((a)*10000+(b)*100+(c))
#include <arpa/inet.h>
@@ -42,6 +43,23 @@
#include <h323pdu.h>
#include <h323neg.h>
#include <mediafmt.h>
+
+/* H323 Plus */
+#if VERSION(OPENH323_MAJOR, OPENH323_MINOR, OPENH323_BUILD) > VERSION(1,19,4)
+
+#ifdef H323_H450
+#include "h450/h4501.h"
+#include "h450/h4504.h"
+#include "h450/h45011.h"
+#include "h450/h450pdu.h"
+#endif
+
+#ifdef H323_H460
+#include <h460/h4601.h>
+#endif
+
+#else /* !H323 Plus */
+
#include <lid.h>
#ifdef H323_H450
#include "h4501.h"
@@ -50,6 +68,10 @@
#include "h450pdu.h"
#endif
+#endif /* H323 Plus */
+
+#include "compat_h323.h"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -66,15 +88,40 @@ extern "C" {
#include "cisco-h225.h"
#include "caps_h323.h"
-#if PWLIB_MAJOR * 10000 + PWLIB_MINOR * 100 + PWLIB_BUILD >= 1 * 10000 + 12 * 100 + 0
+#if VERSION(PWLIB_MAJOR, PWLIB_MINOR, PWLIB_BUILD) >= VERSION(1,12,0)
#define SKIP_PWLIB_PIPE_BUG_WORKAROUND 1
#endif
+///////////////////////////////////////////////
+/* We have to have a PProcess running for the life of the instance to give
+ * h323plus a static instance of PProcess to get system information.
+ * This class is defined with PDECLARE_PROCESS(). See pprocess.h from pwlib.
+ */
+
/* PWlib Required Components */
+#if VERSION(OPENH323_MAJOR, OPENH323_MINOR, OPENH323_BUILD) > VERSION(1,19,4)
+#define MAJOR_VERSION 1
+#define MINOR_VERSION 19
+#define BUILD_TYPE ReleaseCode
+#define BUILD_NUMBER 6
+#else
#define MAJOR_VERSION 1
#define MINOR_VERSION 0
#define BUILD_TYPE ReleaseCode
#define BUILD_NUMBER 0
+#endif
+
+const char *h323manufact = "The NuFone Networks";
+const char *h323product = "H.323 Channel Driver for Asterisk";
+
+PDECLARE_PROCESS(MyProcess,PProcess,h323manufact,h323product,MAJOR_VERSION,MINOR_VERSION,BUILD_TYPE,BUILD_NUMBER)
+static MyProcess localProcess; // active for the life of the DLL
+/* void MyProcess::Main()
+{
+}
+*/
+////////////////////////////////////////////////
+
/** Counter for the number of connections */
static int channelsOpen;
@@ -86,13 +133,6 @@ static int channelsOpen;
*/
static MyH323EndPoint *endPoint = NULL;
-/** PWLib entry point */
-static MyProcess *localProcess = NULL;
-
-#ifndef SKIP_PWLIB_PIPE_BUG_WORKAROUND
-static int _timerChangePipe[2];
-#endif
-
static unsigned traceOptions = PTrace::Timestamp | PTrace::Thread | PTrace::FileAndLine;
class PAsteriskLog : public PObject, public iostream {
@@ -177,36 +217,6 @@ static ostream &my_endl(ostream &os)
(logstream ? (PTrace::ClearOptions((unsigned)-1), PTrace::Begin(0, __FILE__, __LINE__)) : std::cout)
#define endl my_endl
-/* Special class designed to call cleanup code on module destruction */
-class MyH323_Shutdown {
- public:
- MyH323_Shutdown() { };
- ~MyH323_Shutdown()
- {
- h323_end_process();
- };
-};
-
-MyProcess::MyProcess(): PProcess("The NuFone Networks",
- "H.323 Channel Driver for Asterisk",
- MAJOR_VERSION, MINOR_VERSION, BUILD_TYPE, BUILD_NUMBER)
-{
- /* Call shutdown when module being unload or asterisk has been stopped */
- static MyH323_Shutdown x;
-
- /* Fix missed one in PWLib */
- PX_firstTimeStart = FALSE;
- Resume();
-}
-
-MyProcess::~MyProcess()
-{
-#ifndef SKIP_PWLIB_PIPE_BUG_WORKAROUND
- _timerChangePipe[0] = timerChangePipe[0];
- _timerChangePipe[1] = timerChangePipe[1];
-#endif
-}
-
void MyProcess::Main()
{
PTrace::Initialise(PTrace::GetLevel(), NULL, traceOptions);
@@ -2061,7 +2071,7 @@ PBoolean MyH323Connection::StartControlChannel(const H225_TransportAddress & h24
cout << "Using " << addr << " for outbound H.245 transport" << endl;
controlChannel = new MyH323TransportTCP(endpoint, addr);
} else
- controlChannel = new H323TransportTCP(endpoint);
+ controlChannel = new MyH323TransportTCP(endpoint);
if (!controlChannel->SetRemoteAddress(h245Address)) {
PTRACE(1, "H225\tCould not extract H245 address");
delete controlChannel;
@@ -2250,8 +2260,7 @@ void h323_end_point_create(void)
{
channelsOpen = 0;
logstream = new PAsteriskLog();
- localProcess = new MyProcess();
- localProcess->Main();
+ endPoint = new MyH323EndPoint();
}
void h323_gk_urq(void)
@@ -2359,6 +2368,33 @@ int h323_start_listener(int listenPort, struct sockaddr_in bindaddr)
return 0;
};
+/* Addition of functions just to make the channel driver compile with H323Plus */
+#if VERSION(OPENH323_MAJOR, OPENH323_MINOR, OPENH323_BUILD) > VERSION(1,19,4)
+/* Alternate RTP port information for Same NAT */
+BOOL MyH323_ExternalRTPChannel::OnReceivedAltPDU(const H245_ArrayOf_GenericInformation & alternate )
+{
+ return TRUE;
+}
+
+/* Alternate RTP port information for Same NAT */
+BOOL MyH323_ExternalRTPChannel::OnSendingAltPDU(H245_ArrayOf_GenericInformation & alternate) const
+{
+ return TRUE;
+}
+
+/* Alternate RTP port information for Same NAT */
+void MyH323_ExternalRTPChannel::OnSendOpenAckAlt(H245_ArrayOf_GenericInformation & alternate) const
+{
+}
+
+/* Alternate RTP port information for Same NAT */
+BOOL MyH323_ExternalRTPChannel::OnReceivedAckAltPDU(const H245_ArrayOf_GenericInformation & alternate)
+{
+ return TRUE;
+}
+#endif
+
+
int h323_set_alias(struct oh323_alias *alias)
{
char *p;
@@ -2374,7 +2410,7 @@ int h323_set_alias(struct oh323_alias *alias)
cout << "== Adding alias \"" << h323id << "\" to endpoint" << endl;
endPoint->AddAliasName(h323id);
- endPoint->RemoveAliasName(localProcess->GetUserName());
+ endPoint->RemoveAliasName(PProcess::Current().GetName());
if (!e164.IsEmpty()) {
cout << "== Adding E.164 \"" << e164 << "\" to endpoint" << endl;
@@ -2409,6 +2445,11 @@ void h323_show_tokens(void)
cout << "Current call tokens: " << setprecision(2) << endPoint->GetAllConnections() << endl;
}
+void h323_show_version(void)
+{
+ cout << "H.323 version: " << OPENH323_MAJOR << "." << OPENH323_MINOR << "." << OPENH323_BUILD << endl;
+}
+
/** Establish Gatekeeper communiations, if so configured,
* register aliases for the H.323 endpoint to respond to.
*/
@@ -2626,22 +2667,10 @@ int h323_hold_call(const char *token, int is_hold)
void h323_end_process(void)
{
if (endPoint) {
- endPoint->ClearAllCalls();
- endPoint->RemoveListener(NULL);
delete endPoint;
endPoint = NULL;
}
- if (localProcess) {
- delete localProcess;
- localProcess = NULL;
-#ifndef SKIP_PWLIB_PIPE_BUG_WORKAROUND
- close(_timerChangePipe[0]);
- close(_timerChangePipe[1]);
-#endif
- }
if (logstream) {
- PTrace::SetLevel(0);
- PTrace::SetStream(&cout);
delete logstream;
logstream = NULL;
}
diff --git a/channels/h323/ast_h323.h b/channels/h323/ast_h323.h
index afc0f3d1b..b9e793c0f 100644
--- a/channels/h323/ast_h323.h
+++ b/channels/h323/ast_h323.h
@@ -151,26 +151,24 @@ protected:
PIPSocket::Address localIpAddr;
PIPSocket::Address remoteIpAddr;
+ /* Additional functions in order to have chan_h323 compile with H323Plus */
+#if VERSION(OPENH323_MAJOR, OPENH323_MINOR, OPENH323_BUILD) > VERSION(1,19,4)
+ BOOL OnReceivedAltPDU(const H245_ArrayOf_GenericInformation & alternate );
+ BOOL OnSendingAltPDU(H245_ArrayOf_GenericInformation & alternate) const;
+ void OnSendOpenAckAlt(H245_ArrayOf_GenericInformation & alternate) const;
+ BOOL OnReceivedAckAltPDU(const H245_ArrayOf_GenericInformation & alternate);
+#endif
WORD localPort;
WORD remotePort;
};
-/**
- * The MyProcess is a necessary descendant PProcess class so that the H323EndPoint
- * objected to be created from within that class. (Solves the who owns main() problem).
- */
-class MyProcess : public PProcess
-{
- PCLASSINFO(MyProcess, PProcess);
-
-public:
- MyProcess();
- ~MyProcess();
- void Main();
-};
-
#ifdef H323_H450
+
+#if VERSION(OPENH323_MAJOR, OPENH323_MINOR, OPENH323_BUILD) > VERSION(1,19,4)
+#include <h450/h450pdu.h>
+#else
#include <h450pdu.h>
+#endif
class MyH4504Handler : public H4504Handler
{
@@ -186,6 +184,4 @@ private:
};
#endif
-#include "compat_h323.h"
-
#endif /* !defined AST_H323_H */
diff --git a/channels/h323/chan_h323.h b/channels/h323/chan_h323.h
index 95e8c491d..e121f02fb 100644
--- a/channels/h323/chan_h323.h
+++ b/channels/h323/chan_h323.h
@@ -242,6 +242,7 @@ extern "C" {
int h323_set_gk(int, char *, char *);
void h323_set_id(char *);
void h323_show_tokens(void);
+ void h323_show_version(void);
/* H323 listener related funcions */
int h323_start_listener(int, struct sockaddr_in);
diff --git a/channels/h323/compat_h323.cxx b/channels/h323/compat_h323.cxx
index 8eb73a98e..609d18e8a 100644
--- a/channels/h323/compat_h323.cxx
+++ b/channels/h323/compat_h323.cxx
@@ -33,6 +33,7 @@
#include <transports.h>
#include "ast_h323.h"
+#include "compat_h323.h"
#if VERSION(OPENH323_MAJOR,OPENH323_MINOR,OPENH323_BUILD) < VERSION(1,17,3)
MyH323TransportTCP::MyH323TransportTCP(
diff --git a/channels/h323/compat_h323.h b/channels/h323/compat_h323.h
index 53938350d..61076f1be 100644
--- a/channels/h323/compat_h323.h
+++ b/channels/h323/compat_h323.h
@@ -1,6 +1,8 @@
#ifndef COMPAT_H323_H
#define COMPAT_H323_H
+#include "ast_ptlib.h"
+
#if VERSION(OPENH323_MAJOR,OPENH323_MINOR,OPENH323_BUILD) < VERSION(1,17,3)
/**
* Workaround for broken (less than 1.17.3) OpenH323 stack to be able to