diff options
Diffstat (limited to 'w3mbookmark.c')
-rw-r--r-- | w3mbookmark.c | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/w3mbookmark.c b/w3mbookmark.c new file mode 100644 index 0000000..74d7203 --- /dev/null +++ b/w3mbookmark.c @@ -0,0 +1,248 @@ +/* $Id: w3mbookmark.c,v 1.10 2003/09/23 18:42:25 ukai Exp $ */ +#include <stdlib.h> +#include <stdio.h> +#include "config.h" +#include "Str.h" +#include "indep.h" +#include "textlist.h" +#include "parsetag.h" + +#if LANG == JA +/* FIXME: gettextize here */ +#define BKMARK_TITLE "ブックマークの登録" +#define BKMARK_ADD "登録" +#define DEFAULT_SECTION "未分類" +#else +#define BKMARK_TITLE "Register to my bookmark" +#define BKMARK_ADD "ADD" +#define DEFAULT_SECTION "Miscellaneous" +#endif + +static char *bkmark_src1 = + "<html>\n\ +<head>\n\ +<title>" BKMARK_TITLE "</title>\n\ +</head>\n\ +<body>\n\ +<h1>" BKMARK_TITLE "</h1>\n\ +<form method=post action=\"file:///$LIB/" W3MBOOKMARK_CMDNAME "\">\n\ +<input type=hidden name=mode value=register>\n\ +<input type=hidden name=bmark value=\"%s\">\n\ +<input type=hidden name=cookie value=\"%s\">\n\ +<table cellpadding=0>\n"; + +static char *bkmark_src2 = + "<tr><td>New Section:<td><input type=text name=newsection size=60>\n\ +<tr><td>URL:<td><input type=text name=url value=\"%s\" size=60>\n\ +<tr><td>Title:<td><input type=text name=title value=\"%s\" size=60>\n\ +<tr><td><input type=submit value=\"" BKMARK_ADD "\">\n\ +</table>\n\ +</form>\n\ +</body>\n\ +</html>\n"; + +#undef FALSE +#define FALSE 0 +#undef TRUE +#define TRUE 1 + +static char end_section[] = + "<!--End of section (do not delete this comment)-->\n"; + +static char *Local_cookie = NULL; + +void +print_bookmark_panel(char *bmark, char *url, char *title) +{ + Str tmp, tmp2; + FILE *f; + char *p; + +#if LANG == JA + /* FIXME: gettextize here */ + printf("Content-Type: text/html; charset=EUC-JP\n\n"); +#else + printf("Content-Type: text/html\n\n"); +#endif + printf(bkmark_src1, html_quote(bmark), html_quote(Local_cookie)); + if ((f = fopen(bmark, "r")) != NULL) { + printf("<tr><td>Section:<td><select name=\"section\">\n"); + while (tmp = Strfgets(f), tmp->length > 0) { + Strremovefirstspaces(tmp); + if (Strncasecmp_charp(tmp, "<h2>", 4) == 0) { + p = tmp->ptr + 4; + tmp2 = Strnew(); + while (*p && *p != '<') + Strcat_char(tmp2, *p++); + printf("<option value=\"%s\">%s\n", tmp2->ptr, + tmp2->ptr); + } + } + printf("</select>\n"); + } + printf(bkmark_src2, html_quote(url), html_quote(title)); +} + +/* create new bookmark */ +static int +create_new_bookmark(char *bmark, char *section, char *title, char *url, + char *mode) +{ + FILE *f; + f = fopen(bmark, mode); + if (f == NULL) { + printf("\nCan't open bookmark %s\n", bmark); + return FALSE; + } + else { + fprintf(f, "<html><head><title>Bookmarks</title></head>\n"); + fprintf(f, "<body>\n<h1>Bookmarks</h1>\n"); + fprintf(f, "<h2>%s</h2>\n<ul>\n", section); + fprintf(f, "<li><a href=\"%s\">%s</a>\n", url, title); + fprintf(f, end_section); + fprintf(f, "</ul>\n</body>\n</html>\n"); + fclose(f); + } + return TRUE; +} + +int +insert_bookmark(char *bmark, struct parsed_tagarg *data) +{ + char *url, *title, *section; + FILE *f; + TextList *tl = newTextList(); + int section_found = 0; + int bmark_added = 0; + Str tmp, section_tmp; + + url = tag_get_value(data, "url"); + title = tag_get_value(data, "title"); + section = tag_get_value(data, "newsection"); + if (section == NULL || *section == '\0') + section = tag_get_value(data, "section"); + if (section == NULL || *section == '\0') + section = DEFAULT_SECTION; + + if (url == NULL || *url == '\0' || title == NULL || *title == '\0') { + /* Bookmark not added */ + return FALSE; + } + url = html_quote(url); + title = html_quote(title); + section = html_quote(section); + + f = fopen(bmark, "r"); + if (f == NULL) + return create_new_bookmark(bmark, section, title, url, "w"); + + section_tmp = Sprintf("<h2>%s</h2>\n", section); + for (;;) { + tmp = Strfgets(f); + if (tmp->length == 0) + break; + if (Strcasecmp(tmp, section_tmp) == 0) + section_found = 1; + if (section_found && !bmark_added) { + Strremovefirstspaces(tmp); + if (Strcmp_charp(tmp, end_section) == 0) { + pushText(tl, + Sprintf("<li><a href=\"%s\">%s</a>\n", url, + title)->ptr); + bmark_added = 1; + } + } + if (!bmark_added && Strcasecmp_charp(tmp, "</body>\n") == 0) { + pushText(tl, Sprintf("<h2>%s</h2>\n<ul>\n", section)->ptr); + pushText(tl, + Sprintf("<li><a href=\"%s\">%s</a>\n", url, title)->ptr); + pushText(tl, end_section); + pushText(tl, "</ul>\n"); + bmark_added = 1; + } + pushText(tl, tmp->ptr); + } + fclose(f); + if (!bmark_added) { + /* Bookmark not added; perhaps the bookmark file is ill-formed */ + /* In this case, a new bookmark is appeneded after the bookmark file */ + return create_new_bookmark(bmark, section, title, url, "a"); + } + f = fopen(bmark, "w"); + while (tl->nitem) { + fputs(popText(tl), f); + } + fclose(f); + return TRUE; +} + +int +main(int argc, char *argv[], char **envp) +{ + extern char *getenv(); + char *p; + int length; + Str qs = NULL; + struct parsed_tagarg *cgiarg; + char *mode; + char *bmark; + char *url; + char *title; + char *sent_cookie; + + p = getenv("REQUEST_METHOD"); + if (p == NULL || strcasecmp(p, "post")) + goto request_err; + p = getenv("CONTENT_LENGTH"); + if (p == NULL || (length = atoi(p)) <= 0) + goto request_err; + + qs = Strfgets(stdin); + Strchop(qs); + if (qs->length != length) + goto request_err; + cgiarg = cgistr2tagarg(qs->ptr); + + p = getenv("LOCAL_COOKIE_FILE"); + if (p) { + FILE *f = fopen(p, "r"); + if (f) { + Local_cookie = Strfgets(f)->ptr; + fclose(f); + } + } + sent_cookie = tag_get_value(cgiarg, "cookie"); + if (sent_cookie == NULL || Local_cookie == NULL || + strcmp(sent_cookie, Local_cookie) != 0) { + /* local cookie doesn't match: It may be an illegal invocation */ + printf("Content-Type: text/plain\n\n"); + printf("Local cookie doesn't match: It may be an illegal invocation\n"); + exit(1); + } + + mode = tag_get_value(cgiarg, "mode"); + bmark = expandPath(tag_get_value(cgiarg, "bmark")); + url = tag_get_value(cgiarg, "url"); + title = tag_get_value(cgiarg, "title"); + if (bmark == NULL || url == NULL) + goto request_err; + if (mode && !strcmp(mode, "panel")) { + if (title == NULL) + title = ""; + print_bookmark_panel(bmark, url, title); + } + else if (mode && !strcmp(mode, "register")) { + printf("Content-Type: text/plain\n"); + if (insert_bookmark(bmark, cgiarg)) { + printf("w3m-control: BACK\n"); + printf("w3m-control: BACK\n"); + } + printf("\n"); + } + return 0; + + request_err: + printf("Content-Type: text/plain\n\n"); + printf("Incomplete Request: %s\n", qs ? qs->ptr : "(null)"); + exit(1); +} |