OPAL
Version 3.18.8
|
#include <iax2ep.h>
Public Types | |
enum | { DefaultUdpPort = 4569 } |
Public Member Functions | |
Construction | |
IAX2EndPoint (OpalManager &manager) | |
~IAX2EndPoint () | |
connection Connection handling | |
virtual PString | GetDefaultTransport () const |
virtual WORD | GetDefaultSignalPort () const |
virtual PSafePtr< OpalConnection > | MakeConnection (OpalCall &call, const PString &party, void *userData=NULL, unsigned int options=0, OpalConnection::StringOptions *stringOptions=NULL) |
virtual IAX2Connection * | CreateConnection (OpalCall &call, const PString &token, void *userData, const PString &remoteParty, const PString &remotePartyName=PString::Empty()) |
![]() | |
P_DECLARE_BITWISE_ENUM (Attributes, 2,(NoAttributes, IsNetworkEndPoint, SupportsE164)) | |
OpalEndPoint (OpalManager &manager, const PCaselessString &prefix, Attributes attributes) | |
~OpalEndPoint () | |
virtual void | ShutDown () |
void | PrintOn (ostream &strm) const |
bool | StartListeners (const PStringArray &interfaces, bool add=true) |
virtual bool | StartListener (const PString &address) |
virtual bool | StartListener (OpalListener *listener) |
virtual PStringArray | GetDefaultListeners () const |
OpalListener * | FindListener (const OpalTransportAddress &iface) |
bool | FindListenerForProtocol (const char *proto, OpalTransportAddress &addr) |
PBoolean | StopListener (const OpalTransportAddress &iface) |
PBoolean | RemoveListener (OpalListener *listener) |
OpalTransportAddressArray | GetInterfaceAddresses (const OpalTransport *associatedTransport=NULL) const |
PDECLARE_AcceptHandlerNotifier (OpalEndPoint, NewIncomingConnection) | |
virtual void | OnNewConnection (OpalCall &call, OpalConnection &connection) |
virtual PBoolean | OnSetUpConnection (OpalConnection &connection) |
virtual PBoolean | OnIncomingConnection (OpalConnection &connection, unsigned options, OpalConnection::StringOptions *stringOptions) |
virtual void | OnProceeding (OpalConnection &connection) |
virtual void | OnAlerting (OpalConnection &connection, bool withMedia) |
virtual void | OnAlerting (OpalConnection &connection) |
virtual OpalConnection::AnswerCallResponse | OnAnswerCall (OpalConnection &connection, const PString &caller) |
virtual void | OnConnected (OpalConnection &connection) |
virtual void | OnHold (OpalConnection &connection, bool fromRemote, bool onHold) |
virtual void | OnHold (OpalConnection &connection) |
virtual PBoolean | OnForwarded (OpalConnection &connection, const PString &remoteParty) |
virtual bool | OnTransferNotify (OpalConnection &connection, const PStringToString &info, const OpalConnection *transferringConnection) |
virtual PBoolean | ClearCall (const PString &token, OpalConnection::CallEndReason reason=OpalConnection::EndedByLocalUser, PSyncPoint *sync=NULL) |
virtual PBoolean | ClearCallSynchronous (const PString &token, OpalConnection::CallEndReason reason=OpalConnection::EndedByLocalUser, PSyncPoint *sync=NULL) |
virtual void | ClearAllCalls (OpalConnection::CallEndReason reason=OpalConnection::EndedByLocalUser, PBoolean wait=true) |
PSafePtr< OpalConnection > | GetConnectionWithLock (const PString &token, PSafetyMode mode=PSafeReadWrite) const |
template<class ConnClass > | |
PSafePtr< ConnClass > | GetConnectionWithLockAs (const PString &token, PSafetyMode mode=PSafeReadWrite) const |
PStringList | GetAllConnections () |
PINDEX | GetConnectionCount () const |
virtual PBoolean | HasConnection (const PString &token) |
virtual void | DestroyConnection (OpalConnection *connection) |
virtual void | AdjustMediaFormats (bool local, const OpalConnection &connection, OpalMediaFormatList &mediaFormats) const |
virtual bool | GetMediaTransportAddresses (const OpalConnection &provider, const OpalConnection &consumer, unsigned sessionId, const OpalMediaType &mediaType, OpalTransportAddressArray &transports) const |
virtual PBoolean | OnOpenMediaStream (OpalConnection &connection, OpalMediaStream &stream) |
virtual void | OnClosedMediaStream (const OpalMediaStream &stream) |
virtual void | OnFailedMediaStream (OpalConnection &connection, bool fromRemote, const PString &reason) |
void | SetMediaCryptoSuites (const PStringArray &security) |
PStringArray | GetMediaCryptoSuites () const |
virtual PStringArray | GetAllMediaCryptoSuites () const |
virtual void | OnUserInputString (OpalConnection &connection, const PString &value) |
virtual void | OnUserInputTone (OpalConnection &connection, char tone, int duration) |
virtual PString | ReadUserInput (OpalConnection &connection, const char *terminators="#\r\n", unsigned lastDigitTimeout=4, unsigned firstDigitTimeout=30) |
virtual PBoolean | Message (const PString &to, const PString &body) |
virtual PBoolean | Message (const PURL &to, const PString &type, const PString &body, PURL &from, PString &conversationId) |
virtual PBoolean | Message (OpalIM &Message) |
virtual void | OnMessageReceived (const OpalIM &message) |
virtual void | OnMWIReceived (const PString &party, OpalManager::MessageWaitingType type, const PString &extraInfo) |
virtual bool | GetConferenceStates (OpalConferenceStates &states, const PString &name=PString::Empty()) const |
virtual void | OnConferenceStatusChanged (OpalEndPoint &endpoint, const PString &uri, OpalConferenceState::ChangeType change) |
virtual PStringList | GetNetworkURIs (const PString &name) const |
virtual PBoolean | GarbageCollection () |
OpalManager & | GetManager () const |
const PString & | GetPrefixName () const |
bool | HasAttribute (Attributes opt) const |
const OpalProductInfo & | GetProductInfo () const |
void | SetProductInfo (const OpalProductInfo &info) |
const PString & | GetDefaultLocalPartyName () const |
virtual void | SetDefaultLocalPartyName (const PString &name) |
const PString & | GetDefaultDisplayName () const |
void | SetDefaultDisplayName (const PString &name) |
OpalBandwidth | GetInitialBandwidth (OpalBandwidth::Direction dir) const |
bool | SetInitialBandwidth (OpalBandwidth::Direction dir, OpalBandwidth bandwidth) |
const OpalListenerList & | GetListeners () const |
const OpalConnection::StringOptions & | GetDefaultStringOptions () const |
void | SetDefaultStringOptions (const OpalConnection::StringOptions &opts, bool overwrite=false) |
void | SetDefaultStringOption (const PCaselessString &key, const PString &data) |
void | RemoveDefaultStringOption (const PCaselessString &key) |
virtual PStringList | GetAvailableStringOptions () const |
OpalConnection::SendUserInputModes | GetSendUserInputMode () const |
void | SetSendUserInputMode (OpalConnection::SendUserInputModes mode) |
const PIPSocket::QoS & | GetSignalQoS () const |
void | SetSignalQoS (const PIPSocket::QoS &qos) |
const PIPSocket::QoS & | GetMediaQoS (const OpalMediaType &type) const |
void | SetMediaQoS (const OpalMediaType &type, const PIPSocket::QoS &qos) |
PINDEX | GetMaxSizeUDP () const |
void | SetMaxSizeUDP (PINDEX size) |
Protected Member Functions | |
PDECLARE_MUTEX (m_callNumbLock) | |
PDECLARE_MUTEX (m_statusQueryMutex) | |
PBoolean | ProcessInMatchingConnection (IAX2Frame *f) |
PBoolean | ProcessFrameInConnection (IAX2Frame *f, const PString &token) |
PBoolean | ProcessInConnectionTestAll (IAX2Frame *f) |
PDECLARE_MUTEX (m_regProcessorsMutex) | |
![]() | |
OpalConnection * | AddConnection (OpalConnection *connection) |
worker Methods | |
enum | IAX2RemoteAddressFields { protoIndex = 0, userIndex = 1, transportIndex = 2, addressIndex = 3, portIndex = 4, extensionIndex = 5, contextIndex = 6, maximumIndex = 7 } |
enum | RegisteredError { RegisteredFailureUnknown } |
enum | UnregisteredError { UnregisteredFailureUnknown } |
IAX2Transmit * | transmitter |
IAX2Receiver * | receiver |
PBoolean | Initialise () |
virtual void | IncomingEthernetFrame (IAX2Frame *frame) |
PBoolean | ConectionForFrameIsAlive (IAX2Frame *f) |
PINDEX | NextSrcCallNumber (IAX2Processor *processor) |
void | ReportStoredConnections () |
WORD | ListenPortNumber () |
PString | GetLocalUserName () |
PString | GetLocalNumber () |
void | SetLocalUserName (PString newValue) |
void | SetLocalNumber (PString newValue) |
PString & | GetPassword () |
void | SetPassword (PString newValue) |
PBoolean | ConnectionForFrameIsAlive (IAX2Frame *f) |
PINDEX | GetOutSequenceNumberForStatusQuery () |
void | StartRinging (PString remoteCaller) |
void | NewIncomingConnection (IAX2Frame *f) |
void | OnEstablished (OpalConnection &con) |
virtual void | OnReleased (OpalConnection &connection) |
virtual OpalMediaFormatList | GetMediaFormats () const |
PINDEX | GetSupportedCodecs (OpalMediaFormatList &list) |
PINDEX | GetPreferredCodec (OpalMediaFormatList &list) |
void | GetCodecLengths (PINDEX src, PINDEX &compressedBytes, PINDEX &duration) |
void | ProcessReceivedEthernetFrames () |
void | ReportTransmitterLists (PString &answer, bool getFullReport=false) |
void | CopyLocalMediaFormats (OpalMediaFormatList &list) |
void | Register (const PString &host, const PString &username, const PString &password=PString::Empty(), PINDEX requestedRefreshTime=60) |
virtual void | OnRegistered (const PString &host, const PString &userName, PBoolean isFailure, RegisteredError reason=RegisteredFailureUnknown) |
void | Unregister (const PString &host, const PString &username) |
virtual void | OnUnregistered (const PString &host, const PString &userName, PBoolean isFailure, UnregisteredError reason=UnregisteredFailureUnknown) |
PBoolean | IsRegistered (const PString &host, const PString &username) |
PINDEX | GetRegistrationsCount () |
PString | BuildUrl (const PString &host, const PString &userName=PString::Empty(), const PString &extension=PString::Empty(), const PString &context=PString::Empty(), const PString &transport=PString::Empty()) |
PBoolean | InitialisedOK () |
PBoolean | EthernetFramesToBeProcessed () |
static PStringArray | DissectRemoteParty (const PString &other) |
A class to manage global variables. There is one Endpoint per application.
enum of the components from a remote party address string These fields are from the address,
[iax2:]{username@][transport$]address[/extension][+context]
IAX2EndPoint::IAX2EndPoint | ( | OpalManager & | manager | ) |
Create the endpoint, and define local variables
IAX2EndPoint::~IAX2EndPoint | ( | ) |
Destroy the endpoint, and all associated connections
PString IAX2EndPoint::BuildUrl | ( | const PString & | host, |
const PString & | userName = PString::Empty() , |
||
const PString & | extension = PString::Empty() , |
||
const PString & | context = PString::Empty() , |
||
const PString & | transport = PString::Empty() |
||
) |
Builds a url
PBoolean IAX2EndPoint::ConectionForFrameIsAlive | ( | IAX2Frame * | f | ) |
A simple test to report if the connection associated with this frame is still alive. This test is used when transmitting the frame. If the connection is gone, don't bother transmitting the frame. There are exceptins to this rule, such as when a hangup packet is sent (which is after the connections has died.
PBoolean IAX2EndPoint::ConnectionForFrameIsAlive | ( | IAX2Frame * | f | ) |
It is possible that a retransmitted frame has been in the transmit queue, and while sitting there that frames sending connection has died. Thus, prior to transmission, call tis method.
void IAX2EndPoint::CopyLocalMediaFormats | ( | OpalMediaFormatList & | list | ) |
Copy to the supplied OpalMediaList the media formats we support
|
virtual |
Create a connection for the IAX endpoint. The default implementation is to create a IAX2Connection.
token | Owner of connection |
userData | token used to identify connection |
remoteParty | User data for connection |
remotePartyName | Url to call or is calling. Name to call or is calling. |
|
static |
Given a remote party name of the format:
[proto:][alias@][transport$]address[/extension]
pull the string apart and get the components. The compoents are stored in a PStringList, indexed by the enum RemoteAddressFields
|
inline |
Report if there are frames (from the ethernet) waiting to be processed
References m_packetsReadFromEthernet.
void IAX2EndPoint::GetCodecLengths | ( | PINDEX | src, |
PINDEX & | compressedBytes, | ||
PINDEX & | duration | ||
) |
Get the frame size (bytes) and frame duration (ms) for compressed data from this codec
|
virtual |
Get the default signal port for this endpoint.
Reimplemented from OpalEndPoint.
|
virtual |
Get the default transports for the endpoint type. Overrides the default behaviour to return udp and tcp.
Reimplemented from OpalEndPoint.
|
inline |
Report the number used by the computer running this program
References m_localNumber.
|
inline |
Report the local username
References m_localUserName.
|
virtual |
Get the data formats this endpoint is capable of operating. This provides a list of media data format names that may be used by an OpalMediaStream may be created by a connection from this endpoint.
Note that a specific connection may not actually support all of the media formats returned here, but should return no more.
The default behaviour is pure.
Implements OpalEndPoint.
PINDEX IAX2EndPoint::GetOutSequenceNumberForStatusQuery | ( | ) |
Get out sequence number to use on status query frames
|
inline |
Report the password
References m_password.
PINDEX IAX2EndPoint::GetPreferredCodec | ( | OpalMediaFormatList & | list | ) |
Return the bitmask which specifies the preferred codec
PINDEX IAX2EndPoint::GetRegistrationsCount | ( | ) |
Get the number of accounts that are being registered
PINDEX IAX2EndPoint::GetSupportedCodecs | ( | OpalMediaFormatList & | list | ) |
Return the bitmask which specifies the possible codecs we support
|
virtual |
Handle a received IAX frame. This may be a mini frame or full frame
PBoolean IAX2EndPoint::Initialise | ( | ) |
Setup the Endpoint internval variables, which is called at program startup.
|
inline |
Report if this iax2 endpoint class is correctly initialised
References receiver, and transmitter.
PBoolean IAX2EndPoint::IsRegistered | ( | const PString & | host, |
const PString & | username | ||
) |
Check if an account is registered or being registered
|
inline |
Report the port in use for IAX calls
|
virtual |
Set up a connection to a remote party. This is called from the OpalManager::MakeConnection() function once it has determined that this is the endpoint for the protocol.
The general form for this party parameter is:
[iax2:]{username@][transport$]address[/extension][+context]
where the various fields will have meanings specific to the endpoint type. For example, with H.323 it could be "h323:Fred@site.com" which indicates a user Fred at gatekeeper size.com. Whereas for the PSTN endpoint it could be "pstn:5551234" which is to call 5551234 on the first available PSTN line.
The proto field is optional when passed to a specific endpoint. If it is present, however, it must agree with the endpoints protocol name or false is returned.
This function usually returns almost immediately with the connection continuing to occur in a new background thread.
If false is returned then the connection could not be established. For example if a PSTN endpoint is used and the assiciated line is engaged then it may return immediately. Returning a non-NULL value does not mean that the connection will succeed, only that an attempt is being made.
The default behaviour is pure.
call | Owner of connection |
party | Remote party to call |
userData | Arbitrary data to pass to connection |
options | options to pass to connection |
Implements OpalEndPoint.
void IAX2EndPoint::NewIncomingConnection | ( | IAX2Frame * | f | ) |
Handle new incoming connection from listener.
A return value of true indicates that the transport object should be deleted by the caller. false indicates that something else (eg the connection) has taken over responsibility for deleting the transport.
Well, that is true of Opal. In iax2, we do all the work of creating a new connection etc. The transport arguement is ignore. In Iax2, this method is void, as no value is returned. Further, in iax2, we process the incoming frame.
f | Frame carrying the new request. |
PINDEX IAX2EndPoint::NextSrcCallNumber | ( | IAX2Processor * | processor | ) |
Request a new source call number, one that is different to all other source call numbers for this program.
|
virtual |
A call back function whenever a connection is established. This indicates that a connection to an endpoint was established. This usually occurs after OnConnected() and indicates that the connection is both connected and media can flow.
Reimplemented from OpalEndPoint.
|
virtual |
This is a call back if an event related to registration occurs. This callback should return as soon as possible.
|
virtual |
Called whenever a connection instance is finished being used to manage a call. We trap this callback to remove the connection from this endpoints token table. Once we are done the token table, we then call the generic OpalEndpoint::OnReleased method.
connection | Connection that was established |
Reimplemented from OpalEndPoint.
|
virtual |
This is a call back if an event related to unregistration occurs. This callback should return as soon as possible. Generally even if a failure occurs when unregistering it should be ignored because it does not matter to much that it couldn't unregister.
|
protected |
lock on access to call numbers variable
|
protected |
Mutex for the statusQueryCounter
|
protected |
A mutex to protect the registerProcessors collection
|
protected |
For the supplied IAX2Frame, pass it to a connection in the connectionsActive structure. We are told the token of the connection that matches this particular frame.
|
protected |
Take the supplied frame, and compare it with all the existing connections. If any of the existing connections has a matching dest call number, then put this frame to that connection.
Update the token translation dictionary if the supplied frame has a valid connection token.
|
protected |
For the supplied IAX2Frame, pass it to a connection in the connectionsActive structure. If no matching connection is found, return false;
If a matching connections is found, give the frame to the connection (for the connection to process) and return true;
void IAX2EndPoint::ProcessReceivedEthernetFrames | ( | ) |
Pull frames off the incoming list, and pass on to the relevant connection. If no matching connection found, delete the frame. Repeat the process until no frames are left.
void IAX2EndPoint::Register | ( | const PString & | host, |
const PString & | username, | ||
const PString & | password = PString::Empty() , |
||
PINDEX | requestedRefreshTime = 60 |
||
) |
Register with a remote iax2 server. The host can either be a hostname or ip address. The password is optional as some servers may not require it to register. The requested refresh time is the time that the registration should be refreshed in seconds. The time must be more than 10 seconds.
void IAX2EndPoint::ReportStoredConnections | ( | ) |
Write the token of all connections in the connectionsActive structure to the trace file
void IAX2EndPoint::ReportTransmitterLists | ( | PString & | answer, |
bool | getFullReport = false |
||
) |
Report on the frames in the current transmitter class, which are pending transmission
void IAX2EndPoint::SetLocalNumber | ( | PString | newValue | ) |
Set the local (on this host) number to some value
void IAX2EndPoint::SetLocalUserName | ( | PString | newValue | ) |
Set the username to some value
void IAX2EndPoint::SetPassword | ( | PString | newValue | ) |
Set the password to some value
void IAX2EndPoint::StartRinging | ( | PString | remoteCaller | ) |
We have an incoming call. Do we accept ?
void IAX2EndPoint::Unregister | ( | const PString & | host, |
const PString & | username | ||
) |
Unregister from a registrar. This function is synchronous so it will block.
|
protected |
Local copy of the media types we can handle
|
protected |
Number of active calls
|
protected |
Thread safe counter which keeps track of the calls created by this endpoint. This value is used when giving outgoing calls a unique ID
|
protected |
Time when a call was started
|
protected |
Thread which transfers frames from the Receiver to the appropriate connection. It momentarily locks the connection list, searches through, and then completes the trasnsfer. If need be, this thread will create a new conneciton (to cope with a new incoming call) and add the new connections to the internal list.
|
protected |
Number, as used by the computer on the host running this program
Referenced by GetLocalNumber().
|
protected |
Name of this user, which is used as the IeCallingNumber
Referenced by GetLocalUserName().
|
protected |
Threading mutex on the variable tokenTable. We can now safely read/write to this table, with the minimum of interference between threads.
|
protected |
List of iax2 packets which has been read from the ethernet, and is to be sent to the matching IAX2Connection
Referenced by EthernetFramesToBeProcessed().
|
protected |
Password for this user, which is used when processing an authentication request
Referenced by GetPassword().
|
protected |
An array of register processors. These are created when another class calls register and deleted when another class calls unregister or class destructor is called. This collection must be protected by the regProcessorsMutex
|
protected |
The socket on which all data is sent/received.
|
protected |
Counter to use for sending on status query frames
|
protected |
tokenTable is a hack to allow IAX2 to fit in with one of the demands of the opal library.
Opal demands that at connection setup, we know the unique ID which this call will use.
Since the unique ID is remote ip adress + remote's Source Call number, this is unknown if we are initiating the call. Consequently, this table is needed, as it provides a translation between the initial (or psuedo) token and the token that is later adopted
IAX2Receiver* IAX2EndPoint::receiver |
Pointer to the receiver class, which is always valid
Referenced by InitialisedOK().
|
protected |
Pointer to the Processor class which handles special packets (eg lagrq) that have no destination call to handle them.
IAX2Transmit* IAX2EndPoint::transmitter |
Pointer to the transmitter class, which is always valid
Referenced by InitialisedOK().