sipxtacklib  Version 3.3
SipTransaction.h
Go to the documentation of this file.
1 //
2 // Copyright (C) 2004-2006 SIPfoundry Inc.
3 // Licensed by SIPfoundry under the LGPL license.
4 //
5 // Copyright (C) 2004-2006 Pingtel Corp. All rights reserved.
6 // Licensed to SIPfoundry under a Contributor Agreement.
7 //
8 // $$
10 
11 
12 #ifndef _SipTransaction_h_
13 #define _SipTransaction_h_
14 
15 // SYSTEM INCLUDES
16 //#include <...>
17 
18 // APPLICATION INCLUDES
19 
20 
21 #include <os/OsDefs.h>
22 #include <os/OsSocket.h>
23 #include <os/OsMsgQ.h>
24 #include <net/Url.h>
25 #include <net/SipSrvLookup.h>
26 #include <utl/UtlSList.h>
27 
28 // DEFINES
29 // MACROS
30 // EXTERNAL FUNCTIONS
31 // EXTERNAL VARIABLES
32 // CONSTANTS
33 // STRUCTS
34 // TYPEDEFS
35 // FORWARD DECLARATIONS
36 class SipMessage;
37 class SipUserAgent;
38 class OsEvent;
39 class OsTimer;
41 class SipTransactionList;
42 
43 //#include "tapi/sipXtapiInternal.h"
44 
51 class SipTransaction : public UtlString {
52 /* //////////////////////////// PUBLIC //////////////////////////////////// */
53 public:
54 
55  static int smTransactionNum;
56  static UtlString smBranchIdBase;
57 
58 
59  /*** States of a transaction.
60  * @note
61  * See RFC 3261 for a defininition and description
62  * of these transaction states and when the transitions occur.
63  * @endnote
64  */
73  };
74 
90  };
91 
92 /* ============================ CREATORS ================================== */
93 
94  SipTransaction(SipMessage* request = NULL,
95  UtlBoolean isOutgoing = TRUE,
96  UtlBoolean userAgentTransaction = TRUE);
97  //:Default constructor
98  // When this is an out going request, this is a client
99  // transaction. The via header field MUST be added before
100  // constructing this transaction as this sets the branch ID.
102  // server
103 
104 
105 
106  virtual
107  ~SipTransaction();
108  //:Destructor
109 
110 /* ============================ MANIPULATORS ============================== */
111 
112  void getNewBranchId(SipMessage& request,
113  UtlString& branchId);
114 
115  UtlBoolean handleOutgoing(SipMessage& outgoingMessage,
116  SipUserAgent& userAgent,
117  SipTransactionList& transactionList,
118  enum messageRelationship relationship,
119  SIPX_TRANSPORT_DATA* pTransport = NULL);
120 
121  void handleResendEvent(const SipMessage& outgoingMessage,
122  SipUserAgent& userAgent,
123  enum messageRelationship relationship,
124  SipTransactionList& transactionList,
125  int& nextTimeout,
126  SipMessage*& delayedDispatchedMessage,
127  SIPX_TRANSPORT_DATA* pTransport);
128 
129  void handleExpiresEvent(const SipMessage& outgoingMessage,
130  SipUserAgent& userAgent,
131  enum messageRelationship relationship,
132  SipTransactionList& transactionList,
133  int& nextTimeout,
134  SipMessage*& delayedDispatchedMessage,
135  SIPX_TRANSPORT_DATA* pTransport);
136 
137  UtlBoolean handleIncoming(SipMessage& incomingMessage,
138  SipUserAgent& userAgent,
139  enum messageRelationship relationship,
140  SipTransactionList& transactionList,
141  SipMessage*& delayedDispatchedMessage,
142  SIPX_TRANSPORT_DATA* pTransport);
143 
144  void removeTimer(OsTimer* timer);
145 
146  void stopTimers() ;
147  void startTimers();
148  void deleteTimers();
149 
150 /* ============================ Deprecated ============================== */
151 
152  void linkChild(SipTransaction& child);
153 
154  void toString(UtlString& dumpString,
155  UtlBoolean dumpMessagesAlso);
156  //: Serialize the contents of this
157 
158  void dumpTransactionTree(UtlString& dumpstring,
159  UtlBoolean dumpMessagesAlso);
160  //: Serialize the contents of all the transactions in this tree
161  // The parent is found first and then all children are serialized
162  // recursively
163 
164  void dumpChildren(UtlString& dumpstring,
165  UtlBoolean dumpMessagesAlso);
166  //: Serialize the contents of all the child transactions to this transaction
167  // All children are serialized recursively
168 
169 
170 /* ============================ ACCESSORS ================================= */
171 
172  static void getStateString(enum transactionStates state,
173  UtlString& stateString);
174 
175  static void getRelationshipString(enum messageRelationship relationship,
176  UtlString& relationshipString);
177 
178  static void buildHash(const SipMessage& message,
179  UtlBoolean isOutgoing,
180  UtlString& hash);
181 
183 
184  void getCallId(UtlString& callId) const;
185 
186  enum transactionStates getState() const;
187 
188  long getStartTime() const;
189 
190  long getTimeStamp() const;
191 
192  void touch();
193  void touchBelow(int newDate);
194 
196 
198 
200 
201  void cancel(SipUserAgent& userAgent,
202  SipTransactionList& transactionList);
203  //: cancel any outstanding client transactions (recursively on children)
204 
205  void markBusy();
206 
207  void markAvailable();
208 
209  void notifyWhenAvailable(OsEvent* availableEvent);
210  //: The given event is signaled when this transaction is not busy
211 
212  void signalNextAvailable();
213 
214  void signalAllAvailable();
215 
216 /* ============================ INQUIRY =================================== */
217 
218  UtlBoolean isServerTransaction() const;
219  //: Inquire if this transaction is a server as opposed to a client transaction
220 
222  UtlBoolean isDnsSrvChild() const;
223 
224  UtlBoolean isUaTransaction() const;
225  //: Inquire if transaction is UA based or proxy
226  // Note this is different than server vs client transaction
227 
228  UtlBoolean isChildSerial();
229  //: Inquire as to whether child transaction will be serial or all parallel searched
230  // If all immediate child transactions have the same
231  // Q value FALSE is returned
232 
233  UtlBoolean isEarlyDialogWithMedia();
234  //: Tests to see if this is an existing early dialog with early media
235  // If transaction has not yet been completed and there was early media
236  // (determined by the presence of SDP in a provisional response
237 
238  UtlBoolean isChildEarlyDialogWithMedia();
239  //: Are any of the children in an early dialog with media
240 
241  UtlBoolean isMethod(const char* methodToMatch) const;
242  //: see if this tranaction is of the given method type
243 
244  enum messageRelationship whatRelation(const SipMessage& message,
245  UtlBoolean isOutgoing) const;
246  //: Check if the given message is part of this transaction
247 
248  UtlBoolean isBusy();
249  //: is this transaction being used (e.g. locked)
250 
251  //UtlBoolean isDuplicateMessage(SipMessage& message,
252  // UtlBoolean checkIfTransactionMatches = TRUE);
253  //: Check to see if this request or response has already been received by this transaction
254 
255  UtlBoolean isUriChild(Url& uri);
256  // Does this URI already exist as an immediate child to this transaction
257  // Search through each of the children and see if the child
258  // transaction's URI matches.
259 
260  UtlBoolean isUriRecursed(Url& uri);
261  // Has this URI been recursed anywhere in this transaction tree already
262  // Start looking at the parent
263 
264  UtlBoolean isUriRecursedChildren(UtlString& uriString);
265  // Has this URI been recursed anywhere at or below in this transaction tree already
266  // Look at or below the current transaction in the transaction tree
267 
268  void setTransport(SIPX_TRANSPORT_DATA* pTransport) { mpTransport = pTransport; }
269  // Mutator for mpTransport.
270 
271 /* //////////////////////////// PROTECTED ///////////////////////////////// */
272 protected:
274  const SipMessage& outgoingMessage,
275  SipUserAgent& userAgent,
276  enum messageRelationship relationship,
277  SipTransactionList& transactionList,
278  int& nextTimeout,
279  SipMessage*& delayedDispatchedMessage,
280  SIPX_TRANSPORT_DATA* pTransport);
281  //: tells the parent transaction the result of the timeout event
282 
283  UtlBoolean handleChildIncoming(//SipTransaction& child,
284  SipMessage& incomingMessage,
285  SipUserAgent& userAgent,
286  enum messageRelationship relationship,
287  SipTransactionList& transactionList,
288  UtlBoolean childSaysShouldDispatch,
289  SipMessage*& delayedDispatchedMessage,
290  SIPX_TRANSPORT_DATA* pTransport);
291  //: Tells the parent transaction the result of the incoming message
293 
294  UtlBoolean startSequentialSearch(SipUserAgent& userAgent,
295  SipTransactionList& transactionList,
296  SIPX_TRANSPORT_DATA* pTransport);
297  //: Checks to see if a final response can be sent or if sequential search should be started
298 
299  UtlBoolean recurseChildren(SipUserAgent& userAgent,
300  SipTransactionList& transactionList);
301  //: Starts search on any immediate children of the highest unpursued Q value
302 
303  UtlBoolean recurseDnsSrvChildren(SipUserAgent& userAgent,
304  SipTransactionList& transactionList,
305  SIPX_TRANSPORT_DATA* pTransport);
306  //: Starts search on any immediate DNS SRV children of the highest unpursued Q value
307 
308  UtlBoolean findBestResponse(SipMessage& bestResponse);
309  // Finds the best final response to return the the server transaction
310 
312  UtlBoolean isOutGoing,
313  enum messageRelationship relationship = MESSAGE_UNKNOWN);
314  //: Adds the provisional or final response to the transaction
315 
316  void cancelChildren(SipUserAgent& userAgent,
317  SipTransactionList& transactionList);
318  //: Cancels children transactions on a server transaction
319 
320  void doMarkBusy(int markValue);
321 
322 /* //////////////////////////// PRIVATE /////////////////////////////////// */
323 private:
324  SipTransaction(const SipTransaction& rSipTransaction);
325  //:Copy constructor (disabled)
326  SipTransaction& operator=(const SipTransaction& rhs);
327  //:Assignment operator (disabled)
328 
329  UtlBoolean doResend(SipMessage& resendMessage,
330  SipUserAgent& userAgent,
331  int& nextTimeoutMs,
332  SIPX_TRANSPORT_DATA* pTransport);
333 
334  UtlBoolean doFirstSend(SipMessage& message,
335  enum messageRelationship relationship,
336  SipUserAgent& userAgent,
337  UtlString& toAddress,
338  int& port,
339  OsSocket::IpProtocolSocketType& toProtocol,
340  SIPX_TRANSPORT_DATA* pTransport);
341 
342  void prepareRequestForSend(SipMessage& request,
343  SipUserAgent& userAgent,
344  UtlBoolean& addressRequiresDnsSrvLookup,
345  UtlString& toAddress,
346  int& port,
347  OsSocket::IpProtocolSocketType& toProtocol);
348 
349  // CallId + 's' or 'c' (for server or client) is used as
350  // the key for the hash (i.e. stored as the string/data in
351  // the parent UtlString
352  UtlString mCallId;
353  UtlString mBranchId;
354  UtlString mRequestUri;
355  Url mFromField;
356  Url mToField;
357  UtlString mRequestMethod;
358  int mCseq;
359  UtlBoolean mIsServerTransaction;
360  UtlBoolean mIsUaTransaction;
361 
362  // Address and transport that have been established for this transaction.
363  UtlString mSendToAddress;
364  int mSendToPort;
365  OsSocket::IpProtocolSocketType mSendToProtocol;
366 
367  server_t* mpDnsSrvRecords;
368  SipMessage* mpRequest;
369  SipMessage* mpLastProvisionalResponse;
370  SipMessage* mpLastFinalResponse;
371  SipMessage* mpAck;
372  SipMessage* mpCancel;
373  SipMessage* mpCancelResponse;
374  SipTransaction* mpParentTransaction;
375  UtlSList mChildTransactions;
376  long mTransactionCreateTime;
377  long mTransactionStartTime;
379  long mTimeStamp;
380  enum transactionStates mTransactionState;
381  UtlBoolean mDispatchedFinalResponse;
382  UtlBoolean mProvisionalSdp;
383  UtlSList mTimers;
386  // Recursion members
387  UtlBoolean mIsCanceled;
388  UtlBoolean mIsRecursing;
389  UtlBoolean mIsDnsSrvChild;
390  double mQvalue;
391  int mExpires;
392  UtlBoolean mIsBusy;
393  UtlString mBusyTaskName;
394  UtlSList* mWaitingList;
396  SIPX_TRANSPORT_DATA* mpTransport;
397  //: An optional external transport mechanism pointer. If this value is non-null, the
398  //: transaction will use the SipUserAgent::sendCustom method, instead of sendUdp, sendTcp, etc.
399 
400 };
401 
402 /* ============================ INLINE METHODS ============================ */
403 
404 #endif // _SipTransaction_h_
UtlBoolean findBestResponse(SipMessage &bestResponse)
Definition: SipTransaction.cpp:3083
UtlBoolean isEarlyDialogWithMedia()
Definition: SipTransaction.cpp:4867
long getTimeStamp() const
Definition: SipTransaction.cpp:4682
SipMessage * getLastFinalResponse()
Definition: SipTransaction.cpp:4748
Transaction and Transport manager for SIP stack.
Definition: SipUserAgent.h:157
enum messageRelationship addResponse(SipMessage *&response, UtlBoolean isOutGoing, enum messageRelationship relationship=MESSAGE_UNKNOWN)
Definition: SipTransaction.cpp:299
virtual ~SipTransaction()
param: userAgentTransaction - user agent (vs proxy) client or
Definition: SipTransaction.cpp:155
Same Call-Id, to, from, cseq but different TX.
Definition: SipTransaction.h:80
void handleResendEvent(const SipMessage &outgoingMessage, SipUserAgent &userAgent, enum messageRelationship relationship, SipTransactionList &transactionList, int &nextTimeout, SipMessage *&delayedDispatchedMessage, SIPX_TRANSPORT_DATA *pTransport)
Definition: SipTransaction.cpp:1294
UtlBoolean isMethod(const char *methodToMatch) const
Definition: SipTransaction.cpp:4926
ACK recieved for 300-699 response classes.
Definition: SipTransaction.h:71
void signalNextAvailable()
Definition: SipTransaction.cpp:4456
An ACK assocated with this TX (but considered a different TX)
Definition: SipTransaction.h:88
static int smTransactionNum
Definition: SipTransaction.h:55
void getNewBranchId(SipMessage &request, UtlString &branchId)
Definition: SipTransaction.cpp:253
Final response received.
Definition: SipTransaction.h:70
The first final response to this TX.
Definition: SipTransaction.h:83
void setTransport(SIPX_TRANSPORT_DATA *pTransport)
Definition: SipTransaction.h:268
UtlBoolean isChildEarlyDialogWithMedia()
Definition: SipTransaction.cpp:4903
UtlBoolean handleChildIncoming(SipMessage &incomingMessage, SipUserAgent &userAgent, enum messageRelationship relationship, SipTransactionList &transactionList, UtlBoolean childSaysShouldDispatch, SipMessage *&delayedDispatchedMessage, SIPX_TRANSPORT_DATA *pTransport)
Definition: SipTransaction.cpp:1706
The request to this TX.
Definition: SipTransaction.h:81
void getCallId(UtlString &callId) const
Definition: SipTransaction.cpp:4667
UtlBoolean isServerTransaction() const
Definition: SipTransaction.cpp:4825
void cancel(SipUserAgent &userAgent, SipTransactionList &transactionList)
Definition: SipTransaction.cpp:4025
Specialization of HttpMessage to contain and manipulate SIP messages.
Definition: SipMessage.h:343
enum transactionStates getState() const
Definition: SipTransaction.cpp:4672
SipTransaction correlates requests and responses.
Definition: SipTransaction.h:51
static void getStateString(enum transactionStates state, UtlString &stateString)
Definition: SipTransaction.cpp:4530
But not part of this TX or related branches.
Definition: SipTransaction.h:79
void notifyWhenAvailable(OsEvent *availableEvent)
Definition: SipTransaction.cpp:4431
Definition: SipTransaction.h:72
messageRelationship
The relationship of a message to a transaction.
Definition: SipTransaction.h:76
transactionStates
Definition: SipTransaction.h:65
Relationship not yet determined, or error.
Definition: SipTransaction.h:77
void stopTimers()
Definition: SipTransaction.cpp:3997
UtlBoolean recurseChildren(SipUserAgent &userAgent, SipTransactionList &transactionList)
Definition: SipTransaction.cpp:2815
static void buildHash(const SipMessage &message, UtlBoolean isOutgoing, UtlString &hash)
Definition: SipTransaction.cpp:4633
void dumpChildren(UtlString &dumpstring, UtlBoolean dumpMessagesAlso)
Definition: SipTransaction.cpp:4160
A duplicate message for this TX.
Definition: SipTransaction.h:89
UtlBoolean isUriChild(Url &uri)
Definition: SipTransaction.cpp:5303
UtlBoolean isChildSerial()
Definition: SipTransaction.cpp:4840
static UtlString smBranchIdBase
Definition: SipTransaction.h:56
void markAvailable()
Definition: SipTransaction.cpp:4791
void doMarkBusy(int markValue)
Definition: SipTransaction.cpp:4774
UtlBoolean recurseDnsSrvChildren(SipUserAgent &userAgent, SipTransactionList &transactionList, SIPX_TRANSPORT_DATA *pTransport)
Definition: SipTransaction.cpp:2521
void cancelChildren(SipUserAgent &userAgent, SipTransactionList &transactionList)
Definition: SipTransaction.cpp:4089
A cancel for this TX.
Definition: SipTransaction.h:85
SipTransaction * getTopMostParent() const
Definition: SipTransaction.cpp:4651
Provisional response received.
Definition: SipTransaction.h:69
UtlBoolean startSequentialSearch(SipUserAgent &userAgent, SipTransactionList &transactionList, SIPX_TRANSPORT_DATA *pTransport)
returns: TRUE/FALSE as to whether the message should be dispatched to applications ...
Definition: SipTransaction.cpp:2380
SipMessage * getLastProvisionalResponse()
Definition: SipTransaction.cpp:4743
void handleChildTimeoutEvent(SipTransaction &child, const SipMessage &outgoingMessage, SipUserAgent &userAgent, enum messageRelationship relationship, SipTransactionList &transactionList, int &nextTimeout, SipMessage *&delayedDispatchedMessage, SIPX_TRANSPORT_DATA *pTransport)
Definition: SipTransaction.cpp:2205
A different final response for this TX.
Definition: SipTransaction.h:84
long getStartTime() const
UtlBoolean isBusy()
Definition: SipTransaction.cpp:5298
No messages sent (usually client)
Definition: SipTransaction.h:67
void handleExpiresEvent(const SipMessage &outgoingMessage, SipUserAgent &userAgent, enum messageRelationship relationship, SipTransactionList &transactionList, int &nextTimeout, SipMessage *&delayedDispatchedMessage, SIPX_TRANSPORT_DATA *pTransport)
Definition: SipTransaction.cpp:1571
void startTimers()
Definition: SipTransaction.cpp:4008
void linkChild(SipTransaction &child)
Definition: SipTransaction.cpp:4102
UtlBoolean isDnsSrvChild() const
Inquiry as to whether this transaction is a recursed DNS SRV child.
Definition: SipTransaction.cpp:4830
Request sent.
Definition: SipTransaction.h:68
Structure to describe a server found for a SIP domain.
Definition: SipSrvLookup.h:213
A with different Call-Id, To or From.
Definition: SipTransaction.h:78
Definition: sipXtapiInternal.h:288
void dumpTransactionTree(UtlString &dumpstring, UtlBoolean dumpMessagesAlso)
Definition: SipTransaction.cpp:4147
void removeTimer(OsTimer *timer)
Definition: SipTransaction.cpp:3936
void toString(UtlString &dumpString, UtlBoolean dumpMessagesAlso)
Definition: SipTransaction.cpp:4181
void deleteTimers()
Definition: SipTransaction.cpp:3965
Definition: SipTransaction.h:86
not yet set
Definition: SipTransaction.h:66
UtlBoolean handleOutgoing(SipMessage &outgoingMessage, SipUserAgent &userAgent, SipTransactionList &transactionList, enum messageRelationship relationship, SIPX_TRANSPORT_DATA *pTransport=NULL)
Definition: SipTransaction.cpp:426
UtlBoolean isUriRecursed(Url &uri)
Definition: SipTransaction.cpp:5323
UtlBoolean isUaTransaction() const
Definition: SipTransaction.cpp:4835
URL parser and constructor.
Definition: Url.h:90
A provision response to this TX.
Definition: SipTransaction.h:82
SipMessage * getRequest()
Definition: SipTransaction.cpp:4738
enum messageRelationship whatRelation(const SipMessage &message, UtlBoolean isOutgoing) const
Definition: SipTransaction.cpp:4932
SipTransaction(SipMessage *request=NULL, UtlBoolean isOutgoing=TRUE, UtlBoolean userAgentTransaction=TRUE)
Definition: SipTransaction.cpp:52
void touchBelow(int newDate)
Definition: SipTransaction.cpp:4719
An ACK for this non-2xx TX.
Definition: SipTransaction.h:87
UtlBoolean isUriRecursedChildren(UtlString &uriString)
Definition: SipTransaction.cpp:5333
Definition: SipTransactionList.h:36
void touch()
Definition: SipTransaction.cpp:4687
static void getRelationshipString(enum messageRelationship relationship, UtlString &relationshipString)
Definition: SipTransaction.cpp:4571
void signalAllAvailable()
Definition: SipTransaction.cpp:4490
UtlBoolean handleIncoming(SipMessage &incomingMessage, SipUserAgent &userAgent, enum messageRelationship relationship, SipTransactionList &transactionList, SipMessage *&delayedDispatchedMessage, SIPX_TRANSPORT_DATA *pTransport)
Definition: SipTransaction.cpp:3458
void markBusy()
Definition: SipTransaction.cpp:4753

sipXtackLib home page