OPAL  Version 3.18.8
call.h
Go to the documentation of this file.
1 /*
2  * call.h
3  *
4  * Telephone call management
5  *
6  * Open Phone Abstraction Library (OPAL)
7  * Formally known as the Open H323 project.
8  *
9  * Copyright (c) 2001 Equivalence Pty. Ltd.
10  *
11  * The contents of this file are subject to the Mozilla Public License
12  * Version 1.0 (the "License"); you may not use this file except in
13  * compliance with the License. You may obtain a copy of the License at
14  * http://www.mozilla.org/MPL/
15  *
16  * Software distributed under the License is distributed on an "AS IS"
17  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
18  * the License for the specific language governing rights and limitations
19  * under the License.
20  *
21  * The Original Code is Open Phone Abstraction Library.
22  *
23  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
24  *
25  * Contributor(s): ______________________________________.
26  */
27 
28 #ifndef OPAL_OPAL_CALL_H
29 #define OPAL_OPAL_CALL_H
30 
31 #ifdef P_USE_PRAGMA
32 #pragma interface
33 #endif
34 
35 #include <opal_config.h>
36 
37 #include <opal/connection.h>
38 #include <opal/recording.h>
39 #include <opal/guid.h>
40 
41 #include <ptlib/safecoll.h>
42 
43 
44 class OpalManager;
45 class OpalRTPSession;
46 
47 
62 class OpalCall : public PSafeObject
63 {
64  PCLASSINFO(OpalCall, PSafeObject);
65  public:
70  OpalCall(
71  OpalManager & manager
72  );
73 
76  ~OpalCall();
78 
85  void PrintOn(
86  ostream & strm
87  ) const;
89 
94  PBoolean IsEstablished() const { return m_isEstablished; }
95 
104  virtual void OnEstablishedCall();
105 
115 
119 
124  void SetCallEndReason(
126  );
127 
136  void Clear(
137  OpalConnection::CallEndReason reason = OpalConnection::EndedByLocalUser,
138  PSyncPoint * sync = NULL
139  );
140 
146  virtual void OnCleared();
148 
156  virtual void OnNewConnection(
157  OpalConnection & connection
158  );
159 
165  virtual PBoolean OnSetUp(
166  OpalConnection & connection
167  );
168 
183  virtual void OnProceeding(
184  OpalConnection & connection
185  );
186 
201  virtual void OnAlerting(
202  OpalConnection & connection,
203  bool withMedia
204  );
205  virtual PBoolean OnAlerting(OpalConnection & connection); // For backward compatibility
206 
223  virtual OpalConnection::AnswerCallResponse OnAnswerCall(
224  OpalConnection & connection,
225  const PString & caller
226  );
227 
239  virtual PBoolean OnConnected(
240  OpalConnection & connection
241  );
242 
257  virtual PBoolean OnEstablished(
258  OpalConnection & connection
259  );
260 
266  virtual void OnReleased(
267  OpalConnection & connection
268  );
269 
276  virtual void OnHold(
277  OpalConnection & connection,
278  bool fromRemote,
279  bool onHold
280  );
281 
287  PSafePtr<OpalConnection> GetOtherPartyConnection(
288  const OpalConnection & connection
289  ) const;
290 
293  PINDEX GetConnectionCount() const { return m_connectionsActive.GetSize(); }
294 
297  PSafePtr<OpalConnection> GetConnection(
298  PINDEX idx,
299  PSafetyMode mode = PSafeReference
300  ) { return m_connectionsActive.GetAt(idx, mode); }
301 
305  template <class ConnClass>
306  PSafePtr<ConnClass> GetConnectionAs(
307  PINDEX count = 0,
308  PSafetyMode mode = PSafeReadWrite
309  )
310  {
311  PSafePtr<ConnClass> connection;
312  for (PSafePtr<OpalConnection> iterConn(m_connectionsActive, PSafeReference); iterConn != NULL; ++iterConn) {
313  if ((connection = PSafePtrCast<OpalConnection, ConnClass>(iterConn)) != NULL && count-- == 0) {
314  if (!connection.SetSafetyMode(mode))
315  connection.SetNULL();
316  break;
317  }
318  }
319  return connection;
320  }
321 
326  bool Hold(bool hold = true);
327 
332  bool Retrieve() { return Hold(false); }
333 
338  bool IsOnHold(
339  bool fromRemote = false
340  ) const;
341 
374  bool Transfer(
375  const PString & address,
376  OpalConnection * connection = NULL
377  );
379 
391  const OpalConnection & connection
392  );
393 
402  virtual void AdjustMediaFormats(
403  bool local,
404  const OpalConnection & connection,
405  OpalMediaFormatList & mediaFormats
406  ) const;
407 
417  virtual bool OpenSourceMediaStreams(
418  OpalConnection & connection,
419  const OpalMediaType & mediaType,
420  unsigned sessionID = 0,
421  const OpalMediaFormat & preselectedFormat = OpalMediaFormat(),
422 #if OPAL_VIDEO
423  OpalVideoFormat::ContentRole contentRole = OpalVideoFormat::eNoRole,
424 #endif
425  bool transfer = false,
426  bool startPaused = false
427  );
428 
433  virtual bool SelectMediaFormats(
434  const OpalMediaType & mediaType,
435  const OpalMediaFormatList & srcFormats,
436  const OpalMediaFormatList & dstFormats,
437  const OpalMediaFormatList & masterFormats,
438  OpalMediaFormat & srcFormat,
439  OpalMediaFormat & dstFormat
440  ) const;
441 
444  virtual void CloseMediaStreams();
445 
446 #if OPAL_STATISTICS
447  bool GetStatistics(
449  const OpalMediaType & mediaType,
450  bool fromAparty,
451  OpalMediaStatistics & statistics
452  );
453 #endif // OPAL_STATISTICS
454 
455 
463  virtual void OnUserInputString(
464  OpalConnection & connection,
465  const PString & value
466  );
467 
484  virtual void OnUserInputTone(
485  OpalConnection & connection,
486  char tone,
487  int duration
488  );
490 
495  OpalManager & GetManager() const { return m_manager; }
496 
499  const PString & GetToken() const { return m_token; }
500 
505  const PString & GetPartyA() const { return m_partyA; }
506 
512  const PString & GetPartyB() const { return m_partyB; }
513 
519  void SetPartyB(
520  const PString & b
521  ) { m_partyB = b; }
522 
527  const PString & GetNameA() const { return m_nameA; }
528 
534  const PString & GetNameB() const { return m_nameB; }
535 
540  const PString & GetIdentityA() const { return m_identityA; }
541 
547  const PString & GetIdentityB() const { return m_identityB; }
548 
553  bool IsNetworkOriginated() const { return m_networkOriginated; }
554 
557  const PString & GetRemoteParty() const { return m_networkOriginated ? m_partyA : m_partyB; }
558 
561  const PString & GetLocalParty() const { return m_networkOriginated ? m_partyB : m_partyA; }
562 
565  const PString & GetRemoteName() const { return m_networkOriginated ? m_nameA : m_nameB; }
566 
569  const PString & GetLocalName() const { return m_networkOriginated ? m_nameB : m_nameA; }
570 
573  const PTime & GetStartTime() const { return m_startTime; }
574 
577  const PTime & GetEstablishedTime() const { return m_establishedTime; }
579 
580 #if OPAL_HAS_MIXER
581 
586  bool StartRecording(
587  const PFilePath & filename,
588  const OpalRecordManager::Options & options = false
589  );
590 
602  bool StartRecording(
603  const PDirectory & outputDir,
604  const PString & fileTemplate,
605  const PString & fileType,
606  const OpalRecordManager::Options & options = false
607  );
608 
611  bool IsRecording() const;
612 
616  bool StopRecording();
617 
620  virtual bool OnStartRecording(
621  const PString & streamId,
622  const OpalMediaFormat & format
623  );
624 
627  virtual void OnStopRecording(
628  const PString & streamId
629  );
630 
633  virtual void OnRecordAudio(
634  const PString & streamId,
635  const RTP_DataFrame & frame
636  );
637 
638 #if OPAL_VIDEO
639 
641  virtual void OnRecordVideo(
642  const PString & streamId,
643  const RTP_DataFrame & frame
644  );
645 #endif
646 #endif // OPAL_HAS_MIXER
647 
648  void InternalOnClear();
649 
650  void SetPartyNames();
651 
652 #if OPAL_T38_CAPABILITY
653  bool IsSwitchingT38() const { return m_T38SwitchState != e_NotSwitchingT38; }
654  bool IsSwitchingToT38() const { return m_T38SwitchState == e_SwitchingToT38; }
655  void ResetSwitchingT38() { m_T38SwitchState = e_NotSwitchingT38; }
656  void SetSwitchingT38(bool to) { m_T38SwitchState = to ? e_SwitchingToT38 : e_SwitchingFromT38; }
657 #endif
658 
659  protected:
661  PSafePtr<OpalConnection> & connection,
662  PSafetyMode mode,
663  const OpalConnection * skipConnection = NULL
664  ) const;
665 
667 
668  PString m_token;
669 
670  PString m_partyA;
671  PString m_partyB;
672  PString m_nameA;
673  PString m_nameB;
674  PString m_identityA;
675  PString m_identityB;
677  PTime m_startTime;
682  atomic<bool> m_isCleared;
683 
685  PCriticalSection m_callEndReasonMutex;
686  std::list<PSyncPoint *> m_endCallSyncPoint;
687 
688  PSafeArray<OpalConnection> m_connectionsActive;
689 
690 #if OPAL_HAS_MIXER
692 #endif
693 
694 #if OPAL_SCRIPT
695  PDECLARE_ScriptFunctionNotifier(OpalCall, ScriptClear);
696 #endif
697 
698 #if OPAL_T38_CAPABILITY
699  enum {
700  e_NotSwitchingT38,
701  e_SwitchingToT38,
702  e_SwitchingFromT38
703  } m_T38SwitchState;
704 #endif
705 
706  //use to add the connection to the call's connection list
707  friend OpalConnection::OpalConnection(OpalCall &, OpalEndPoint &, const PString &, unsigned int, OpalConnection::StringOptions *);
708  //use to remove the connection from the call's connection list
710 
711  P_REMOVE_VIRTUAL_VOID(OnRTPStatistics(const OpalConnection &, const OpalRTPSession &));
712 };
713 
714 
715 #endif // OPAL_OPAL_CALL_H
716 
717 
718 // End of File ///////////////////////////////////////////////////////////////
OpalConnection::CallEndReason m_callEndReason
Definition: call.h:684
virtual void OnProceeding(OpalConnection &connection)
virtual bool OnStartRecording(const PString &streamId, const OpalMediaFormat &format)
PString m_partyA
Definition: call.h:670
Definition: manager.h:150
Definition: endpoint.h:65
const PString & GetRemoteName() const
Definition: call.h:565
OpalRecordManager * m_recordManager
Definition: call.h:691
virtual OpalConnection::AnswerCallResponse OnAnswerCall(OpalConnection &connection, const PString &caller)
PTime m_establishedTime
Definition: call.h:678
const PString & GetLocalName() const
Definition: call.h:569
OpalManager & m_manager
Definition: call.h:666
PINDEX GetConnectionCount() const
Definition: call.h:293
const PString & GetPartyB() const
Definition: call.h:512
virtual PBoolean OnSetUp(OpalConnection &connection)
bool Transfer(const PString &address, OpalConnection *connection=NULL)
PTime m_startTime
Definition: call.h:677
virtual void CloseMediaStreams()
const PString & GetToken() const
Definition: call.h:499
std::list< PSyncPoint * > m_endCallSyncPoint
Definition: call.h:686
void SetPartyB(const PString &b)
Definition: call.h:519
bool EnumerateConnections(PSafePtr< OpalConnection > &connection, PSafetyMode mode, const OpalConnection *skipConnection=NULL) const
Definition: mediatype.h:66
bool IsNetworkOriginated() const
Definition: call.h:553
bool Hold(bool hold=true)
OpalConnection(OpalCall &call, OpalEndPoint &endpoint, const PString &token, unsigned options=0, OpalConnection::StringOptions *stringOptions=NULL)
PSafePtr< OpalConnection > GetOtherPartyConnection(const OpalConnection &connection) const
PString m_identityB
Definition: call.h:675
P_REMOVE_VIRTUAL_VOID(OnRTPStatistics(const OpalConnection &, const OpalRTPSession &))
virtual void AdjustMediaFormats(bool local, const OpalConnection &connection, OpalMediaFormatList &mediaFormats) const
virtual PBoolean OnConnected(OpalConnection &connection)
const PString & GetIdentityA() const
Definition: call.h:540
void SetPartyNames()
bool StartRecording(const PFilePath &filename, const OpalRecordManager::Options &options=false)
const PString & GetIdentityB() const
Definition: call.h:547
PString m_nameA
Definition: call.h:672
Definition: mediafmt.h:112
bool StopRecording()
Definition: connection.h:530
PSafePtr< OpalConnection > GetConnection(PINDEX idx, PSafetyMode mode=PSafeReference)
Definition: call.h:297
PString GetCallEndReasonText() const
Definition: call.h:118
OpalCall(OpalManager &manager)
Definition: rtp.h:540
virtual bool OpenSourceMediaStreams(OpalConnection &connection, const OpalMediaType &mediaType, unsigned sessionID=0, const OpalMediaFormat &preselectedFormat=OpalMediaFormat(), OpalVideoFormat::ContentRole contentRole=OpalVideoFormat::eNoRole, bool transfer=false, bool startPaused=false)
const PTime & GetEstablishedTime() const
Definition: call.h:577
PString GetCallEndReasonText() const
Definition: connection.h:648
Definition: mediafmt.h:806
PString m_identityA
Definition: call.h:674
Definition: call.h:62
virtual void OnEstablishedCall()
bool Retrieve()
Definition: call.h:332
virtual void OnCleared()
PBoolean IsEstablished() const
Definition: call.h:94
PString m_nameB
Definition: call.h:673
const PString & GetPartyA() const
Definition: call.h:505
Definition: rtp_session.h:90
const PString & GetNameB() const
Definition: call.h:534
virtual OpalMediaFormatList GetMediaFormats(const OpalConnection &connection)
void PrintOn(ostream &strm) const
bool m_networkOriginated
Definition: call.h:676
bool m_isEstablished
Definition: call.h:679
virtual void OnRecordAudio(const PString &streamId, const RTP_DataFrame &frame)
virtual bool SelectMediaFormats(const OpalMediaType &mediaType, const OpalMediaFormatList &srcFormats, const OpalMediaFormatList &dstFormats, const OpalMediaFormatList &masterFormats, OpalMediaFormat &srcFormat, OpalMediaFormat &dstFormat) const
void InternalOnClear()
PCriticalSection m_callEndReasonMutex
Definition: call.h:685
virtual PBoolean OnEstablished(OpalConnection &connection)
const PString & GetRemoteParty() const
Definition: call.h:557
bool GetStatistics(const OpalMediaType &mediaType, bool fromAparty, OpalMediaStatistics &statistics)
Get media statistics of the type, received from the specified party.
bool IsRecording() const
void Clear(OpalConnection::CallEndReason reason=OpalConnection::EndedByLocalUser, PSyncPoint *sync=NULL)
PString m_token
Definition: call.h:668
Definition: connection.h:462
PString m_partyB
Definition: call.h:671
PSafeArray< OpalConnection > m_connectionsActive
Definition: call.h:688
virtual void OnAlerting(OpalConnection &connection, bool withMedia)
virtual void OnUserInputString(OpalConnection &connection, const PString &value)
bool m_isClearing
Definition: call.h:680
OpalConnection::CallEndReason GetCallEndReason() const
Definition: recording.h:49
Definition: connection.h:415
virtual void OnRecordVideo(const PString &streamId, const RTP_DataFrame &frame)
virtual void OnHold(OpalConnection &connection, bool fromRemote, bool onHold)
const PString & GetNameA() const
Definition: call.h:527
const PTime & GetStartTime() const
Definition: call.h:573
Definition: mediasession.h:210
bool IsOnHold(bool fromRemote=false) const
OpalManager & GetManager() const
Definition: call.h:495
virtual void OnUserInputTone(OpalConnection &connection, char tone, int duration)
virtual void OnReleased(OpalConnection &connection)
atomic< bool > m_isCleared
Definition: call.h:682
void SetCallEndReason(OpalConnection::CallEndReason reason)
virtual void OnNewConnection(OpalConnection &connection)
virtual void OnStopRecording(const PString &streamId)
PSafePtr< ConnClass > GetConnectionAs(PINDEX count=0, PSafetyMode mode=PSafeReadWrite)
Definition: call.h:306
const PString & GetLocalParty() const
Definition: call.h:561
Definition: recording.h:84
bool m_handlingHold
Definition: call.h:681