X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fnotes.c;h=ccc530d2ed511c12afb9937435e60a3918ae6ac5;hb=b106481a6ccadf02a8a646c03df2a07fa634c375;hp=d41ed4d2f6e53d2562d651aed8e1f34ea7176be6;hpb=8c7819e29bd976ec4882075f12480c12dc3691bd;p=citadel.git diff --git a/webcit/notes.c b/webcit/notes.c index d41ed4d2f..ccc530d2e 100644 --- a/webcit/notes.c +++ b/webcit/notes.c @@ -1,137 +1,381 @@ /* * $Id$ + * */ -/** - * \defgroup StickyNotes Functions which handle "sticky notes" - * \ingroup WebcitDisplayItems - */ -/*@{*/ + #include "webcit.h" #include "groupdav.h" #include "webserver.h" -/** - * \brief display sticky notes - * \param msgnum the citadel mesage number +int pastel_palette[9][3] = { + { 0x80, 0x80, 0x80 }, + { 0xff, 0x80, 0x80 }, + { 0x80, 0x80, 0xff }, + { 0xff, 0xff, 0x80 }, + { 0x80, 0xff, 0x80 }, + { 0xff, 0x80, 0xff }, + { 0x80, 0xff, 0xff }, + { 0xff, 0x80, 0x80 }, + { 0x80, 0x80, 0x80 } +}; + + +/* + * Display a
containing a rendered sticky note. */ -void display_note(long msgnum) -{ - char buf[SIZ]; - char notetext[SIZ]; - char display_notetext[SIZ]; - char eid[128]; - int in_text = 0; - int i, len; +void display_vnote_div(struct vnote *v) { + int i; - wprintf("\n"); - serv_printf("MSG0 %ld", msgnum); - serv_getln(buf, sizeof buf); - if (buf[0] != '1') { - wprintf("%s
\n", &buf[4]); - return; + wprintf("
uid); // begin outer div + wprintf("class=\"stickynote_outer\" "); + wprintf("style=\""); + wprintf("left: %dpx; ", v->pos_left); + wprintf("top: %dpx; ", v->pos_top); + wprintf("width: %dpx; ", v->pos_width); + wprintf("height: %dpx; ", v->pos_height); + wprintf("background-color: #%02X%02X%02X ", v->color_red, v->color_green, v->color_blue); + wprintf("\">"); + + + + + + wprintf("
uid); // begin title bar div + wprintf("class=\"stickynote_titlebar\" "); + wprintf("onMouseDown=\"NotesDragMouseDown(event,'%s')\" ", v->uid); + wprintf("style=\""); + wprintf("background-color: #%02X%02X%02X ", v->color_red/2, v->color_green/2, v->color_blue/2); + wprintf("\">"); + + wprintf(""); + + wprintf(""); + + wprintf(""); // nothing in the title bar, it's just for dragging + + wprintf("
"); + wprintf("uid); + wprintf("src=\"static/8paint16.gif\">"); + + wprintf(""); + wprintf("uid, _("Delete this note?") ); + wprintf("src=\"static/closewindow.gif\">"); + wprintf("
"); + + wprintf("
\n"); // end title bar div + + + + + + wprintf("
uid); // begin body div + wprintf("class=\"stickynote_body\""); + wprintf(">"); + escputs(v->body); + wprintf("
\n"); // end body div + + wprintf("\n"); + + + + wprintf("
uid); // begin resize handle div + wprintf("class=\"stickynote_resize\" "); + wprintf("onMouseDown=\"NotesResizeMouseDown(event,'%s')\"", v->uid); + wprintf(">
"); // end resize handle div + + + + + /* embed color selector - it doesn't have to be inside the title bar html because + * it's a separate div placed by css + */ + wprintf("
uid); // begin stickynote_palette div + wprintf("class=\"stickynote_palette\">"); + + wprintf(""); + for (i=0; i<9; ++i) { + if ((i%3)==0) wprintf(""); + wprintf("", + pastel_palette[i][0], + pastel_palette[i][1], + pastel_palette[i][2] + ); + if (((i+1)%3)==0) wprintf(""); } + wprintf("
uid, + pastel_palette[i][0], // color values to pass to ajax call + pastel_palette[i][1], + pastel_palette[i][2], + pastel_palette[i][0], // new color of note + pastel_palette[i][1], + pastel_palette[i][2], + pastel_palette[i][0] / 2, // new color of title bar + pastel_palette[i][1] / 2, + pastel_palette[i][2] / 2 + ); + wprintf("bgcolor=\"#%02x%02x%02x\">
"); - strcpy(notetext, ""); - strcpy(eid, ""); - while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { + wprintf("
"); // end stickynote_palette div - /** Fill the buffer */ - if ( (in_text) && (strlen(notetext) < SIZ-256) ) { - strcat(notetext, buf); - } - if ( (!in_text) && (!strncasecmp(buf, "exti=", 5)) ) { - safestrncpy(eid, &buf[5], sizeof eid); - } - if ( (!in_text) && (!strcasecmp(buf, "text")) ) { - in_text = 1; + + + wprintf("
\n"); // end outer div +} + + + +/* + * Fetch a message from the server and extract a vNote from it + */ +struct vnote *vnote_new_from_msg(long msgnum) { + char buf[1024]; + char mime_partnum[256]; + char mime_filename[256]; + char mime_content_type[256]; + char mime_disposition[256]; + int mime_length; + char relevant_partnum[256]; + char *relevant_source = NULL; + char uid_from_headers[256]; + int in_body = 0; + int body_line_len = 0; + int body_len = 0; + struct vnote *vnote_from_body = NULL; + + relevant_partnum[0] = 0; + uid_from_headers[0] = 0; + sprintf(buf, "MSG4 %ld", msgnum); /* we need the mime headers */ + serv_puts(buf); + serv_getln(buf, sizeof buf); + if (buf[0] != '1') return NULL; + + while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { + if (!strncasecmp(buf, "exti=", 5)) { + safestrncpy(uid_from_headers, &buf[5], sizeof uid_from_headers); } - } + else if (!strncasecmp(buf, "part=", 5)) { + extract_token(mime_filename, &buf[5], 1, '|', sizeof mime_filename); + extract_token(mime_partnum, &buf[5], 2, '|', sizeof mime_partnum); + extract_token(mime_disposition, &buf[5], 3, '|', sizeof mime_disposition); + extract_token(mime_content_type, &buf[5], 4, '|', sizeof mime_content_type); + mime_length = extract_int(&buf[5], 5); - /** Now sanitize the buffer */ - len = strlen(notetext); - for (i=0; iuid = strdup(uid_from_headers); + vnote_from_body->color_red = pastel_palette[3][0]; + vnote_from_body->color_green = pastel_palette[3][1]; + vnote_from_body->color_blue = pastel_palette[3][2]; + vnote_from_body->body = malloc(32768); + vnote_from_body->body[0] = 0; + body_len = 0; + } + body_line_len = strlen(buf); + if ((body_len + body_line_len + 10) < 32768) { + strcpy(&vnote_from_body->body[body_len++], " "); + strcpy(&vnote_from_body->body[body_len], buf); + body_len += body_line_len; + } + } + else if (IsEmptyStr(buf)) { + in_body = 1; + } } - /** Make it HTML-happy and print it. */ - stresc(display_notetext, SIZ, notetext, 0, 0); - if (!IsEmptyStr(eid)) { - wprintf("%s
\n", eid, display_notetext); - } - else { - wprintf("%s
\n", msgnum, display_notetext); + if (!IsEmptyStr(relevant_partnum)) { + relevant_source = load_mimepart(msgnum, relevant_partnum); + if (relevant_source != NULL) { + struct vnote *v = vnote_new_from_str(relevant_source); + free(relevant_source); + return(v); + } } - /** Offer in-place editing. */ - if (!IsEmptyStr(eid)) { - wprintf("\n", - eid, - WC->nonce, - eid - ); + if (vnote_from_body) { + return(vnote_from_body); } + return NULL; } -/** - * \brief This gets called by the Ajax.InPlaceEditor when we save a note. +/* + * Serialize a vnote and write it to the server */ -void updatenote(void) +void write_vnote_to_server(struct vnote *v) { - char buf[SIZ]; - char notetext[SIZ]; - char display_notetext[SIZ]; - long msgnum; - int in_text = 0; - int i, len; - - serv_printf("ENT0 1||0|0||||||%s", bstr("eid")); + char buf[1024]; + + serv_puts("ENT0 1|||4"); serv_getln(buf, sizeof buf); if (buf[0] == '4') { - text_to_server(bstr("value")); + serv_puts("Content-type: text/vnote"); + serv_puts(""); + serv_puts(vnote_serialize(v)); serv_puts("000"); } +} - begin_ajax_response(); - msgnum = locate_message_by_uid(bstr("eid")); - if (msgnum >= 0L) { - serv_printf("MSG0 %ld", msgnum); - serv_getln(buf, sizeof buf); - if (buf[0] == '1') { - while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - - /** Fill the buffer */ - if ( (in_text) && (strlen(notetext) < SIZ-256) ) { - strcat(notetext, buf); - } - - if ( (!in_text) && (!strcasecmp(buf, "text")) ) { - in_text = 1; - } - } - /** Now sanitize the buffer */ - len = strlen(notetext); - for (i=0; ipos_top = atoi(bstr("top")); + } + if (havebstr("left")) { + v->pos_left = atoi(bstr("left")); + } + if (havebstr("height")) { + v->pos_height = atoi(bstr("height")); + } + if (havebstr("width")) { + v->pos_width = atoi(bstr("width")); + } + if (havebstr("red")) { + v->color_red = atoi(bstr("red")); + } + if (havebstr("green")) { + v->color_green = atoi(bstr("green")); + } + if (havebstr("blue")) { + v->color_blue = atoi(bstr("blue")); + } + if (havebstr("value")) { // I would have preferred 'body' but InPlaceEditor hardcodes 'value' + if (v->body) free(v->body); + v->body = strdup(bstr("value")); + } + + /* Serialize it and save it to the message base. Server will delete the old one. */ + write_vnote_to_server(v); + + begin_ajax_response(); + if (v->body) { + escputs(v->body); + } end_ajax_response(); + + vnote_free(v); } -/*@}*/ + +/* + * display sticky notes + * + * msgnum = Message number on the local server of the note to be displayed + */ +void display_note(long msgnum, int unread) { + struct vnote *v; + + v = vnote_new_from_msg(msgnum); + if (v) { + display_vnote_div(v); + + /* uncomment these lines to see ugly debugging info + wprintf(""); + */ + + vnote_free(v); + } +} + + + +/* + * Create a new note + */ +void add_new_note(void) { + struct vnote *v; + + v = vnote_new(); + if (v) { + v->uid = malloc(128); + generate_uuid(v->uid); + v->color_red = pastel_palette[3][0]; + v->color_green = pastel_palette[3][1]; + v->color_blue = pastel_palette[3][2]; + v->body = strdup(_("Click on any note to edit it.")); + write_vnote_to_server(v); + vnote_free(v); + } + + readloop("readfwd"); +}