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_CALL_H
00033 #define __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
00172 virtual PBoolean OnAlerting(
00173 OpalConnection & connection
00174 );
00175
00192 virtual OpalConnection::AnswerCallResponse OnAnswerCall(
00193 OpalConnection & connection,
00194 const PString & caller
00195 );
00196
00208 virtual PBoolean OnConnected(
00209 OpalConnection & connection
00210 );
00211
00226 virtual PBoolean OnEstablished(
00227 OpalConnection & connection
00228 );
00229
00235 virtual void OnReleased(
00236 OpalConnection & connection
00237 );
00238
00245 virtual void OnHold(
00246 OpalConnection & connection,
00247 bool fromRemote,
00248 bool onHold
00249 );
00250
00256 PSafePtr<OpalConnection> GetOtherPartyConnection(
00257 const OpalConnection & connection
00258 ) const;
00259
00262 PSafePtr<OpalConnection> GetConnection(
00263 PINDEX idx,
00264 PSafetyMode mode = PSafeReference
00265 ) { return connectionsActive.GetAt(idx, mode); }
00266
00270 template <class ConnClass>
00271 PSafePtr<ConnClass> GetConnectionAs(
00272 PINDEX count = 0,
00273 PSafetyMode mode = PSafeReadWrite
00274 )
00275 {
00276 PSafePtr<ConnClass> connection;
00277 for (PSafePtr<OpalConnection> iterConn(connectionsActive, PSafeReference); iterConn != NULL; ++iterConn) {
00278 if ((connection = PSafePtrCast<OpalConnection, ConnClass>(iterConn)) != NULL && count-- == 0) {
00279 if (!connection.SetSafetyMode(mode))
00280 connection.SetNULL();
00281 break;
00282 }
00283 }
00284 return connection;
00285 }
00286
00289 bool Hold();
00290
00293 bool Retrieve();
00294
00297 bool IsOnHold() const;
00298
00308 bool Transfer(
00309 OpalConnection & connection,
00310 const PString & newAddress
00311 );
00313
00324 virtual OpalMediaFormatList GetMediaFormats(
00325 const OpalConnection & connection,
00326 PBoolean includeSpecifiedConnection
00327 );
00328
00338 virtual bool OpenSourceMediaStreams(
00339 OpalConnection & connection,
00340 const OpalMediaType & mediaType,
00341 unsigned sessionID = 0,
00342 const OpalMediaFormat & preselectedFormat = OpalMediaFormat()
00343 );
00344
00349 virtual bool SelectMediaFormats(
00350 const OpalMediaFormatList & srcFormats,
00351 const OpalMediaFormatList & dstFormats,
00352 const OpalMediaFormatList & allFormats,
00353 OpalMediaFormat & srcFormat,
00354 OpalMediaFormat & dstFormat
00355 ) const;
00356
00364 virtual void OnRTPStatistics(
00365 const OpalConnection & connection,
00366 const RTP_Session & session
00367 );
00368
00371 virtual void CloseMediaStreams();
00372
00375 virtual PBoolean IsMediaBypassPossible(
00376 const OpalConnection & connection,
00377 unsigned sessionID
00378 ) const;
00380
00388 virtual void OnUserInputString(
00389 OpalConnection & connection,
00390 const PString & value
00391 );
00392
00401 virtual void OnUserInputTone(
00402 OpalConnection & connection,
00403 char tone,
00404 int duration
00405 );
00407
00412 OpalManager & GetManager() const { return manager; }
00413
00416 const PString & GetToken() const { return myToken; }
00417
00422 const PString & GetPartyA() const { return m_partyA; }
00423
00429 const PString & GetPartyB() const { return m_partyB; }
00430
00436 void SetPartyB(
00437 const PString & b
00438 ) { m_partyB = b; }
00439
00444 bool IsNetworkOriginated() const;
00445
00448 const PTime & GetStartTime() const { return startTime; }
00450
00451 virtual PBoolean StartRecording(const PFilePath & fn);
00452 virtual bool IsRecording() const;
00453 virtual void StopRecording();
00454 void OnStopRecordAudio(const PString & callToken);
00455
00456 protected:
00457 void SetPartyNames();
00458
00459 bool EnumerateConnections(
00460 PSafePtr<OpalConnection> & connection,
00461 PSafetyMode mode,
00462 const OpalConnection * skipConnection = NULL
00463 ) const;
00464
00465 OpalManager & manager;
00466
00467 PString myToken;
00468
00469 PString m_partyA;
00470 PString m_partyB;
00471 PTime startTime;
00472 bool isEstablished;
00473 bool isClearing;
00474
00475 OpalConnection::CallEndReason callEndReason;
00476
00477 PSafeList<OpalConnection> connectionsActive;
00478
00479 PSyncPoint * endCallSyncPoint;
00480
00481
00482
00483 friend OpalConnection::OpalConnection(OpalCall &, OpalEndPoint &, const PString &, unsigned int, OpalConnection::StringOptions *);
00484
00485 friend OpalConnection::~OpalConnection();
00486 };
00487
00488
00489 #endif // __OPAL_CALL_H
00490
00491
00492