]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 195882 via svnmerge from
authorMatthew Nicholson <mnicholson@digium.com>
Thu, 21 May 2009 16:19:20 +0000 (16:19 +0000)
committerMatthew Nicholson <mnicholson@digium.com>
Thu, 21 May 2009 16:19:20 +0000 (16:19 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

................
  r195882 | mnicholson | 2009-05-21 10:33:55 -0500 (Thu, 21 May 2009) | 20 lines

  Merged revisions 195881 via svnmerge from
  https://origsvn.digium.com/svn/asterisk/branches/1.4

  ........
    r195881 | mnicholson | 2009-05-21 10:25:50 -0500 (Thu, 21 May 2009) | 13 lines

    This commit prevents cdr records with AST_CDR_FLAG_ANSLOCKED and AST_CDR_FLAG_LOCKED from being updated in certain cases.

    This is accomplished by adding two functions to update the answer time and disposition of calls that checks for the proper lock flags.  These functions are used in the ast_bridge_call() function so that ForkCDR(A) calls are respected.

    This patch also modifies the way ast_bridge_call() chooses the cdr record to base the bridged_cdr on.  Previously the first unlocked cdr record would be chosen, now instead the first cdr record is chosen and forked cdr records are moved to the bridge_cdr.  This allows the original cdr record and any forked cdr records to be properly updated with answer and end times.

    (closes issue #13797)
    Reported by: sh0t
    Tested by: sh0t

    (closes issue #14744)
    Reported by: deepesh
  ........
................

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@195892 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/cdr.h
main/cdr.c

index 7ece623791ee63771d6f29c3f4e6a9020f4d5a12..9d3940c87cd168bd95a97b6ee99b70e4002d901e 100644 (file)
@@ -284,6 +284,24 @@ void ast_cdr_setdestchan(struct ast_cdr *cdr, const char *chan);
  */
 void ast_cdr_setapp(struct ast_cdr *cdr, char *app, char *data);
 
+/*!
+ * \brief Set the answer time for a call
+ * \param cdr the cdr you wish to associate with the call
+ * \param t the answer time
+ * Starts all CDR stuff necessary for doing CDR when answering a call
+ * NULL argument is just fine.
+ */
+void ast_cdr_setanswer(struct ast_cdr *cdr, struct timeval t);
+
+/*!
+ * \brief Set the disposition for a call
+ * \param cdr the cdr you wish to associate with the call
+ * \param disposition the new disposition
+ * Set the disposition on a call.
+ * NULL argument is just fine.
+ */
+void ast_cdr_setdisposition(struct ast_cdr *cdr, long int disposition);
+
 /*! 
  * \brief Convert a string to a detail record AMA flag 
  * \param flag string form of flag
index d50cf6b1115bee459338d9b26fdf028b67e135f3..8674b02e8388508e89a5b9dd5b810fd8ba6d7625 100644 (file)
@@ -788,6 +788,30 @@ void ast_cdr_setapp(struct ast_cdr *cdr, char *app, char *data)
        }
 }
 
+void ast_cdr_setanswer(struct ast_cdr *cdr, struct timeval t)
+{
+
+       for (; cdr; cdr = cdr->next) {
+               if (ast_test_flag(cdr, AST_CDR_FLAG_ANSLOCKED))
+                       continue;
+               if (ast_test_flag(cdr, AST_CDR_FLAG_DONT_TOUCH) && ast_test_flag(cdr, AST_CDR_FLAG_LOCKED))
+                       continue;
+               check_post(cdr);
+               cdr->answer = t;
+       }
+}
+
+void ast_cdr_setdisposition(struct ast_cdr *cdr, long int disposition)
+{
+
+       for (; cdr; cdr = cdr->next) {
+               if (ast_test_flag(cdr, AST_CDR_FLAG_LOCKED))
+                       continue;
+               check_post(cdr);
+               cdr->disposition = disposition;
+       }
+}
+
 /* set cid info for one record */
 static void set_one_cid(struct ast_cdr *cdr, struct ast_channel *c)
 {