"Fossies" - the Fresh Open Source Software Archive

Member "motion-Release-4.3.0/src/webu_text.c" (14 Jan 2020, 32499 Bytes) of package /linux/misc/motion-Release-4.3.0.tar.gz:


The requested HTML page contains a <FORM> tag that is unusable on "Fossies" in "automatic" (rendered) mode so that page is shown as HTML source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "webu_text.c" see the Fossies "Dox" file reference documentation.

    1 /*
    2  *    webu_text.c
    3  *
    4  *    Create the text(programatic) interface Motion
    5  *
    6  *    This software is distributed under the GNU Public License Version 2
    7  *    See also the file 'COPYING'.
    8  *
    9  *    This module processes the requests associated with the text inferface
   10  *    of the webcontrol.  This interface is intended to be used by programs
   11  *    and does not have any user interface to navigate.  The same actions
   12  *    are available as the HTML as well as a few more.
   13  *      Additional functions not directly available via HTML
   14  *          get:    Returns the value of a parameter.
   15  *          quit:   Terminates motion
   16  *          list:   Lists all the configuration parameters and values
   17  *          status  Whether the camera is in pause mode.
   18  *          connection  Whether the camera connection is working
   19  *
   20  */
   21 
   22 #include "motion.h"
   23 #include "webu.h"
   24 #include "webu_text.h"
   25 #include "translate.h"
   26 
   27 static void webu_text_seteol(struct webui_ctx *webui) {
   28     /* Set the end of line character for text interface */
   29     if (webui->cntlst[0]->conf.webcontrol_interface == 2) {
   30         snprintf(webui->text_eol, WEBUI_LEN_PARM,"%s","<br>");
   31     } else {
   32         snprintf(webui->text_eol, WEBUI_LEN_PARM,"%s","");
   33     }
   34 
   35 }
   36 
   37 static void webu_text_camera_name(struct webui_ctx *webui) {
   38     char response[WEBUI_LEN_RESP];
   39 
   40     if (webui->cntlst[webui->thread_nbr]->conf.camera_name == NULL){
   41         snprintf(response,sizeof(response),
   42             "Camera %s %s\n"
   43             ,webui->uri_camid,webui->text_eol
   44         );
   45     } else {
   46         snprintf(response,sizeof(response),
   47             "Camera %s %s\n"
   48             ,webui->cntlst[webui->thread_nbr]->conf.camera_name
   49             ,webui->text_eol
   50         );
   51     }
   52     webu_write(webui, response);
   53 
   54 }
   55 
   56 static void webu_text_back(struct webui_ctx *webui, const char *prevuri) {
   57     char response[WEBUI_LEN_RESP];
   58 
   59     if (webui->cntlst[0]->conf.webcontrol_interface == 2) {
   60         snprintf(response,sizeof(response),
   61             "<a href=/%s%s><- back</a><br><br>\n"
   62             ,webui->uri_camid, prevuri
   63         );
   64         webu_write(webui, response);
   65     }
   66 
   67 }
   68 
   69 static void webu_text_header(struct webui_ctx *webui) {
   70     char response[WEBUI_LEN_RESP];
   71 
   72     if (webui->cntlst[0]->conf.webcontrol_interface == 2) {
   73         snprintf(response, sizeof (response),"%s",
   74             "<!DOCTYPE html>\n"
   75             "<html>\n"
   76             "<head><title>Motion "VERSION" </title></head>\n"
   77             "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">\n"
   78             "<body>\n");
   79         webu_write(webui, response);
   80     }
   81 }
   82 
   83 static void webu_text_trailer(struct webui_ctx *webui) {
   84     char response[WEBUI_LEN_RESP];
   85 
   86     if (webui->cntlst[0]->conf.webcontrol_interface == 2) {
   87         snprintf(response, sizeof (response),"%s",
   88             "</body>\n"
   89             "</html>\n");
   90         webu_write(webui, response);
   91     }
   92 
   93 }
   94 
   95 void webu_text_badreq(struct webui_ctx *webui) {
   96     char response[WEBUI_LEN_RESP];
   97 
   98     webu_text_header(webui);
   99     snprintf(response, sizeof (response),
  100         "Bad Request %s\n"
  101         "The server did not understand your request. %s\n"
  102         ,webui->text_eol, webui->text_eol
  103     );
  104     webu_write(webui, response);
  105     webu_text_trailer(webui);
  106 
  107     return;
  108 }
  109 
  110 static void webu_text_page_raw(struct webui_ctx *webui) {
  111     /* Write the main page text */
  112     char response[WEBUI_LEN_RESP];
  113     int indx;
  114 
  115     snprintf(response, sizeof (response),
  116         "Motion "VERSION" Running [%d] Camera%s \n"
  117         ,webui->cam_count
  118         ,(webui->cam_count > 1 ? "s" : "")
  119     );
  120     webu_write(webui, response);
  121 
  122     if (webui->cam_threads > 1){
  123         for (indx = 1; indx < webui->cam_threads; indx++) {
  124             snprintf(response, sizeof (response),
  125                 "%d \n"
  126                 ,webui->cntlst[indx]->camera_id
  127             );
  128             webu_write(webui, response);
  129         }
  130     }
  131 
  132 }
  133 
  134 static void webu_text_page_basic(struct webui_ctx *webui) {
  135     /* Write the main page text */
  136     char response[WEBUI_LEN_RESP];
  137     int indx;
  138 
  139     webu_text_header(webui);
  140     snprintf(response, sizeof (response),
  141         "Motion "VERSION" Running [%d] Camera%s<br>\n"
  142         "<a href='/%d/'>All</a><br>\n"
  143         ,webui->cam_count, (webui->cam_count > 1 ? "s" : "")
  144         ,webui->cntlst[0]->camera_id);
  145     webu_write(webui, response);
  146 
  147     if (webui->cam_threads > 1){
  148         for (indx = 1; indx < webui->cam_threads; indx++) {
  149             if (webui->cntlst[indx]->conf.camera_name == NULL){
  150                 snprintf(response, sizeof (response),
  151                     "<a href='/%d/'>Camera %d</a><br>\n"
  152                     , webui->cntlst[indx]->camera_id
  153                     , indx);
  154                 webu_write(webui, response);
  155             } else {
  156                 snprintf(response, sizeof (response),
  157                     "<a href='/%d/'>Camera %s</a><br>\n"
  158                     , webui->cntlst[indx]->camera_id
  159                     ,webui->cntlst[indx]->conf.camera_name);
  160                 webu_write(webui, response);
  161             }
  162         }
  163     }
  164     webu_text_trailer(webui);
  165 
  166 }
  167 
  168 static void webu_text_list_raw(struct webui_ctx *webui) {
  169     /* Write out the options and values */
  170     char response[WEBUI_LEN_RESP];
  171     int indx_parm;
  172     const char *val_parm;
  173 
  174     indx_parm = 0;
  175     while (config_params[indx_parm].param_name != NULL){
  176 
  177         if ((config_params[indx_parm].webui_level > webui->cntlst[0]->conf.webcontrol_parms) ||
  178             (config_params[indx_parm].webui_level == WEBUI_LEVEL_NEVER) ||
  179             ((webui->thread_nbr != 0) && (config_params[indx_parm].main_thread != 0))){
  180             indx_parm++;
  181             continue;
  182         }
  183 
  184         val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, webui->thread_nbr);
  185         if (val_parm == NULL){
  186             val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, 0);
  187         }
  188         snprintf(response, sizeof (response),
  189             "  %s = %s \n"
  190             ,config_params[indx_parm].param_name
  191             ,val_parm
  192         );
  193         webu_write(webui, response);
  194 
  195         indx_parm++;
  196     }
  197 
  198 }
  199 
  200 static void webu_text_list_basic(struct webui_ctx *webui) {
  201     /* Write out the options and values */
  202     char response[WEBUI_LEN_RESP];
  203     int indx_parm;
  204     const char *val_parm;
  205 
  206     webu_text_header(webui);
  207 
  208     snprintf(response,sizeof(response),
  209         "<a href=/%s/config><- back</a><br><br>"
  210         ,webui->uri_camid
  211     );
  212     webu_write(webui, response);
  213 
  214     webu_text_camera_name(webui);
  215 
  216     snprintf(response,sizeof(response),"%s","<ul>\n");
  217     webu_write(webui, response);
  218 
  219     indx_parm = 0;
  220     while (config_params[indx_parm].param_name != NULL){
  221 
  222         if ((config_params[indx_parm].webui_level > webui->cntlst[0]->conf.webcontrol_parms) ||
  223             (config_params[indx_parm].webui_level == WEBUI_LEVEL_NEVER) ||
  224             ((webui->thread_nbr != 0) && (config_params[indx_parm].main_thread != 0))){
  225             indx_parm++;
  226             continue;
  227         }
  228 
  229         val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, webui->thread_nbr);
  230         if (val_parm == NULL){
  231             val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, 0);
  232         }
  233         snprintf(response, sizeof (response),
  234             "  <li><a href=/%s/config/set?%s>%s</a> = %s</li>\n"
  235             ,webui->uri_camid
  236             ,config_params[indx_parm].param_name
  237             ,config_params[indx_parm].param_name
  238             ,val_parm);
  239         webu_write(webui, response);
  240 
  241         indx_parm++;
  242     }
  243 
  244     snprintf(response,sizeof(response),"%s","</ul>\n");
  245     webu_write(webui, response);
  246 
  247     webu_text_trailer(webui);
  248 
  249 }
  250 
  251 static void webu_text_set_menu(struct webui_ctx *webui) {
  252 
  253     /* Write out the options and values to allow user to set them*/
  254     char response[WEBUI_LEN_RESP];
  255     int indx_parm;
  256     const char *val_parm;
  257 
  258     webu_text_header(webui);
  259 
  260     webu_text_back(webui,"/config");
  261 
  262     webu_text_camera_name(webui);
  263 
  264     snprintf(response, sizeof (response),"%s",
  265         "<script language='javascript'>function show() {\n"
  266         " top.location.href='set?'\n"
  267         " +document.n.onames.options[document.n.onames.selectedIndex].value\n"
  268         " +'='+document.s.valor.value;}\n"
  269         " </script>\n"
  270         "<form name='n'> \n"
  271         "<select name='onames'>\n"
  272     );
  273     webu_write(webui, response);
  274 
  275     indx_parm = 0;
  276     while (config_params[indx_parm].param_name != NULL){
  277 
  278         if ((config_params[indx_parm].webui_level > webui->cntlst[0]->conf.webcontrol_parms) ||
  279             (config_params[indx_parm].webui_level == WEBUI_LEVEL_NEVER) ||
  280             ((webui->thread_nbr != 0) && (config_params[indx_parm].main_thread != 0))){
  281             indx_parm++;
  282             continue;
  283         }
  284 
  285         val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, webui->thread_nbr);
  286         if (val_parm == NULL){
  287             val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, 0);
  288         }
  289         snprintf(response, sizeof(response),
  290             "<option value='%s'>%s</option>\n"
  291             ,config_params[indx_parm].param_name
  292             ,config_params[indx_parm].param_name
  293         );
  294         webu_write(webui, response);
  295 
  296         indx_parm++;
  297     }
  298 
  299     snprintf(response, sizeof (response),"%s",
  300         "</select>\n"
  301         "</form>\n"
  302         "<form action=set name='s'ONSUBMIT='if (!this.submitted) return false; else return true;'>\n"
  303         "<input type=text name='valor' value=''>\n"
  304         "<input type='button' value='set' onclick='javascript:show()'>\n"
  305         "</form>\n"
  306     );
  307     webu_write(webui, response);
  308 
  309     webu_text_trailer(webui);
  310 
  311 
  312 }
  313 
  314 static void webu_text_set_query(struct webui_ctx *webui) {
  315 
  316     /* Write out the options and values to allow user to set them*/
  317     char response[WEBUI_LEN_RESP];
  318     int indx_parm;
  319     const char *val_parm;
  320 
  321     webu_text_header(webui);
  322 
  323     webu_text_back(webui,"/config/list");
  324 
  325     webu_text_camera_name(webui);
  326 
  327     indx_parm = 0;
  328     while (config_params[indx_parm].param_name != NULL){
  329 
  330         if ((config_params[indx_parm].webui_level > webui->cntlst[0]->conf.webcontrol_parms) ||
  331             (config_params[indx_parm].webui_level == WEBUI_LEVEL_NEVER) ||
  332             ((webui->thread_nbr != 0) && (config_params[indx_parm].main_thread != 0)) ||
  333             (strcmp(webui->uri_parm1, config_params[indx_parm].param_name))) {
  334             indx_parm++;
  335             continue;
  336         }
  337 
  338         val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, webui->thread_nbr);
  339         if (val_parm == NULL){
  340             val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, 0);
  341         }
  342 
  343         snprintf(response, sizeof (response),
  344             "<form action=set?>\n"
  345             "%s <input type=text name='%s' value='%s' size=60>\n"
  346             "<input type='submit' value='set'>\n"
  347             ,config_params[indx_parm].param_name
  348             ,config_params[indx_parm].param_name
  349             ,val_parm
  350         );
  351         webu_write(webui, response);
  352 
  353         break;
  354 
  355         indx_parm++;
  356     }
  357 
  358     webu_text_trailer(webui);
  359 
  360 }
  361 
  362 static void webu_text_set_assign(struct webui_ctx *webui) {
  363     /* Set a particular configuration parameter to desired value */
  364 
  365     char response[WEBUI_LEN_RESP];
  366     int retcd;
  367 
  368     retcd = webu_process_config(webui);
  369 
  370     if (retcd == 0){
  371         webu_text_header(webui);
  372 
  373         webu_text_back(webui,"/config");
  374 
  375         snprintf(response,sizeof(response),
  376             "%s = %s %s\n"
  377             "Done %s\n"
  378             ,webui->uri_parm1
  379             ,webui->uri_value1
  380             ,webui->text_eol, webui->text_eol
  381         );
  382         webu_write(webui, response);
  383 
  384         webu_text_trailer(webui);
  385     } else {
  386         webu_text_badreq(webui);
  387     }
  388 
  389 }
  390 
  391 static void webu_text_get_menu(struct webui_ctx *webui) {
  392     char response[WEBUI_LEN_RESP];
  393     int indx_parm;
  394 
  395     webu_text_header(webui);
  396 
  397     webu_text_back(webui,"/config");
  398 
  399     webu_text_camera_name(webui);
  400 
  401     snprintf(response, sizeof (response),"%s",
  402         "<form action=get>\n"
  403         "<select name='query'>\n"
  404     );
  405     webu_write(webui, response);
  406 
  407     indx_parm = 0;
  408     while (config_params[indx_parm].param_name != NULL){
  409 
  410         if ((config_params[indx_parm].webui_level > webui->cntlst[0]->conf.webcontrol_parms) ||
  411             (config_params[indx_parm].webui_level == WEBUI_LEVEL_NEVER) ||
  412             ((webui->thread_nbr != 0) && (config_params[indx_parm].main_thread != 0))){
  413             indx_parm++;
  414             continue;
  415         }
  416 
  417         snprintf(response, sizeof(response),
  418             "<option value='%s'>%s</option>\n"
  419             ,config_params[indx_parm].param_name
  420             ,config_params[indx_parm].param_name
  421         );
  422         webu_write(webui, response);
  423 
  424         indx_parm++;
  425     }
  426 
  427     snprintf(response, sizeof (response),"%s",
  428         "</select>\n"
  429         "<input type='submit' value='get'>\n"
  430         "</form>\n"
  431     );
  432     webu_write(webui, response);
  433 
  434     webu_text_trailer(webui);
  435 
  436 }
  437 
  438 static void webu_text_action_quit(struct webui_ctx *webui) {
  439     /* Shut down motion or the associated thread */
  440     char response[WEBUI_LEN_RESP];
  441 
  442     webu_process_action(webui);
  443 
  444     webu_text_back(webui,"/action");
  445 
  446     webu_text_header(webui);
  447     snprintf(response,sizeof(response),
  448         "quit in progress ... bye %s\nDone %s\n"
  449         ,webui->text_eol, webui->text_eol
  450     );
  451     webu_write(webui, response);
  452     webu_text_trailer(webui);
  453 
  454 }
  455 
  456 static void webu_text_action_makemovie(struct webui_ctx *webui) {
  457     /* end the event.  Legacy api name*/
  458 
  459     char response[WEBUI_LEN_RESP];
  460 
  461     webu_process_action(webui);
  462 
  463     webu_text_back(webui,"/action");
  464 
  465     webu_text_header(webui);
  466 
  467     snprintf(response,sizeof(response)
  468         ,"makemovie for camera %d %s\nDone%s\n"
  469         ,webui->cnt->camera_id
  470         ,webui->text_eol,webui->text_eol
  471     );
  472     webu_write(webui, response);
  473 
  474     webu_text_trailer(webui);
  475 
  476 }
  477 
  478 static void webu_text_action_eventstart(struct webui_ctx *webui) {
  479     /* Start the event*/
  480 
  481     char response[WEBUI_LEN_RESP];
  482 
  483     webu_process_action(webui);
  484 
  485     webu_text_header(webui);
  486 
  487     webu_text_back(webui,"/action");
  488 
  489     snprintf(response,sizeof(response)
  490         ,"Start event for camera %d %s\nDone%s\n"
  491         ,webui->cnt->camera_id
  492         ,webui->text_eol,webui->text_eol
  493     );
  494     webu_write(webui, response);
  495 
  496     webu_text_trailer(webui);
  497 
  498 }
  499 
  500 static void webu_text_action_eventend(struct webui_ctx *webui) {
  501     /* End any active event*/
  502 
  503     char response[WEBUI_LEN_RESP];
  504 
  505     webu_process_action(webui);
  506 
  507     webu_text_header(webui);
  508 
  509     webu_text_back(webui,"/action");
  510 
  511     snprintf(response,sizeof(response)
  512         ,"End event for camera %d %s\nDone %s\n"
  513         ,webui->cnt->camera_id
  514         ,webui->text_eol,webui->text_eol
  515     );
  516     webu_write(webui, response);
  517 
  518     webu_text_trailer(webui);
  519 
  520 }
  521 
  522 static void webu_text_action_snapshot(struct webui_ctx *webui) {
  523     /* trigger a snapshot*/
  524 
  525     char response[WEBUI_LEN_RESP];
  526 
  527     webu_process_action(webui);
  528 
  529     webu_text_header(webui);
  530 
  531     webu_text_back(webui,"/action");
  532 
  533     snprintf(response,sizeof(response)
  534         ,"Snapshot for camera %d %s\nDone%s\n"
  535         ,webui->cnt->camera_id
  536         ,webui->text_eol,webui->text_eol
  537     );
  538     webu_write(webui, response);
  539 
  540     webu_text_trailer(webui);
  541 
  542 }
  543 
  544 static void webu_text_action_restart(struct webui_ctx *webui) {
  545     /* Restart*/
  546 
  547     char response[WEBUI_LEN_RESP];
  548 
  549     webu_process_action(webui);
  550 
  551     webu_text_header(webui);
  552 
  553     webu_text_back(webui,"/action");
  554 
  555     snprintf(response,sizeof(response)
  556         ,"Restart in progress ...%s\nDone %s\n"
  557         ,webui->text_eol,webui->text_eol
  558     );
  559     webu_write(webui, response);
  560 
  561     webu_text_trailer(webui);
  562 
  563 }
  564 
  565 static void webu_text_action_start(struct webui_ctx *webui) {
  566     /* un-pause the camera*/
  567 
  568     char response[WEBUI_LEN_RESP];
  569 
  570     webu_process_action(webui);
  571 
  572     webu_text_header(webui);
  573 
  574     webu_text_back(webui,"/detection");
  575 
  576     snprintf(response,sizeof(response)
  577         ,"Camera %d Detection resumed%s\nDone %s\n"
  578         ,webui->cnt->camera_id
  579         ,webui->text_eol,webui->text_eol
  580     );
  581     webu_write(webui, response);
  582 
  583     webu_text_trailer(webui);
  584 
  585 }
  586 
  587 static void webu_text_action_pause(struct webui_ctx *webui) {
  588     /* pause the camera*/
  589 
  590     char response[WEBUI_LEN_RESP];
  591 
  592     webu_process_action(webui);
  593 
  594     webu_text_header(webui);
  595 
  596     webu_text_back(webui,"/detection");
  597 
  598     snprintf(response,sizeof(response)
  599         ,"Camera %d Detection paused%s\nDone %s\n"
  600         ,webui->cnt->camera_id
  601         ,webui->text_eol,webui->text_eol
  602     );
  603     webu_write(webui, response);
  604 
  605     webu_text_trailer(webui);
  606 
  607 }
  608 
  609 static void webu_text_action_write(struct webui_ctx *webui) {
  610     /* write the parms to file*/
  611 
  612     char response[WEBUI_LEN_RESP];
  613 
  614     webu_process_action(webui);
  615 
  616     webu_text_header(webui);
  617 
  618     webu_text_back(webui,"/config");
  619 
  620     snprintf(response,sizeof(response)
  621         ,"Camera %d write %s\nDone %s\n"
  622         ,webui->cnt->camera_id
  623         ,webui->text_eol,webui->text_eol
  624     );
  625     webu_write(webui, response);
  626 
  627     webu_text_trailer(webui);
  628 
  629 }
  630 
  631 static void webu_text_action(struct webui_ctx *webui) {
  632     /* Call the action functions */
  633 
  634     if (!strcmp(webui->uri_cmd2,"makemovie")){
  635         webu_text_action_makemovie(webui);
  636 
  637     } else if (strcmp(webui->uri_cmd2,"eventstart") == 0){
  638         webu_text_action_eventstart(webui);
  639 
  640     } else if (!strcmp(webui->uri_cmd2,"eventend")){
  641         webu_text_action_eventend(webui);
  642 
  643     } else if (!strcmp(webui->uri_cmd2,"snapshot")){
  644         webu_text_action_snapshot(webui);
  645 
  646     } else if (!strcmp(webui->uri_cmd2,"restart")){
  647         webu_text_action_restart(webui);
  648 
  649     } else if (!strcmp(webui->uri_cmd2,"start")){
  650         webu_text_action_start(webui);
  651 
  652     } else if (!strcmp(webui->uri_cmd2,"pause")){
  653         webu_text_action_pause(webui);
  654 
  655     } else if ((!strcmp(webui->uri_cmd2,"quit")) ||
  656                (!strcmp(webui->uri_cmd2,"end"))){
  657         webu_text_action_quit(webui);
  658 
  659     } else if ((!strcmp(webui->uri_cmd2,"write")) ||
  660                (!strcmp(webui->uri_cmd2,"writeyes"))){
  661         webu_text_action_write(webui);
  662 
  663     } else {
  664         webu_text_badreq(webui);
  665         MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO,
  666             _("Invalid action requested: >%s< >%s< >%s<")
  667             ,webui->uri_camid, webui->uri_cmd1, webui->uri_cmd2);
  668         return;
  669     }
  670 
  671 }
  672 
  673 static void webu_text_track_pantilt(struct webui_ctx *webui) {
  674     /* Call the track function */
  675     char response[WEBUI_LEN_RESP];
  676 
  677     webu_text_header(webui);
  678 
  679     webu_text_back(webui,"/track");
  680 
  681     webu_text_camera_name(webui);
  682 
  683     snprintf(response,sizeof(response),"%s",
  684         "<form action='set'>\n"
  685         "Pan<input type=text name='pan' value=''>\n"
  686         "Tilt<input type=text name='tilt' value=''>\n"
  687         "<input type=submit value='set relative'>\n"
  688         "</form>\n"
  689         "<form action='set'>\n"
  690         "X<input type=text name='x' value=''>\n"
  691         "Y<input type=text name='y' value=''>\n"
  692         "<input type=submit value='set absolute'>\n"
  693         "</form>\n"
  694     );
  695     webu_write(webui, response);
  696     webu_text_trailer(webui);
  697 
  698 }
  699 
  700 static void webu_text_track(struct webui_ctx *webui) {
  701     /* Call the track function */
  702     char response[WEBUI_LEN_RESP];
  703     int retcd;
  704 
  705     retcd = webu_process_track(webui);
  706     if (retcd == 0){
  707         webu_text_header(webui);
  708 
  709         webu_text_back(webui,"/track");
  710 
  711         webu_text_camera_name(webui);
  712 
  713         snprintf(response,sizeof(response)
  714             ,"Track %s %s\n"
  715             "Done %s\n"
  716             ,webui->uri_cmd2,webui->text_eol
  717             ,webui->text_eol
  718         );
  719         webu_write(webui, response);
  720 
  721         webu_text_trailer(webui);
  722     } else {
  723         webu_text_badreq(webui);
  724     }
  725 
  726 }
  727 
  728 static void webu_text_menu(struct webui_ctx *webui) {
  729     char response[WEBUI_LEN_RESP];
  730 
  731     webu_text_header(webui);
  732 
  733     snprintf(response,sizeof(response),
  734         "<a href=/><- back</a><br><br>"
  735     );
  736     webu_write(webui, response);
  737 
  738     webu_text_camera_name(webui);
  739     snprintf(response,sizeof(response),
  740             "<a href='/%s/config'>config</a><br>\n"
  741             "<a href='/%s/action'>action</a><br>\n"
  742             "<a href='/%s/detection'>detection</a><br>\n"
  743             "<a href='/%s/track'>track</a><br>\n"
  744         ,webui->uri_camid, webui->uri_camid
  745         ,webui->uri_camid, webui->uri_camid
  746     );
  747     webu_write(webui, response);
  748     webu_text_trailer(webui);
  749 
  750 }
  751 
  752 static void webu_text_menu_config(struct webui_ctx *webui) {
  753     char response[WEBUI_LEN_RESP];
  754 
  755     webu_text_header(webui);
  756 
  757     webu_text_back(webui,"/");
  758 
  759     webu_text_camera_name(webui);
  760     snprintf(response,sizeof(response),
  761         "<a href=/%s/config/list>list</a><br>"
  762         "<a href=/%s/config/write>write</a><br>"
  763         "<a href=/%s/config/set>set</a><br>"
  764         "<a href=/%s/config/get>get</a><br>"
  765         ,webui->uri_camid, webui->uri_camid
  766         ,webui->uri_camid, webui->uri_camid
  767     );
  768     webu_write(webui, response);
  769     webu_text_trailer(webui);
  770 
  771 }
  772 
  773 static void webu_text_menu_action(struct webui_ctx *webui) {
  774     char response[WEBUI_LEN_RESP];
  775 
  776     webu_text_header(webui);
  777 
  778     webu_text_back(webui,"/");
  779 
  780     webu_text_camera_name(webui);
  781     snprintf(response,sizeof(response),
  782         "<a href=/%s/action/eventstart>eventstart</a><br>"
  783         "<a href=/%s/action/eventend>eventend</a><br>"
  784         "<a href=/%s/action/snapshot>snapshot</a><br>"
  785         "<a href=/%s/action/restart>restart</a><br>"
  786         "<a href=/%s/action/quit>quit</a><br>"
  787         "<a href=/%s/action/end>end</a><br>"
  788         ,webui->uri_camid, webui->uri_camid, webui->uri_camid
  789         ,webui->uri_camid, webui->uri_camid, webui->uri_camid
  790     );
  791     webu_write(webui, response);
  792     webu_text_trailer(webui);
  793 
  794 }
  795 
  796 static void webu_text_menu_detection(struct webui_ctx *webui) {
  797     char response[WEBUI_LEN_RESP];
  798 
  799     webu_text_header(webui);
  800 
  801     webu_text_back(webui,"/");
  802 
  803     webu_text_camera_name(webui);
  804 
  805     snprintf(response,sizeof(response),
  806         "<a href=/%s/detection/status>status</a><br>"
  807         "<a href=/%s/detection/start>start</a><br>"
  808         "<a href=/%s/detection/pause>pause</a><br>"
  809         "<a href=/%s/detection/connection>connection</a><br>"
  810         ,webui->uri_camid, webui->uri_camid
  811         ,webui->uri_camid, webui->uri_camid
  812     );
  813     webu_write(webui, response);
  814     webu_text_trailer(webui);
  815 
  816 }
  817 
  818 static void webu_text_menu_track(struct webui_ctx *webui) {
  819     char response[WEBUI_LEN_RESP];
  820 
  821     webu_text_header(webui);
  822 
  823     webu_text_back(webui,"/");
  824 
  825     webu_text_camera_name(webui);
  826 
  827     snprintf(response,sizeof(response),
  828         "<a href=/%s/track/set>track set pan/tilt</a><br>"
  829         "<a href=/%s/track/center>track center</a><br>"
  830         ,webui->uri_camid, webui->uri_camid
  831     );
  832     webu_write(webui, response);
  833 
  834     webu_text_trailer(webui);
  835 
  836 }
  837 
  838 static void webu_text_submenu(struct webui_ctx *webui) {
  839 
  840     if ((!strcmp(webui->uri_cmd1,"config")) &&
  841         (strlen(webui->uri_cmd2) == 0)) {
  842         webu_text_menu_config(webui);
  843 
  844     } else if ((!strcmp(webui->uri_cmd1,"action")) &&
  845                 (strlen(webui->uri_cmd2) == 0)) {
  846         webu_text_menu_action(webui);
  847 
  848     } else if ((!strcmp(webui->uri_cmd1,"detection")) &&
  849                 (strlen(webui->uri_cmd2) == 0)) {
  850         webu_text_menu_detection(webui);
  851 
  852     } else if ((!strcmp(webui->uri_cmd1,"track")) &&
  853                 (strlen(webui->uri_cmd2) == 0)) {
  854         webu_text_menu_track(webui);
  855 
  856     } else {
  857         MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO,
  858             _("Invalid action requested: >%s< >%s< >%s<")
  859             ,webui->uri_camid, webui->uri_cmd1, webui->uri_cmd2);
  860         webu_text_badreq(webui);
  861     }
  862 
  863 }
  864 
  865 void webu_text_get_query(struct webui_ctx *webui) {
  866     /* Write out the option value for one parm */
  867     char response[WEBUI_LEN_RESP];
  868     int indx_parm;
  869     const char *val_parm;
  870     char temp_name[WEBUI_LEN_PARM];
  871 
  872 
  873     /* Search through the depreciated parms and if applicable,
  874      * get the new parameter name so we can check its webcontrol_parms level
  875      */
  876     snprintf(temp_name, WEBUI_LEN_PARM, "%s", webui->uri_value1);
  877     indx_parm=0;
  878     while (dep_config_params[indx_parm].name != NULL) {
  879         if (strcmp(dep_config_params[indx_parm].name, webui->uri_value1) == 0){
  880             snprintf(temp_name, WEBUI_LEN_PARM, "%s", dep_config_params[indx_parm].newname);
  881             break;
  882         }
  883         indx_parm++;
  884     }
  885 
  886     indx_parm = 0;
  887     while (config_params[indx_parm].param_name != NULL){
  888 
  889         if ((config_params[indx_parm].webui_level > webui->cntlst[0]->conf.webcontrol_parms) ||
  890             (config_params[indx_parm].webui_level == WEBUI_LEVEL_NEVER) ||
  891             strcmp(webui->uri_parm1,"query") ||
  892             strcmp(temp_name, config_params[indx_parm].param_name)){
  893             indx_parm++;
  894             continue;
  895         }
  896 
  897         val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, webui->thread_nbr);
  898         if (val_parm == NULL){
  899             val_parm = config_params[indx_parm].print(webui->cntlst, NULL, indx_parm, 0);
  900         }
  901 
  902         if (strcmp(webui->uri_value1, config_params[indx_parm].param_name) != 0){
  903             MOTION_LOG(NTC, TYPE_STREAM, NO_ERRNO
  904             , _("'%s' option is depreciated.  New option name is '%s'")
  905             ,webui->uri_value1, config_params[indx_parm].param_name);
  906         }
  907 
  908         webu_text_header(webui);
  909 
  910         webu_text_back(webui,"/config");
  911 
  912         webu_text_camera_name(webui);
  913 
  914         if (webui->cntlst[0]->conf.webcontrol_interface == 2) {
  915             snprintf(response, sizeof (response),
  916                 "<ul>\n"
  917                 "  <li>%s = %s </li>\n"
  918                 "</ul>\n"
  919                 ,config_params[indx_parm].param_name
  920                 ,val_parm
  921             );
  922         } else {
  923             snprintf(response, sizeof (response),
  924                 "%s = %s %s\n"
  925                 "Done %s\n"
  926                 ,config_params[indx_parm].param_name
  927                 ,val_parm
  928                 ,webui->text_eol, webui->text_eol
  929             );
  930         }
  931         webu_write(webui, response);
  932         webu_text_trailer(webui);
  933 
  934         break;
  935     }
  936 
  937     if (config_params[indx_parm].param_name == NULL){
  938         webu_text_badreq(webui);
  939     }
  940 
  941 }
  942 
  943 void webu_text_status(struct webui_ctx *webui) {
  944     /* Write out the pause/active status */
  945 
  946     char response[WEBUI_LEN_RESP];
  947     int indx, indx_st;
  948 
  949     webu_text_header(webui);
  950 
  951     webu_text_back(webui,"/detection");
  952 
  953     if (webui->thread_nbr == 0){
  954         indx_st = 1;
  955         if (webui->cam_threads == 1) indx_st = 0;
  956 
  957         for (indx = indx_st; indx < webui->cam_threads; indx++) {
  958             snprintf(response, sizeof(response),
  959                 "Camera %d Detection status %s %s\n"
  960                 ,webui->cntlst[indx]->camera_id
  961                 ,(!webui->cntlst[indx]->running)? "NOT RUNNING":
  962                 (webui->cntlst[indx]->pause)? "PAUSE":"ACTIVE"
  963                 ,webui->text_eol
  964             );
  965             webu_write(webui, response);
  966         }
  967     } else {
  968         snprintf(response, sizeof(response),
  969             "Camera %d Detection status %s %s\n"
  970             ,webui->cnt->camera_id
  971             ,(!webui->cnt->running)? "NOT RUNNING":
  972             (webui->cnt->pause)? "PAUSE":"ACTIVE"
  973             ,webui->text_eol
  974         );
  975         webu_write(webui, response);
  976     }
  977     webu_text_trailer(webui);
  978 }
  979 
  980 void webu_text_connection(struct webui_ctx *webui) {
  981     /* Write out the connection status */
  982     char response[WEBUI_LEN_RESP];
  983     int indx, indx_st;
  984 
  985     webu_text_header(webui);
  986 
  987     webu_text_back(webui,"/detection");
  988 
  989     webu_text_camera_name(webui);
  990 
  991     if (webui->thread_nbr == 0){
  992         indx_st = 1;
  993         if (webui->cam_threads == 1) indx_st = 0;
  994 
  995         for (indx = indx_st; indx < webui->cam_threads; indx++) {
  996             snprintf(response,sizeof(response)
  997                 , "Camera %d%s%s %s %s\n"
  998                 ,webui->cntlst[indx]->camera_id
  999                 ,webui->cntlst[indx]->conf.camera_name ? " -- " : ""
 1000                 ,webui->cntlst[indx]->conf.camera_name ? webui->cntlst[indx]->conf.camera_name : ""
 1001                 ,(!webui->cntlst[indx]->running)? "NOT RUNNING" :
 1002                 (webui->cntlst[indx]->lost_connection)? "Lost connection": "Connection OK"
 1003                 ,webui->text_eol
 1004             );
 1005             webu_write(webui, response);
 1006         }
 1007     } else {
 1008         snprintf(response,sizeof(response)
 1009             , "Camera %d%s%s %s %s\n"
 1010             ,webui->cnt->camera_id
 1011             ,webui->cnt->conf.camera_name ? " -- " : ""
 1012             ,webui->cnt->conf.camera_name ? webui->cnt->conf.camera_name : ""
 1013             ,(!webui->cnt->running)? "NOT RUNNING" :
 1014              (webui->cnt->lost_connection)? "Lost connection": "Connection OK"
 1015             ,webui->text_eol
 1016         );
 1017         webu_write(webui, response);
 1018     }
 1019     webu_text_trailer(webui);
 1020 }
 1021 
 1022 void webu_text_list(struct webui_ctx *webui) {
 1023 
 1024     if (webui->cntlst[0]->conf.webcontrol_interface == 2) {
 1025         webu_text_list_basic(webui);
 1026     } else {
 1027         webu_text_list_raw(webui);
 1028     }
 1029 
 1030 }
 1031 
 1032 void webu_text_main(struct webui_ctx *webui) {
 1033 
 1034     /* Main entry point for processing requests for the text interface */
 1035 
 1036     webu_text_seteol(webui);
 1037 
 1038     if (strlen(webui->uri_camid) == 0){
 1039         if (webui->cntlst[0]->conf.webcontrol_interface == 2) {
 1040             webu_text_page_basic(webui);
 1041         } else {
 1042             webu_text_page_raw(webui);
 1043         }
 1044 
 1045     } else if (strlen(webui->uri_cmd1) == 0) {
 1046         webu_text_menu(webui);
 1047 
 1048     } else if (strlen(webui->uri_cmd2) == 0) {
 1049         webu_text_submenu(webui);
 1050 
 1051     } else if ((!strcmp(webui->uri_cmd1,"config")) &&
 1052                (!strcmp(webui->uri_cmd2,"set")) &&
 1053                (strlen(webui->uri_parm1) == 0)) {
 1054         webu_text_set_menu(webui);
 1055 
 1056     } else if ((!strcmp(webui->uri_cmd1,"config")) &&
 1057                (!strcmp(webui->uri_cmd2,"set")) &&
 1058                (strlen(webui->uri_parm1) > 0) &&
 1059                (strlen(webui->uri_value1) == 0) ) {
 1060         webu_text_set_query(webui);
 1061 
 1062     } else if ((!strcmp(webui->uri_cmd1,"config")) &&
 1063                (!strcmp(webui->uri_cmd2,"set"))) {
 1064         webu_text_set_assign(webui);
 1065 
 1066     } else if ((!strcmp(webui->uri_cmd1,"config")) &&
 1067                (!strcmp(webui->uri_cmd2,"write"))) {
 1068         webu_text_action(webui);
 1069 
 1070     } else if ((!strcmp(webui->uri_cmd1,"config")) &&
 1071                (!strcmp(webui->uri_cmd2,"list"))) {
 1072         webu_text_list(webui);
 1073 
 1074     } else if ((!strcmp(webui->uri_cmd1,"config")) &&
 1075                (!strcmp(webui->uri_cmd2,"get")) &&
 1076                (strlen(webui->uri_parm1) == 0)) {
 1077         webu_text_get_menu(webui);
 1078 
 1079     } else if ((!strcmp(webui->uri_cmd1,"config")) &&
 1080                (!strcmp(webui->uri_cmd2,"get"))) {
 1081         webu_text_get_query(webui);
 1082 
 1083     } else if ((!strcmp(webui->uri_cmd1,"detection")) &&
 1084                (!strcmp(webui->uri_cmd2,"status"))) {
 1085         webu_text_status(webui);
 1086 
 1087     } else if ((!strcmp(webui->uri_cmd1,"detection")) &&
 1088                (!strcmp(webui->uri_cmd2,"connection"))) {
 1089         webu_text_connection(webui);
 1090 
 1091     } else if ((!strcmp(webui->uri_cmd1,"detection")) &&
 1092                (!strcmp(webui->uri_cmd2,"start"))) {
 1093         webu_text_action(webui);
 1094 
 1095     } else if ((!strcmp(webui->uri_cmd1,"detection")) &&
 1096                (!strcmp(webui->uri_cmd2,"pause"))) {
 1097         webu_text_action(webui);
 1098 
 1099     } else if ((strcmp(webui->uri_cmd1,"action") == 0) &&
 1100                (strcmp(webui->uri_cmd2,"quit") == 0)){
 1101         webu_text_action(webui);
 1102 
 1103     } else if ((strcmp(webui->uri_cmd1,"action") == 0) &&
 1104                (strcmp(webui->uri_cmd2,"end") == 0)){
 1105         webu_text_action(webui);
 1106 
 1107     } else if (!strcmp(webui->uri_cmd1,"action")) {
 1108         webu_text_action(webui);
 1109 
 1110     } else if ((strcmp(webui->uri_cmd1,"track") == 0) &&
 1111                (strcmp(webui->uri_cmd2,"set") == 0) &&
 1112                (strlen(webui->uri_parm1) == 0)) {
 1113         webu_text_track_pantilt(webui);
 1114 
 1115     } else if ((strcmp(webui->uri_cmd1,"track") == 0)){
 1116         webu_text_track(webui);
 1117 
 1118     } else{
 1119         MOTION_LOG(INF, TYPE_STREAM, NO_ERRNO,
 1120             _("Invalid action requested: >%s< >%s< >%s<")
 1121             ,webui->uri_camid, webui->uri_cmd1, webui->uri_cmd2);
 1122         webu_text_badreq(webui);
 1123     }
 1124 
 1125     return;
 1126 }