aboutsummaryrefslogtreecommitdiffstats
path: root/channels/h323/compat_h323.h
blob: 2ea640c4a9d890edd3b6f1985f78e9775fd5c3d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#ifndef COMPAT_H323_H
#define COMPAT_H323_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
 *  make TCP connections from specific address
 */
class MyH323TransportTCP : public H323TransportTCP
{
	PCLASSINFO(MyH323TransportTCP, H323TransportTCP);

public:
	MyH323TransportTCP(
		H323EndPoint & endpoint,    ///<  H323 End Point object
		PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(), ///<  Local interface to use
		BOOL listen = FALSE         ///<  Flag for need to wait for remote to connect
	);
	/**Connect to the remote party.
	 */
	virtual BOOL Connect();
};
#else
#define MyH323TransportTCP H323TransportTCP
#endif /* <VERSION(1,17,3) */

class MyH323TransportUDP: public H323TransportUDP
{
	PCLASSINFO(MyH323TransportUDP, H323TransportUDP);

public:
	MyH323TransportUDP(H323EndPoint &endpoint,
		PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
		WORD localPort = 0,
		WORD remotePort = 0): H323TransportUDP(endpoint, binding, localPort, remotePort)
	{
	}
	virtual BOOL DiscoverGatekeeper(H323Gatekeeper &,
		H323RasPDU &,
		const H323TransportAddress &);
protected:
	PDECLARE_NOTIFIER(PThread, MyH323TransportUDP, DiscoverMain);
	H323Gatekeeper *discoverGatekeeper;
	H323RasPDU *discoverPDU;
	const H323TransportAddress *discoverAddress;
	BOOL discoverResult;
	BOOL discoverReady;
	PMutex discoverMutex;
};

template <class _Abstract_T, typename _Key_T = PString>
class MyPFactory: public PFactory<_Abstract_T, _Key_T>
{
public:
	template <class _Contrete_T> class Worker: public PFactory<_Abstract_T, _Key_T>::WorkerBase
	{
	public:
		Worker(const _Key_T &_key, bool singleton = false)
			:PFactory<_Abstract_T, _Key_T>::WorkerBase(singleton), key(_key)
		{
			PFactory<_Abstract_T, _Key_T>::Register(key, this);
		}
		~Worker()
		{
			PFactory<_Abstract_T, _Key_T>::Unregister(key);
		}

	private:
		PString key;
    };
};

#ifdef H323_REGISTER_CAPABILITY
#undef H323_REGISTER_CAPABILITY
#endif
#define H323_REGISTER_CAPABILITY(cls, capName) static MyPFactory<H323Capability>::Worker<cls> cls##Factory(capName, true)

#endif /* !defined AST_H323_H */