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/guid.h>
00043
00044 #include <ptlib/safecoll.h>
00045
00046
00047 class OpalManager;
00048
00049
00064 class OpalCall : public PSafeObject
00065 {
00066 PCLASSINFO(OpalCall, PSafeObject);
00067 public:
00072 OpalCall(
00073 OpalManager & manager
00074 );
00075
00078 ~OpalCall();
00080
00087 void PrintOn(
00088 ostream & strm
00089 ) const;
00091
00096 PBoolean IsEstablished() const { return isEstablished; }
00097
00106 virtual void OnEstablishedCall();
00107
00116 OpalConnection::CallEndReason GetCallEndReason() const { return callEndReason; }
00117
00122 void SetCallEndReason(
00123 OpalConnection::CallEndReason reason
00124 );
00125
00134 void Clear(
00135 OpalConnection::CallEndReason reason = OpalConnection::EndedByLocalUser,
00136 PSyncPoint * sync = NULL
00137 );
00138
00144 virtual void OnCleared();
00146
00154 virtual void OnNewConnection(
00155 OpalConnection & connection
00156 );
00157
00163 virtual PBoolean OnSetUp(
00164 OpalConnection & connection
00165 );
00166
00181 virtual void OnProceeding(
00182 OpalConnection & connection
00183 );
00184
00201 virtual PBoolean OnAlerting(
00202 OpalConnection & connection
00203 );
00204
00221 virtual OpalConnection::AnswerCallResponse OnAnswerCall(
00222 OpalConnection & connection,
00223 const PString & caller
00224 );
00225
00237 virtual PBoolean OnConnected(
00238 OpalConnection & connection
00239 );
00240
00255 virtual PBoolean OnEstablished(
00256 OpalConnection & connection
00257 );
00258
00264 virtual void OnReleased(
00265 OpalConnection & connection
00266 );
00267
00274 virtual void OnHold(
00275 OpalConnection & connection,
00276 bool fromRemote,
00277 bool onHold
00278 );
00279
00285 PSafePtr<OpalConnection> GetOtherPartyConnection(
00286 const OpalConnection & connection
00287 ) const;
00288
00291 PSafePtr<OpalConnection> GetConnection(
00292 PINDEX idx,
00293 PSafetyMode mode = PSafeReference
00294 ) { return connectionsActive.GetAt(idx, mode); }
00295
00299 template <class ConnClass>
00300 PSafePtr<ConnClass> GetConnectionAs(
00301 PINDEX count = 0,
00302 PSafetyMode mode = PSafeReadWrite
00303 )
00304 {
00305 PSafePtr<ConnClass> connection;
00306 for (PSafePtr<OpalConnection> iterConn(connectionsActive, PSafeReference); iterConn != NULL; ++iterConn) {
00307 if ((connection = PSafePtrCast<OpalConnection, ConnClass>(iterConn)) != NULL && count-- == 0) {
00308 if (!connection.SetSafetyMode(mode))
00309 connection.SetNULL();
00310 break;
00311 }
00312 }
00313 return connection;
00314 }
00315
00318 bool Hold();
00319
00322 bool Retrieve();
00323
00326 bool IsOnHold() const;
00327
00337 bool Transfer(
00338 OpalConnection & connection,
00339 const PString & newAddress
00340 );
00342
00353 virtual OpalMediaFormatList GetMediaFormats(
00354 const OpalConnection & connection,
00355 PBoolean includeSpecifiedConnection
00356 );
00357
00367 virtual bool OpenSourceMediaStreams(
00368 OpalConnection & connection,
00369 const OpalMediaType & mediaType,
00370 unsigned sessionID = 0,
00371 const OpalMediaFormat & preselectedFormat = OpalMediaFormat()
00372 );
00373
00378 virtual bool SelectMediaFormats(
00379 const OpalMediaFormatList & srcFormats,
00380 const OpalMediaFormatList & dstFormats,
00381 const OpalMediaFormatList & allFormats,
00382 OpalMediaFormat & srcFormat,
00383 OpalMediaFormat & dstFormat
00384 ) const;
00385
00393 virtual void OnRTPStatistics(
00394 const OpalConnection & connection,
00395 const RTP_Session & session
00396 );
00397
00400 virtual void CloseMediaStreams();
00401
00404 virtual PBoolean IsMediaBypassPossible(
00405 const OpalConnection & connection,
00406 unsigned sessionID
00407 ) const;
00409
00417 virtual void OnUserInputString(
00418 OpalConnection & connection,
00419 const PString & value
00420 );
00421
00430 virtual void OnUserInputTone(
00431 OpalConnection & connection,
00432 char tone,
00433 int duration
00434 );
00436
00441 OpalManager & GetManager() const { return manager; }
00442
00445 const PString & GetToken() const { return myToken; }
00446
00451 const PString & GetPartyA() const { return m_partyA; }
00452
00458 const PString & GetPartyB() const { return m_partyB; }
00459
00465 void SetPartyB(
00466 const PString & b
00467 ) { m_partyB = b; }
00468
00473 bool IsNetworkOriginated() const;
00474
00477 const PTime & GetStartTime() const { return startTime; }
00479
00480
00486 bool StartRecording(
00487 const PFilePath & filename,
00488 bool mono = false
00489 );
00490
00493 bool IsRecording() const;
00494
00498 void StopRecording();
00499
00502 virtual void OnRecordAudio(const PString & streamId, const RTP_DataFrame & frame);
00503
00506 virtual void OnStopRecordAudio(const PString & streamId);
00507
00508 protected:
00509 void SetPartyNames();
00510
00511 bool EnumerateConnections(
00512 PSafePtr<OpalConnection> & connection,
00513 PSafetyMode mode,
00514 const OpalConnection * skipConnection = NULL
00515 ) const;
00516
00517 OpalManager & manager;
00518
00519 PString myToken;
00520
00521 PString m_partyA;
00522 PString m_partyB;
00523 PTime startTime;
00524 bool isEstablished;
00525 bool isClearing;
00526
00527 OpalConnection::CallEndReason callEndReason;
00528
00529 PSafeList<OpalConnection> connectionsActive;
00530
00531 PSyncPoint * endCallSyncPoint;
00532
00533
00534
00535 friend OpalConnection::OpalConnection(OpalCall &, OpalEndPoint &, const PString &, unsigned int, OpalConnection::StringOptions *);
00536
00537 friend OpalConnection::~OpalConnection();
00538 };
00539
00540
00541 #endif // OPAL_OPAL_CALL_H
00542
00543
00544