create a new (internal, for the time being) function astman_start_ack()
authorLuigi Rizzo <rizzo@icir.org>
Wed, 18 Oct 2006 14:21:15 +0000 (14:21 +0000)
committerLuigi Rizzo <rizzo@icir.org>
Wed, 18 Oct 2006 14:21:15 +0000 (14:21 +0000)
to start manager responses that need further lines.
This removes a lot of duplicate code from the various handlers
that at the moment build an ActionID string themselves.

Once settled, the function should move to manager.h so
it can be used by other files (chan_agent, chan_iax2, chan_sip,
chan_zap, res_jabber and app_queue).

I am not totally clear if there is a preferred position for
the ActionID: line in a message. Some instances put it at
the end, but one would argue that it is preferable to have
it at the beginning.

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

main/manager.c

index c65d82a..d367dc8 100644 (file)
@@ -738,16 +738,15 @@ struct ast_variable *astman_get_variables(struct message *m)
    be read until either the current action finishes or get_input() obtains the session
    lock.
  */
-void astman_send_error(struct mansession *s, struct message *m, char *error)
-{
-       char *id = astman_get_header(m,"ActionID");
-
-       astman_append(s, "Response: Error\r\n");
-       if (!ast_strlen_zero(id))
-               astman_append(s, "ActionID: %s\r\n", id);
-       astman_append(s, "Message: %s\r\n\r\n", error);
-}
 
+/*! \brief send a response with an optional message,
+ * and terminate it with an empty line.
+ * m is used only to grab the 'ActionID' field.
+ *
+ * Use the explicit constant MSG_MOREDATA to remove the empty line.
+ * XXX MSG_MOREDATA should go to a header file.
+ */
+#define MSG_MOREDATA   ((char *)astman_send_response)
 void astman_send_response(struct mansession *s, struct message *m, char *resp, char *msg)
 {
        char *id = astman_get_header(m,"ActionID");
@@ -755,17 +754,29 @@ void astman_send_response(struct mansession *s, struct message *m, char *resp, c
        astman_append(s, "Response: %s\r\n", resp);
        if (!ast_strlen_zero(id))
                astman_append(s, "ActionID: %s\r\n", id);
-       if (msg)
+       if (msg == MSG_MOREDATA)
+               return;
+       else if (msg)
                astman_append(s, "Message: %s\r\n\r\n", msg);
        else
                astman_append(s, "\r\n");
 }
 
+void astman_send_error(struct mansession *s, struct message *m, char *error)
+{
+       astman_send_response(s, m, "Error", error);
+}
+
 void astman_send_ack(struct mansession *s, struct message *m, char *msg)
 {
        astman_send_response(s, m, "Success", msg);
 }
 
+static void astman_start_ack(struct mansession *s, struct message *m)
+{
+       astman_send_response(s, m, "Success", MSG_MOREDATA);
+}
+
 /*! Tells you if smallstr exists inside bigstr
    which is delim by delim and uses no buf or stringsep
    ast_instring("this|that|more","this",'|') == 1;
@@ -972,11 +983,6 @@ static int action_getconfig(struct mansession *s, struct message *m)
        int lineno = 0;
        char *category=NULL;
        struct ast_variable *v;
-       char idText[256] = "";
-       char *id = astman_get_header(m, "ActionID");
-
-       if (!ast_strlen_zero(id))
-               snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
 
        if (ast_strlen_zero(fn)) {
                astman_send_error(s, m, "Filename not specified");
@@ -986,7 +992,7 @@ static int action_getconfig(struct mansession *s, struct message *m)
                astman_send_error(s, m, "Config file not found");
                return 0;
        }
-       astman_append(s, "Response: Success\r\n%s", idText);
+       astman_start_ack(s, m);
        while ((category = ast_category_browse(cfg, category))) {
                lineno = 0;
                astman_append(s, "Category-%06d: %s\r\n", catcount, category);
@@ -1075,13 +1081,8 @@ static int action_updateconfig(struct mansession *s, struct message *m)
        char *sfn = astman_get_header(m, "SrcFilename");
        char *dfn = astman_get_header(m, "DstFilename");
        int res;
-       char idText[256] = "";
-       char *id = astman_get_header(m, "ActionID");
        char *rld = astman_get_header(m, "Reload");
 
-       if (!ast_strlen_zero(id))
-               snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
-
        if (ast_strlen_zero(sfn) || ast_strlen_zero(dfn)) {
                astman_send_error(s, m, "Filename not specified");
                return 0;
@@ -1097,7 +1098,7 @@ static int action_updateconfig(struct mansession *s, struct message *m)
                astman_send_error(s, m, "Save of config failed");
                return 0;
        }
-       astman_append(s, "Response: Success\r\n%s\r\n", idText);
+       astman_send_ack(s, m, NULL);
        if (!ast_strlen_zero(rld)) {
                if (ast_true(rld))
                        rld = NULL;
@@ -1205,13 +1206,9 @@ static char mandescr_listcommands[] =
 static int action_listcommands(struct mansession *s, struct message *m)
 {
        struct manager_action *cur;
-       char idText[256] = "";
        char temp[BUFSIZ];
-       char *id = astman_get_header(m,"ActionID");
 
-       if (!ast_strlen_zero(id))
-               snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
-       astman_append(s, "Response: Success\r\n%s", idText);
+       astman_start_ack(s, m);
        ast_mutex_lock(&actionlock);
        for (cur = first_action; cur; cur = cur->next) { /* Walk the list of actions */
                if ((s->writeperm & cur->authority) == cur->authority)
@@ -1278,13 +1275,10 @@ static int action_challenge(struct mansession *s, struct message *m)
        char *authtype = astman_get_header(m, "AuthType");
 
        if (!strcasecmp(authtype, "MD5")) {
-               char *id = astman_get_header(m,"ActionID");
                if (ast_strlen_zero(s->challenge))
                        snprintf(s->challenge, sizeof(s->challenge), "%ld", ast_random());
                ast_mutex_lock(&s->__lock);
-               astman_append(s, "Response: Success\r\n");
-               if (!ast_strlen_zero(id))
-                       astman_append(s, "ActionID: %s\r\n", id);
+               astman_start_ack(s, m);
                astman_append(s, "Challenge: %s\r\n\r\n", s->challenge);
                ast_mutex_unlock(&s->__lock);
        } else {
@@ -1371,7 +1365,6 @@ static int action_getvar(struct mansession *s, struct message *m)
        struct ast_channel *c = NULL;
        char *name = astman_get_header(m, "Channel");
        char *varname = astman_get_header(m, "Variable");
-       char *id = astman_get_header(m,"ActionID");
        char *varval;
        char workspace[1024];
 
@@ -1396,11 +1389,8 @@ static int action_getvar(struct mansession *s, struct message *m)
 
        if (c)
                ast_channel_unlock(c);
-       astman_append(s, "Response: Success\r\n"
-               "Variable: %s\r\nValue: %s\r\n", varname, varval);
-       if (!ast_strlen_zero(id))
-               astman_append(s, "ActionID: %s\r\n",id);
-       astman_append(s, "\r\n");
+       astman_start_ack(s, m);
+       astman_append(s, "Variable: %s\r\nValue: %s\r\n\r\n", varname, varval);
 
        return 0;
 }
@@ -1410,18 +1400,19 @@ static int action_getvar(struct mansession *s, struct message *m)
 /* Needs documentation... */
 static int action_status(struct mansession *s, struct message *m)
 {
-       char *id = astman_get_header(m,"ActionID");
        char *name = astman_get_header(m,"Channel");
-       char idText[256] = "";
        struct ast_channel *c;
        char bridge[256];
        struct timeval now = ast_tvnow();
        long elapsed_seconds = 0;
        int all = ast_strlen_zero(name); /* set if we want all channels */
+       char *id = astman_get_header(m,"ActionID");
+       char idText[256] = "";
 
-       astman_send_ack(s, m, "Channel status will follow");
        if (!ast_strlen_zero(id))
                snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
+
+       astman_send_ack(s, m, "Channel status will follow");
        if (all)
                c = ast_channel_walk_locked(NULL);
        else {
@@ -1757,21 +1748,16 @@ static char mandescr_mailboxstatus[] =
 static int action_mailboxstatus(struct mansession *s, struct message *m)
 {
        char *mailbox = astman_get_header(m, "Mailbox");
-       char *id = astman_get_header(m,"ActionID");
-       char idText[256] = "";
        int ret;
        if (ast_strlen_zero(mailbox)) {
                astman_send_error(s, m, "Mailbox not specified");
                return 0;
        }
-        if (!ast_strlen_zero(id))
-                snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
        ret = ast_app_has_voicemail(mailbox, NULL);
-       astman_append(s, "Response: Success\r\n"
-                                  "%s"
-                                  "Message: Mailbox Status\r\n"
-                                  "Mailbox: %s\r\n"
-                                  "Waiting: %d\r\n\r\n", idText, mailbox, ret);
+       astman_start_ack(s, m);
+       astman_append(s, "Message: Mailbox Status\r\n"
+                        "Mailbox: %s\r\n"
+                        "Waiting: %d\r\n\r\n", mailbox, ret);
        return 0;
 }
 
@@ -1789,25 +1775,20 @@ static char mandescr_mailboxcount[] =
 static int action_mailboxcount(struct mansession *s, struct message *m)
 {
        char *mailbox = astman_get_header(m, "Mailbox");
-       char *id = astman_get_header(m,"ActionID");
-       char idText[256] = "";
        int newmsgs = 0, oldmsgs = 0;
        if (ast_strlen_zero(mailbox)) {
                astman_send_error(s, m, "Mailbox not specified");
                return 0;
        }
        ast_app_inboxcount(mailbox, &newmsgs, &oldmsgs);
-       if (!ast_strlen_zero(id)) {
-               snprintf(idText, sizeof(idText), "ActionID: %s\r\n",id);
-       }
-       astman_append(s, "Response: Success\r\n"
-                                  "%s"
+       astman_start_ack(s, m);
+       astman_append(s,
                                   "Message: Mailbox Message Count\r\n"
                                   "Mailbox: %s\r\n"
                                   "NewMessages: %d\r\n"
                                   "OldMessages: %d\r\n" 
                                   "\r\n",
-                                   idText,mailbox, newmsgs, oldmsgs);
+                                  mailbox, newmsgs, oldmsgs);
        return 0;
 }
 
@@ -1826,8 +1807,6 @@ static int action_extensionstate(struct mansession *s, struct message *m)
 {
        char *exten = astman_get_header(m, "Exten");
        char *context = astman_get_header(m, "Context");
-       char *id = astman_get_header(m,"ActionID");
-       char idText[256] = "";
        char hint[256] = "";
        int status;
        if (ast_strlen_zero(exten)) {
@@ -1838,17 +1817,13 @@ static int action_extensionstate(struct mansession *s, struct message *m)
                context = "default";
        status = ast_extension_state(NULL, context, exten);
        ast_get_hint(hint, sizeof(hint) - 1, NULL, 0, NULL, context, exten);
-        if (!ast_strlen_zero(id)) {
-                snprintf(idText, sizeof(idText), "ActionID: %s\r\n", id);
-        }
-       astman_append(s, "Response: Success\r\n"
-                                  "%s"
-                                  "Message: Extension Status\r\n"
-                                  "Exten: %s\r\n"
-                                  "Context: %s\r\n"
-                                  "Hint: %s\r\n"
-                                  "Status: %d\r\n\r\n",
-                                  idText,exten, context, hint, status);
+       astman_start_ack(s, m);
+       astman_append(s,   "Message: Extension Status\r\n"
+                          "Exten: %s\r\n"
+                          "Context: %s\r\n"
+                          "Hint: %s\r\n"
+                          "Status: %d\r\n\r\n",
+                          exten, context, hint, status);
        return 0;
 }