This file is indexed.

/usr/include/sipxtapi/ptapi/PtCall.h is in libsipxtapi-dev 3.3.0~test17-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
//
// Copyright (C) 2004-2006 SIPfoundry Inc.
// Licensed by SIPfoundry under the LGPL license.
//
// Copyright (C) 2004-2006 Pingtel Corp.  All rights reserved.
// Licensed to SIPfoundry under a Contributor Agreement.
//
// $$
///////////////////////////////////////////////////////////////////////////////

#ifndef _PtCall_h_
#define _PtCall_h_

// SYSTEM INCLUDES
// APPLICATION INCLUDES
#include <ptapi/PtDefs.h>
#include "os/OsBSem.h"
#include "os/OsProtectEventMgr.h"
#include "cp/CpCallManager.h"

// DEFINES
// MACROS
// EXTERNAL FUNCTIONS
// EXTERNAL VARIABLES
// CONSTANTS
// STRUCTS
// TYPEDEFS
// FORWARD DECLARATIONS
class PtAddress;
class PtCallListener;
class PtConnection;
class PtProvider;
class PtSessionDesc;
class PtTerminal;
class PtTerminalConnection;
class TaoClientTask;
class TaoServerTask;
class TaoReference;
class TaoObjectMap;

//:A PtCall object models a telephone call.
// A call can have zero or more connections. A two-party call has two
// connections, and a conference call has three or more connections.
// Each connection models the relationship between a call and an address,
// where an address identifies a particular party or set of parties on a
// call.
//
// <H3>Creating PtCall Objects</H3>
// Applications create instances of a PtCall object with the
// PtProvider.createCall() method, which returns a pointer to a PtCall
// object that has zero PtConnections and is in the PtCall::IDLE state.
// The PtCall maintains a reference to its provider for the life of that
// PtCall object. The PtProvider associated with a PtCall is obtained
// via the PtCall.getProvider() method.
//
// <H3>Call States</H3>
// A PtCall has a state that is obtained via the PtCall.getState() method.
// This state describes the current progress of a telephone call, where it is
// in its life cycle, and how many connections exist on the call. The PtCall
// state may be one of three values: PtCall::IDLE, PtCall::ACTIVE, or
// PtCall::INVALID. A description of each state follows.<br>
// <br>
// <dl>
// <dt><b>PtCall::IDLE</b></dt>
// <dd>This is the initial state for all calls. In this state, the call has
// zero connections; that is, PtCall.getConnections() must return an empty
// array.</dd>
// <br>
// <dt><b>PtCall::ACTIVE</b></dt>
// <dd>A call with some current ongoing activity is in this state. Calls with
// one or more associated connections must be in this state. If a call is
// in this state, the PtCall.getConnections() method must return an array
// containing at least one item.</dd>
// <br>
// <dt><b>PtCall::INVALID</b></dt>
// <dd>This is the final state for all calls. PtCall objects that lose all of
// their PtConnection objects (via a transition of the PtConnection object
// into the PtConnection::DISCONNECTED state) move into this state. Calls in
// this state have zero connections and these PtCall objects may not be used
// for any future action. In this state, the PtCall.getConnections() method
// must return an empty array. </dd>
// </dl>
// <H3>Calls and Connections</H3>
// A PtCall maintains a list of the PtConnections on that call. Applications
// obtain an array of PtConnection pointers associated with the call via the
// PtCall.getConnections() method. A PtCall retains a reference to a
// PtConnection only if it is not in the PtConnection::DISCONNECTED state.
// Therefore, if a PtCall has a reference to a PtConnection, then that
// PtConnection must not be in the PtConnection::DISCONNECTED state. When a
// connection moves into the PtConnection::DISCONNECTED state (e.g., when a
// party hangs up), the PtCall loses its reference to that PtConnection, which
// is then no longer reported via the PtCall.getConnections() method.
//
// <H3>Call Information methods</H3>
// The PtCall class provides methods that return the calling address, calling
// terminal, called address, and last redirected address information.  These
// methods only make sense for a two-party call.<br> <br>
// <ul>
// <li>The <b>calling address</b>, as returned by the PtCall.getCallingAddress()
// method, is the PtAddress that originally placed the PtCall. </li><br>
// <br>
// <li>The <b>calling terminal</b>, as returned by the PtCall.getCallingTerminal()
// method, is the PtTerminal which originally placed the PtCall. </li><br>
// <br>
// <li>The <b>called address</b>, as returned by the PtCall.getCalledAddress()
// method, is the PtAddress to which the PtCall was originally placed. </li><br>
// <br>
// <li>The <b>last redirected address</b>, as returned by the
// PtCall.getLastRedirectedAddress() method, is the PtAddress to which this
// PtCall was placed before the current destination address. For example, if
// a PtCall was forwarded from one PtAddress to another, then the first
// PtAddress is the last redirected PtAddress for this call.</li></ul>
// <p>
// Each of these methods returns NULL if their values are unknown at the
// present time. During the lifetime of a PtCall, an implementation may
// learn this additional information and, as a result, return different values
// for some or all of these methods.
//
// <H3>Conferencing Telephone Calls</H3>
// The conferencing feature supported by this interface permits two telephone
// calls to be "merged". That is, two PtCalls are merged into a single
// PtCall with the union of all of the participants of the two PtCalls being
// placed on the single PtCall.
// <p>
// Applications invoke the PtCall.conference() method to perform the
// conferencing feature. This method is given the "second" PtCall as an
// argument. All participants are moved from the second PtCall to the PtCall
// on which the method is invoked.  The second PtCall moves into the
// PtCall::INVALID state as a result.
// <p>
// In order for the conferencing feature to happen, there must be a common
// participant in both PtCalls, as represented by a single PtTerminal and
// two PtTerminalConnections, one on each of the two PtCalls. These two
// PtTerminalConnections are known as the conference controllers. In the
// real world, one of the two telephone calls must be on hold with respect
// to the controlling PtTerminal, and hence, the PtTerminalConnection on
// the second PtCall must be in the PtTerminalConnection::HELD state. The
// two conference controlling PtTerminalConnections are merged into one as
// a result of this method.
// <p>
// Applications may control which PtTerminalConnection acts as the
// conference controller via the PtCall.setConferenceController() method.
// The PtCall.getConferenceController() method returns the current
// conference controller, or NULL if there is none. If no conference
// controller is set, the implementation chooses a suitable
// PtTerminalConnection when the conferencing feature is invoked.
//
// <H3>Transferring Telephone Calls</H3>
// The transfer feature supported by this interface permits one PtCall to
// be "moved" to another PtCall. That is, all of the participants from
// one PtCall are moved to another PtCall, except for the transferring
// participant which drops off from both PtCalls.
// <p>
// Applications invoke the PtCall.transfer() method to perform the transfer
// feature. There are two overloaded versions of this method: <br>
// <ul>
// <li>The first
// method takes a second PtCall as an argument. This method acts similarly
// to PtCall.conference(), except the two PtTerminalConnections on each
// PtCall with a common PtTerminal are removed from both PtCalls. </li>
// <br>
// <li>The second
// version takes a telephone address URL as an argument. This method
// removes the transfer controller participant while placing the telephone
// call to the designated address. This version of the transfer
// feature is often known as a single-step transfer. </li>
// </ul>
// <p>
// In order for the transfer feature to happen, there must be a participant
// which acts as the transfer controller. The transfer controller is a
// PtTerminalConnection around which the transfer is performed. In the first
// version of the PtCall.transfer() method, the transfer controller must be
// present on each of the two PtCalls and share a common PtTerminal. In the
// second version, the transfer controller only applies to the PtCall object
// on which the method is invoked (since there is no second PtCall involved).
// In both cases, the transfer controller participant is no longer part of
// any PtCall once the transfer feature is complete.
// <p>
// Applications may control which PtTerminalConnection acts as the transfer
// controller via the PtCall.setTransferController() method. The
// PtCall.getTransferController() method returns the current transfer
// controller, or NULL if there is none. If no transfer controller is set,
// the implementation chooses a suitable PtTerminalConnection when the
// conferencing feature is invoked.
//
// <H3>Consultation Calls</H3>
// Consultation calls are special types of telephony calls created (often
// temporarily) for a specific purpose. Consultation calls can be created if
// a user wants to "consult" with another party briefly while currently on
// a PtCall, or for the purpose of conferencing or transferring
// with a PtCall. Consequently, consultation calls are always associated
// with another existing PtCall.
// <p>
// Applications invoke the PtCall.consult() method to perform the
// consultation feature. The instance on which the method is invoked is
// always the "idle" PtCall on which the consultation takes place.
// This method takes a
// PtTerminalConnection and a string telephone address URL as arguments.
// This consultation telephone call is associated with the PtCall of the
// PtTerminalConnection argument. This method places a telephone call from
// the same originating endpoint specified by the PtTerminalConnection
// argument to the designated telephone address.
// <h3>
// Additional Methods</h3>
// The PtCall.addParty() method adds a single party to a PtCall given some
// telephone address URL. The PtCall.drop() method then disconnects all parties
// from the PtCall, and moves it into the PtCall::INVALID state.
//
// <H3>Listeners and Events</H3>
// All events pertaining to a PtCall object are reported via
// PtCallListener objects. Applications instantiate an object that is
// derived from the PtCallListener class and use the PtCall.addCallListener()
// method to begin the delivery of events.
// <p>
// PtConnection-related and PtTerminalConnection-related events are also
// reported via the PtCallListener objects. These events include the creation
// of these objects and their state changes. Events that are reported by
// PtCallListener objects that pertain to PtConnections and
// PtTerminalConnections are instances of (or descendants of) the
// PtConnectionEvent class and the PtTerminalConnectionEvent class,
// respectively.
// <p>
// An event is delivered to the application whenever the state of the PtCall
// changes. The events corresponding to PtCall state changes are
// CALL_ACTIVE and CALL_INVALID.
//
// <H4>When Call Event Transmission Ends</H4>
// Applications receive events on a listener until the listener is removed
// or until the PtCall object is no longer observable. In these instances,
// each listener receives a CALL_EVENT_TRANSMISSION_ENDED event as its final
// event.
//
// <H4>Event Granularity</H4>
// An application may control the granularity of the events that are reported.
// Registering for the highest level (PtCallListener) will direct the
// implementation to send only PtCall-related events (including meta events).
// Registering as a listener at a lower level (PtConnectionListener or
// PtTerminalConnectionListener) directs the implementation to provide
// successively more detailed events.
//
// <H4>Registering Call Listeners via Address and Terminal</H4>
// Applications may also receive events about a call by adding a listener via
// the PtAddress or PtTerminal objects; this is done with the
// PtAddress.addCallListener()
// and PtTerminal.addCallListener() (and related) methods. These methods
// provide the ability for an application to receive call-related events when
// a PtCall contains a particular PtAddress or PtTerminal. In particular,
// methods exist to add a PtCallListener, PtConnectionListener and
// PtTerminalConnectionListener via PtAddress and PtTerminal.
// See the specifications for the PtAddress and PtTerminal classes for more
// details.

class PtCall
{
/* //////////////////////////// PUBLIC //////////////////////////////////// */
public:

   enum CallState
   {
      IDLE,
      ACTIVE,
      INVALID
   };

/* ============================ CREATORS ================================== */
        PtCall();
     //:Default constructor

        PtCall(TaoClientTask *pClient, const char* callId);

        PtCall(const char* callId);

        PtCall(const PtCall& rPtCall);
     //:Copy constructor (not implemented for this class)

      virtual
   ~PtCall();
     //:Destructor

/* ============================ MANIPULATORS ============================== */

   PtCall& operator=(const PtCall& rhs);
     //:Assignment operator (not implemented for this class)

   virtual PtStatus addCallListener(PtCallListener& rCallListener);
     //:Adds a listener to this call.
     //!param: (in) rCallListener - The listener to add to this call
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_EXISTS - <i>rCallListener</i> is already registered
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus addParty(const char* newPartyURL,
                     PtSessionDesc* pSessionDesc,
                     PtConnection& rConnection);
     //:Adds an additional party to an existing call.
     // This is sometimes called a "single-step conference" because a party
     // is conferenced directly into the call. The telephone address
     // provided as the <i>newPartyURL</i> argument must be valid.
     //!param: (in) newPartyURL - Address of the party to add to this call
     //!param: (in) pSessionDesc - Pointer to the requested attributes for the new connection or NULL to use defaults
     //!param: (out) rpConnection - Set to point to the PtConnection associated with the new party
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_INVALID_PARTY - Invalid <i>newPartyURL</i>
     //!retcode: PT_INVALID_STATE - The call is either not ACTIVE or has fewer than two ESTABLISHED PtConnections
     //!retcode: PT_RESOURCE_UNAVAILABLE - Insufficient resources
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus conference(PtCall& rOtherCall);
     //:Merges two PtCalls together, resulting in the union of the
     //:participants of both PtCalls being placed on a single PtCall.
     // If successful, all of the participants from <i>rOtherCall</i> will
     // be moved to the PtCall on which this method is invoked.
     //!param: (in) rOtherCall - The PtCall object whose participants will be moved to this PtCall
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_INVALID_ARGUMENT - The <i>rOtherCall</i> object is not valid for the conference
     //!retcode: PT_INVALID_STATE - The call is either not ACTIVE or the conference controllers are not in the proper state
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus connect(PtTerminal& rTerminal, PtAddress& rAddress,
                    const char* destinationURL, PtSessionDesc* pSessionDesc);
     //:Places a telephone call from an originating endpoint to a destination
     //:address URL.
     // The <i>pSessionDesc</i> argument points to an object containing the
     // attributes requested for the connection.
     //!param: (in) rTerminal - The originating terminal
     //!param: (in) rAddress - The originating address
     //!param: (in) destinationURL - The intended destination for the call
     //!param: (in) pSessionDesc - Pointer to the requested attributes for the new connection or NULL to use defaults
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_INVALID_ARGUMENT - Bad <i>rTerminal</i>, <i>rAddress</i> or <i>rSessionDesc</i> argument
     //!retcode: PT_INVALID_PARTY - Invalid <i>destinationURL</i>
     //!retcode: PT_RESOURCE_UNAVAILABLE - Insufficient resources
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus consult(PtTerminalConnection& rTerminalConnection,
                    const char* destinationURL,
                    PtSessionDesc* pSessionDesc,
                    PtConnection& rSrcConnection,
                    PtConnection& rDstConnection);
     //:Creates a new call between the PtTerminal associated with
     //:<i>rTerminalConnection</i> and the destination indicated by
     //:<i>destinationURL</i>.
     //!param: (in) rTerminalConnection - The terminal connection used to obtain the originating terminal
     //!param: (in) destinationURL - The intended destination for the new call
     //!param: (in) pSessionDesc - Pointer to the requested attributes for the new connection or NULL to use defaults
     //!param: (out) rpSrcConnection - Set to point to the PtConnection for the origination of the call
     //!param: (out) rpDstConnection - Set to point to the PtConnection for the termination of the call
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_INVALID_PARTY - Invalid <i>destinationURL</i>
     //!retcode: PT_INVALID_STATE - The call associated with <i>rTerminalConnection</i> is not ACTIVE
     //!retcode: PT_RESOURCE_UNAVAILABLE - Insufficient resources
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus drop(void);
     //:Drops the entire call.
     // This method is equivalent to using the PtConnection.disconnect()
     // method on each PtConnection which is part of the PtCall. Typically,
     // each PtConnection on the PtCall will move into the
     // PtConnection::DISCONNECTED state, each PtTerminalConnection will
     // move into the PtTerminalConnection::DROPPED state, and the PtCall
     // will move into the PtCall::INVALID state.
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus removeCallListener(PtCallListener& rCallListener);
     //:Removes the indicated listener from this call.
     //!param: (in) rCallListener - The listener to remove from this call
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_NOT_FOUND - <i>rCallListener</i> not registered
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus setConferenceController(PtTerminalConnection* pController);
     //:Sets the PtTerminalConnection that acts as the conference controller
     //:for this call.
     // The conference controller represents the participant in the call
     // around which a conference takes place.
     //!param: pController - The terminal connection to use as a conference controller for this call
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_INVALID_ARGUMENT - The indicated terminal connection is not part of this call
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus setTransferController(PtTerminalConnection* pController);
     //:Sets the PtTerminalConnection that acts as the transfer controller
     //:for this call.
     // The transfer controller represents the participant in the call
     // around which a transfer takes place.
     //!param: pController - The terminal connection to use as a transfer controller for this call
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_INVALID_ARGUMENT - The indicated terminal connection is not part of this call
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus transfer(PtCall& rOtherCall);
     //:Moves all participants from one PtCall to another, with the
     //:exception of a selected common participant.
     //!param: (in) rOtherCall - The PtCall object whose participants will be moved to this PtCall
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_INVALID_ARGUMENT - The <i>rOtherCall</i> object is not valid for the transfer
     //!retcode: PT_INVALID_STATE - The call is either not ACTIVE or the conference controllers are not in the proper state
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus transfer(const char* destinationURL,
                     PtSessionDesc* pSessionDesc,
                     PtConnection& rNewConnection,
                                         int transferType = CpCallManager::CP_BLIND_TRANSFER);
     //:Transfers all participants currently on this PtCall, with the
     //:exception of the transfer controller participant, to the address
     //:indicated by the destination URL.
     //!param: (in) destinationURL - The intended destination for the new call
     //!param: (in) pSessionDesc - Pointer to the requested attributes for the new call or NULL to use defaults
     //!param: (out) rNewConnection - Set to point to the PtConnection that the participants have been moved to
     //!param: (in) transferType - CP_BLIND_TRANSFER or CP_SINGLE_CALL_TRANSFER
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_INVALID_PARTY - Invalid <i>destinationURL</i>
     //!retcode: PT_RESOURCE_UNAVAILABLE - Insufficient resources
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available


   virtual PtStatus hold(UtlBoolean bBridgeParticipants = TRUE) ;
     //:Places the call on hold and optionally allows call participants to
     //:continue speaking among other participants (bridged) or participants
     //:are requested to not transmit date (far end hold).
     //
     //!param (in): bBridgeParticipants - Controls whether participants are
     //             placed on local hold or far end hold.  If TRUE, local
     //             hold is selected and participants are bridged and able
     //             to communicate with each other.  If FALSE, all parties
     //             are muted and not sent audio data.
     //
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_BUSY - Unable to communicate with call processing

   virtual PtStatus unhold(UtlBoolean bRemoteParticipants = TRUE) ;
     //:Places the call into focus and takes any held connections off hold.
     //:Optionally remote participants can be taken off hold or left in
     //:their present state.
     //!param (in) bRemoteParticipants - Controls whether all particpants
     //            are taken off hold or not.  If TRUE, all participants
     //            are taken off hold.  If FALSE, only the local connection
     //            is taken off hold  (placed into focus).
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_BUSY - Unable to communicate with call processing

   virtual PtStatus setCodecCPULimit(const int limit,
                                     const UtlBoolean bAutoRenegotiate = TRUE);
      //:Sets the CPU codec limit for this call.
      //!param (in) limit - The codec/CPU limit for this call.  The value can
      //       be set to LOW (0) or HIGH (1).  If set to LOW, only LOW CPU
      //       intensive codecs are allowed.  If set to HIGH, both LOW and
      //       HIGH CPU intensive codes are allowed.
      //!param (in) bAutoRenegotiate - Defines if call call processiong should
      //       automatically force a renegotation of codecs to match the
      //       specified level.
      //!retcode: PT_SUCCESS - Success
      //!retcode: PT_BUSY - Unable to communicate with call processing


   virtual PtStatus forceCodecRenegotiation() ;
      //:Forces the renegotation of all connections for this call.
      //!retcode: PT_SUCCESS - Success
      //!retcode: PT_BUSY - Unable to communicate with call processing



/* ============================ ACCESSORS ================================= */

   virtual PtStatus getCallListeners(PtCallListener* callListeners[], int size,
                             int& rNumItems);
     //:Returns an array of PtCallListener pointers for all of the call
     //:listeners presently associated with this call.
     //!param: (out) callListeners - The array of pointers to known call listeners
     //!param: (in) size - The number of elements in the <i>callListeners</i> array
     //!param: (out) rNumItems - The number of items assigned
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_MORE_DATA - There are more than <i>size</i> listeners
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus getCalledAddress(PtAddress& rAddress);
     //:Sets <i>rpAddress</i> to point to the called PtAddress associated
     //:with this call.  This method should only be used for two-party calls.
     // The called PtAddress is the PtAddress to which the call was
     // originally placed.  If the called address is unknown or not yet known,
     // <i>rpAddress</i> will be set to NULL.
     //!param: (out) rAddress - Set to point to the called PtAddress for this call
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus getCallingAddress(PtAddress& rAddress);
     //:Sets <i>rpAddress</i> to point to the calling PtAddress associated
     //:with this call.  This method should only be used for two-party calls.
     // The calling PtAddress is the PtAddress which originally placed the
     // telephone call.  If the calling address is unknown or not yet known,
     // <i>rpAddress</i> will be set to NULL.
     //!param: (out) rAddress - Set to point to the calling PtAddress for this call
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus getCallingTerminal(PtTerminal& rTerminal);
     //:Sets <i>rpTerminal</i> to point to the calling PtTerminal associated
     //:with this call.  This method should only be used for two-party calls.
     // The calling PtTerminal is the PtTerminal which originally placed the
     // telephone call.  If the calling terminal is unknown or not yet known,
     // <i>rpTerminal</i> will be set to NULL.
     //!param: (out) rpTerminal - Set to point to the calling PtTerminal for this call
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus getConferenceController(PtTerminalConnection& rController);
     //:Sets <i>rpController</i> to point to the PtTerminalConnection which
     //:currently acts as the conference controller.
     // The conference controller represents the participant in the telephone
     // system around which a conference takes place.  When a PtCall is
     // initially created, it has no conference controller.  This method sets
     // <i>rpController</i> to non-NULL only if the application has
     // previously set the conference controller.  If the current conference
     // controller leaves the call, the call reverts to not having a
     // conference controller.
     //!param: (out) rpController - Set to point to the conference controller for this call
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus getConnections(PtConnection connections[], int size,
                           int& rNumItems);
     //:Returns an array of pointers to PtConnection objects currently
     //:associated with this call.
     // The caller provides an array that can hold up to <i>size</i>
     // PtConnection pointers.  This method will fill in the
     // <i>connections</i> array with up to <i>size</i> pointers.  The
     // actual number of pointers filled in is passed back via the
     // <i>nItems</i> argument.
     //!param: (out) connections - The array of PtConnection pointers
     //!param: (in) size - The number of elements in the <i>connections</i> array
     //!param: (out) rNumItems - The number of items assigned
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_MORE_DATA - There are more than <i>size</i> connections
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus getLastRedirectedAddress(PtAddress& rAddress);
     //:Sets <i>rpAddress</i> to point to the last redirected PtAddress
     //:associated with this call.  This method should only be used for
     //:two-party calls.
     // The last redirected PtAddress is the PtAddress at which this call
     // was placed immediately before the current PtAddress.  This address
     // is of interest when a PtCall is forwarded to a different PtAddress
     // before being answered.  If the last redirected address is unknown
     // or not yet known, <i>rpAddress</i> will be set to NULL.
     //!param: (out) rpAddress - Set to point to the last redirected PtAddress for this call
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus getProvider(PtProvider& rProvider);
     //:Returns a pointer to the PtProvider associated with this call.
     //!param: (out) rpProvider - a pointer to the PtProvider object associated with this call
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus getState(int& rState);
     //:Sets <i>rState</i> to the current state of the telephone call, either
     //:IDLE, ACTIVE or INVALID.
     //!retcode: IDLE - Initial state for a call
     //!retcode: ACTIVITY - Call with one or more connections
     //!retcode: INVALID - Call that is no longer valid (and has zero connections)

   PtStatus getCallId(char* callId, int len);
     //:Sets <i>callId</i> to the current call id.
     //!retcode: IDLE - Initial state for a call
     //!retcode: ACTIVITY - Call with one or more connections
     //!retcode: INVALID - Call that is no longer valid (and has zero connections)

   virtual PtStatus getTransferController(PtTerminalConnection& rController);
     //:Sets <i>rpController</i> to point to the PtTerminalConnection which
     //:currently acts as the transfer controller.
     // The conference controller represents the participant in the telephone
     // system around which a transfer takes place.  When a PtCall is
     // initially created, it has no transfer controller.  This method sets
     // <i>rpController</i> to non-NULL only if the application has
     // previously set the transfer controller.  If the current transfer
     // controller leaves the call, the call reverts to not having a
     // transfer controller.
     //!param: (out) rpController - Set to point to the transfer controller for this call
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus numConnections(int& rCount);
     //:Returns the number of connections associated with this call.
     //!param: (out) rCount - The number of connections associated with this call
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus numCallListeners(int& rCount);
     //:Returns the number of call listeners associated with this call.
     //!param: (out) rCount - The number of call listeners associated with this call
     //!retcode: PT_SUCCESS - Success
     //!retcode: PT_PROVIDER_UNAVAILABLE - The provider is not available

   virtual PtStatus getCodecCPUCost(int& cost) ;
      //:Gets the current CPU cost given the negotiated codecs.
      //!param (out) cost - The cpu cost of the currently negotiated and
      //       advertised codes.   A value of zero indicates LOW and 1
      //       indicates HIGH.
      //!retcode: PT_SUCCESS - Success
      //!retcode: PT_BUSY - Unable to communicate with call processing

   virtual  PtStatus getCodecCPULimit(int& cost) ;
      //:Gets the max  CPU cost given the negotiated codecs.
      //!param (out) cost - The cpu cost of the currently negotiated and
      //       advertised codes.   A value of zero indicates LOW and 1
      //       indicates HIGH.
      //!retcode: PT_SUCCESS - Success
      //!retcode: PT_BUSY - Unable to communicate with call processing


/* ============================ INQUIRY =================================== */

friend class PtCallEvent;

/* //////////////////////////// PROTECTED ///////////////////////////////// */
protected:
        UtlString       mCallId;
        char    mState;

    static OsBSem           semInit ;
      //: Binary Semaphore used to guard initialiation and tear down
        static TaoReference             *mpTransactionCnt;
        static int                              mRef;

        PtTerminalConnection* mpConfController;
        TaoClientTask   *mpClient;

        OsTime          mTimeOut;

        void    initialize();

/* //////////////////////////// PRIVATE /////////////////////////////////// */
private:

        OsProtectEventMgr *mpEventMgr;

};

/* ============================ INLINE METHODS ============================ */

#endif  // _PtCall_h_