From 93715c46a99c96d6c866968312691ec9ab0f6a03 Mon Sep 17 00:00:00 2001 From: jcid Date: Sun, 7 Oct 2007 00:36:34 +0200 Subject: Initial revision --- dpi/hello.c | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 dpi/hello.c (limited to 'dpi/hello.c') diff --git a/dpi/hello.c b/dpi/hello.c new file mode 100644 index 00000000..bc316f5e --- /dev/null +++ b/dpi/hello.c @@ -0,0 +1,161 @@ +/* + * Dpi for "Hello World". + * + * This server is an example. Play with it and modify to your taste. + * + * Copyright 2003 Jorge Arellano Cid + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include "../dpip/dpip.h" +#include "dpiutil.h" + +/* + * Debugging macros + */ +#define _MSG(...) +#define MSG(...) printf("[hello dpi]: " __VA_ARGS__) + +/*---------------------------------------------------------------------------*/ + + +/* + * + */ +int main(void) +{ + FILE *in_stream; + SockHandler *sh; + char *dpip_tag, *cmd = NULL, *url = NULL, *child_cmd = NULL; + char *esc_tag, *d_cmd; + size_t n; + int ret; + char buf[4096]; + char *choice[] = {"Window was closed", "Yes", "No", + "Could be", "It's OK", "Cancel"}; + /* "Could>be", ">It's OK", "Can'>cel"}; --for testing */ + int choice_num; + + MSG("starting...\n"); + + /* Initialize the SockHandler */ + sh = sock_handler_new(STDIN_FILENO, STDOUT_FILENO, 2*1024); + + /* Read the dpi command from STDIN */ + dpip_tag = sock_handler_read(sh); + MSG("tag = [%s]\n", dpip_tag); + + cmd = a_Dpip_get_attr(dpip_tag, strlen(dpip_tag), "cmd"); + url = a_Dpip_get_attr(dpip_tag, strlen(dpip_tag), "url"); + +/*-- Dialog part */ +{ + char *dpip_tag2, *dialog_msg; + + /* Let's confirm the request */ + /* NOTE: you can send less alternatives (e.g. only alt1 and alt2) */ + d_cmd = a_Dpip_build_cmd( + "cmd=%s msg=%s alt1=%s alt2=%s alt3=%s alt4=%s alt5=%s", + "dialog", "Do you want to see the hello page?", + choice[1], choice[2], choice[3], choice[4], choice[5]); + sock_handler_write_str(sh, 1, d_cmd); + dFree(d_cmd); + + /* Get the answer */ + dpip_tag2 = sock_handler_read(sh); + MSG("tag = [%s]\n", dpip_tag2); + + /* Get "msg" value */ + dialog_msg = a_Dpip_get_attr(dpip_tag2, strlen(dpip_tag2), "msg"); + choice_num = 0; + if (dialog_msg) + choice_num = *dialog_msg - '0'; + + dFree(dialog_msg); + dFree(dpip_tag2); +} +/*-- EOD part */ + + /* Start sending our answer */ + d_cmd = a_Dpip_build_cmd("cmd=%s url=%s", "start_send_page", url); + sock_handler_write_str(sh, 0, d_cmd); + dFree(d_cmd); + + sock_handler_printf(sh, 0, + "Content-type: text/html\n\n" + "\n" + "\n" + "Simple dpi test page (hello.dpi)\n" + "

Hello world!


\n

\n"); + + /* Show the choice received with the dialog */ + sock_handler_printf(sh, 0, + "
\n" + "
\n" + "Dialog question: Do you want to see the hello page?
\n" + "Answer received: %s
\n" + "
\n", + choice[choice_num]); + + /* Show the dpip tag we received */ + esc_tag = Escape_html_str(dpip_tag); + sock_handler_printf(sh, 0, + "

dpip tag received:

\n" + "
\n%s
\n" + "
(dpip: dpi protocol)


\n", + esc_tag); + dFree(esc_tag); + + + /* Now something more interesting, + * fork a command and show its feedback */ + if (cmd && url) { + child_cmd = dStrdup("date -R"); + MSG("[%s]\n", child_cmd); + + /* Fork, exec command, get its output and answer */ + if ((in_stream = popen(child_cmd, "r")) == NULL) { + perror("popen"); + return EXIT_FAILURE; + } + + sock_handler_printf(sh, 0, "

date:

\n"); + sock_handler_printf(sh, 0, "
\n");
+
+      /* Read/Write */
+      while ((n = fread (buf, 1, 4096, in_stream)) > 0) {
+         sock_handler_write(sh, 0, buf, n);
+      }
+
+      sock_handler_printf(sh, 0, "
\n"); + + if ((ret = pclose(in_stream)) != 0) + MSG("popen: [%d]\n", ret); + + dFree(child_cmd); + } + + sock_handler_printf(sh, 1, "\n"); + + dFree(cmd); + dFree(url); + dFree(dpip_tag); + + /* Finish the SockHandler */ + sock_handler_close(sh); + sock_handler_free(sh); + + return 0; +} + -- cgit v1.2.3