+ if (!strcasecmp(mime_content_type, "text/vnote")) {
+ strcpy(relevant_partnum, mime_partnum);
+ }
+ }
+ else if ((phase == 0) && (!strncasecmp(bptr, "text", 4))) {
+ phase = 1;
+ }
+ break;
+ case 1:
+ if (!IsEmptyStr(bptr)) {
+ if (!strncasecmp(bptr, "Content-type: ", 14)) {
+ safestrncpy(msg4_content_type, &bptr[14], sizeof msg4_content_type);
+ string_trim(msg4_content_type);
+ }
+ else if (!strncasecmp(bptr, "Content-transfer-encoding: ", 27)) {
+ safestrncpy(msg4_content_encoding, &bptr[27], sizeof msg4_content_encoding);
+ string_trim(msg4_content_type);
+ }
+ else if ((!strncasecmp(bptr, "Content-length: ", 16))) {
+ msg4_content_length = atoi(&bptr[16]);
+ }
+ break;
+ }
+ else {
+ phase++;
+ if ((msg4_content_length > 0)
+ && ( !strcasecmp(msg4_content_encoding, "7bit"))
+ && (!strcasecmp(msg4_content_type, "text/vnote"))
+ ) {
+ vnote_inline = 1;
+ }
+ }
+ case 2:
+ if (vnote_inline) {
+ Data = NewStrBufPlain(NULL, msg4_content_length * 2);
+ if (msg4_content_length > 0) {
+ StrBuf_ServGetBLOBBuffered(Data, msg4_content_length);
+ phase ++;
+ }
+ else {
+ StrBufAppendBuf(Data, Buf, 0);
+ StrBufAppendBufPlain(Data, "\r\n", 1, 0);
+ }
+ }
+ case 3:
+ if (vnote_inline) {
+ StrBufAppendBuf(Data, Buf, 0);
+ }
+ }
+ }
+ FreeStrBuf(&Buf);
+
+ /* If MSG4 didn't give us the part we wanted, but we know that we can find it
+ * as one of the other MIME parts, attempt to load it now.
+ */
+ if ((!vnote_inline) && (!IsEmptyStr(relevant_partnum))) {
+ Data = load_mimepart(msgnum, relevant_partnum);
+ }
+
+ if (StrLength(Data) > 0) {
+ if (IsEmptyStr(uid_from_headers)) {
+ /* Convert an old-style note to a vNote */
+ vnote_from_body = vnote_new();
+ vnote_from_body->uid = 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(StrLength(Data) + 1);
+ vnote_from_body->body[0] = 0;
+ memcpy(vnote_from_body->body, ChrPtr(Data), StrLength(Data) + 1);
+ FreeStrBuf(&Data);
+ return vnote_from_body;
+ }
+ else {
+ char *Buf = SmashStrBuf(&Data);
+
+ struct vnote *v = vnote_new_from_str(Buf);
+ free(Buf);
+ return(v);
+ }
+ }
+ return NULL;
+}
+
+
+
+/*
+ * Serialize a vnote and write it to the server