00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef OPAL_OPAL_CALL_H
00033 #define OPAL_OPAL_CALL_H
00034
00035 #ifdef P_USE_PRAGMA
00036 #pragma interface
00037 #endif
00038
00039 #include <opal/buildopts.h>
00040
00041 #include <opal/connection.h>
00042 #include <opal/recording.h>
00043 #include <opal/guid.h>
00044
00045 #include <ptlib/safecoll.h>
00046
00047
00048 class OpalManager;
00049
00050
00065 class OpalCall : public PSafeObject
00066 {
00067 PCLASSINFO(OpalCall, PSafeObject);
00068 public:
00073 OpalCall(
00074 OpalManager & manager
00075 );
00076
00079 ~OpalCall();
00081
00088 void PrintOn(
00089 ostream & strm
00090 ) const;
00092
00097 PBoolean IsEstablished() const { return isEstablished; }
00098
00107 virtual void OnEstablishedCall();
00108
00117 OpalConnection::CallEndReason GetCallEndReason() const { return callEndReason; }
00118
00121 PString GetCallEndReasonText() const { return OpalConnection::GetCallEndReasonText(callEndReason); }
00122
00127 void SetCallEndReason(
00128 OpalConnection::CallEndReason reason
00129 );
00130
00139 void Clear(
00140 OpalConnection::CallEndReason reason = OpalConnection::EndedByLocalUser,
00141 PSyncPoint * sync = NULL
00142 );
00143
00149 virtual void OnCleared();
00151
00159 virtual void OnNewConnection(
00160 OpalConnection & connection
00161 );
00162
00168 virtual PBoolean OnSetUp(
00169 OpalConnection & connection
00170 );
00171
00186 virtual void OnProceeding(
00187 OpalConnection & connection
00188 );
00189
00206 virtual PBoolean OnAlerting(
00207 OpalConnection & connection
00208 );
00209
00226 virtual OpalConnection::AnswerCallResponse OnAnswerCall(
00227 OpalConnection & connection,
00228 const PString & caller
00229 );
00230
00242 virtual PBoolean OnConnected(
00243 OpalConnection & connection
00244 );
00245
00260 virtual PBoolean OnEstablished(
00261 OpalConnection & connection
00262 );
00263
00269 virtual void OnReleased(
00270 OpalConnection & connection
00271 );
00272
00279 virtual void OnHold(
00280 OpalConnection & connection,
00281 bool fromRemote,
00282 bool onHold
00283 );
00284
00290 PSafePtr<OpalConnection> GetOtherPartyConnection(
00291 const OpalConnection & connection
00292 ) const;
00293
00296 PSafePtr<OpalConnection> GetConnection(
00297 PINDEX idx,
00298 PSafetyMode mode = PSafeReference
00299 ) { return connectionsActive.GetAt(idx, mode); }
00300
00304 template <class ConnClass>
00305 PSafePtr<ConnClass> GetConnectionAs(
00306 PINDEX count = 0,
00307 PSafetyMode mode = PSafeReadWrite
00308 )
00309 {
00310 PSafePtr<ConnClass> connection;
00311 for (PSafePtr<OpalConnection> iterConn(connectionsActive, PSafeReference); iterConn != NULL; ++iterConn) {
00312 if ((connection = PSafePtrCast<OpalConnection, ConnClass>(iterConn)) != NULL && count-- == 0) {
00313 if (!connection.SetSafetyMode(mode))
00314 connection.SetNULL();
00315 break;
00316 }
00317 }
00318 return connection;
00319 }
00320
00325 bool Hold();
00326
00331 bool Retrieve();
00332
00337 bool IsOnHold() const;
00338
00371 bool Transfer(
00372 const PString & address,
00373 OpalConnection * connection = NULL
00374 );
00376
00387 virtual OpalMediaFormatList GetMediaFormats(
00388 const OpalConnection & connection
00389 );
00390
00399 virtual void AdjustMediaFormats(
00400 bool local,
00401 const OpalConnection & connection,
00402 OpalMediaFormatList & mediaFormats
00403 ) const;
00404
00414 virtual bool OpenSourceMediaStreams(
00415 OpalConnection & connection,
00416 const OpalMediaType & mediaType,
00417 unsigned sessionID = 0,
00418 const OpalMediaFormat & preselectedFormat = OpalMediaFormat()
00419 #if OPAL_VIDEO
00420 , OpalVideoFormat::ContentRole contentRole = OpalVideoFormat::eNoRole
00421 #endif
00422 );
00423
00428 virtual bool SelectMediaFormats(
00429 const OpalMediaType & mediaType,
00430 const OpalMediaFormatList & srcFormats,
00431 const OpalMediaFormatList & dstFormats,
00432 const OpalMediaFormatList & allFormats,
00433 OpalMediaFormat & srcFormat,
00434 OpalMediaFormat & dstFormat
00435 ) const;
00436
00444 virtual void OnRTPStatistics(
00445 const OpalConnection & connection,
00446 const RTP_Session & session
00447 );
00448
00451 virtual void StartMediaStreams();
00452
00455 virtual void CloseMediaStreams();
00456
00459 virtual PBoolean IsMediaBypassPossible(
00460 const OpalConnection & connection,
00461 unsigned sessionID
00462 ) const;
00464
00472 virtual void OnUserInputString(
00473 OpalConnection & connection,
00474 const PString & value
00475 );
00476
00485 virtual void OnUserInputTone(
00486 OpalConnection & connection,
00487 char tone,
00488 int duration
00489 );
00491
00496 OpalManager & GetManager() const { return manager; }
00497
00500 const PString & GetToken() const { return myToken; }
00501
00506 const PString & GetPartyA() const { return m_partyA; }
00507
00513 const PString & GetPartyB() const { return m_partyB; }
00514
00520 void SetPartyB(
00521 const PString & b
00522 ) { m_partyB = b; }
00523
00528 bool IsNetworkOriginated() const;
00529
00532 const PTime & GetStartTime() const { return startTime; }
00534
00535 #if OPAL_HAS_MIXER
00536
00541 bool StartRecording(
00542 const PFilePath & filename,
00543 const OpalRecordManager::Options & options = false
00544 );
00545
00548 bool IsRecording() const;
00549
00553 void StopRecording();
00554
00557 virtual bool OnStartRecording(
00558 const PString & streamId,
00559 const OpalMediaFormat & format
00560 );
00561
00564 virtual void OnStopRecording(
00565 const PString & streamId
00566 );
00567
00570 virtual void OnRecordAudio(
00571 const PString & streamId,
00572 const RTP_DataFrame & frame
00573 );
00574
00575 #if OPAL_VIDEO
00576
00578 virtual void OnRecordVideo(
00579 const PString & streamId,
00580 const RTP_DataFrame & frame
00581 );
00582 #endif
00583 #endif // OPAL_HAS_MIXER
00584
00585 void InternalOnClear();
00586
00587 void SetPartyNames();
00588
00589 protected:
00590 bool EnumerateConnections(
00591 PSafePtr<OpalConnection> & connection,
00592 PSafetyMode mode,
00593 const OpalConnection * skipConnection = NULL
00594 ) const;
00595
00596 OpalManager & manager;
00597
00598 PString myToken;
00599
00600 PString m_partyA;
00601 PString m_partyB;
00602 PTime startTime;
00603 bool isEstablished;
00604 bool isClearing;
00605 PAtomicBoolean m_isCleared;
00606
00607 OpalConnection::CallEndReason callEndReason;
00608 std::list<PSyncPoint *> m_endCallSyncPoint;
00609
00610 PSafeList<OpalConnection> connectionsActive;
00611
00612 #if OPAL_HAS_MIXER
00613 OpalRecordManager * m_recordManager;
00614 #endif
00615
00616
00617 friend OpalConnection::OpalConnection(OpalCall &, OpalEndPoint &, const PString &, unsigned int, OpalConnection::StringOptions *);
00618
00619 friend OpalConnection::~OpalConnection();
00620 };
00621
00622
00623 #endif // OPAL_OPAL_CALL_H
00624
00625
00626