+/*
+ * Client is uploading an attachment
+ */
+void upload_attachment(void) {
+ wcsession *WCC = WC;
+ const char *pch;
+ int n;
+ const char *newn;
+ long newnlen;
+ void *v;
+ wc_mime_attachment *att;
+
+ lprintf(9, "upload_attachment()\n");
+ wc_printf("upload_attachment()<br>\n");
+
+ if (WCC->upload_length <= 0) {
+ lprintf(9, "ERROR no attachment was uploaded\n");
+ wc_printf("ERROR no attachment was uploaded<br>\n");
+ return;
+ }
+
+ lprintf(9, "Client is uploading %d bytes\n", WCC->upload_length);
+ wc_printf("Client is uploading %d bytes<br>\n", WCC->upload_length);
+ att = malloc(sizeof(wc_mime_attachment));
+ memset(att, 0, sizeof(wc_mime_attachment ));
+ att->length = WCC->upload_length;
+ att->ContentType = NewStrBufPlain(WCC->upload_content_type, -1);
+ att->FileName = NewStrBufDup(WCC->upload_filename);
+
+ if (WCC->attachments == NULL) {
+ WCC->attachments = NewHash(1, Flathash);
+ }
+
+ /* And add it to the list. */
+ n = 0;
+ if ((GetCount(WCC->attachments) > 0) &&
+ GetHashAt(WCC->attachments,
+ GetCount(WCC->attachments) -1,
+ &newnlen, &newn, &v))
+ n = *((int*) newn) + 1;
+ Put(WCC->attachments, IKEY(n), att, DestroyMime);
+
+ /*
+ * Mozilla sends a simple filename, which is what we want,
+ * but Satan's Browser sends an entire pathname. Reduce
+ * the path to just a filename if we need to.
+ */
+ pch = strrchr(ChrPtr(att->FileName), '/');
+ if (pch != NULL) {
+ StrBufCutLeft(att->FileName, pch - ChrPtr(att->FileName) + 1);
+ }
+ pch = strrchr(ChrPtr(att->FileName), '\\');
+ if (pch != NULL) {
+ StrBufCutLeft(att->FileName, pch - ChrPtr(att->FileName) + 1);
+ }
+
+ /*
+ * Transfer control of this memory from the upload struct
+ * to the attachment struct.
+ */
+ att->Data = WCC->upload;
+ WCC->upload = NULL;
+ WCC->upload_length = 0;
+}
+
+
+/*
+ * Remove an attachment from the message currently being composed.
+ *
+ * Currently we identify the attachment to be removed by its filename.
+ * There is probably a better way to do this.
+ */
+void remove_attachment(void) {
+ wcsession *WCC = WC;
+ wc_mime_attachment *att;
+ void *vAtt;
+ StrBuf *WhichAttachment;
+ HashPos *at;
+ long len;
+ const char *key;
+
+ WhichAttachment = NewStrBufDup(sbstr("which_attachment"));
+ StrBufUnescape(WhichAttachment, 0);
+ at = GetNewHashPos(WCC->attachments, 0);
+ do {
+ GetHashPos(WCC->attachments, at, &len, &key, &vAtt);
+
+ att = (wc_mime_attachment*) vAtt;
+ if ((att != NULL) &&
+ (strcmp(ChrPtr(WhichAttachment),
+ ChrPtr(att->FileName) ) == 0))
+ {
+ DeleteEntryFromHash(WCC->attachments, at);
+ break;
+ }
+ }
+ while (NextHashPos(WCC->attachments, at));
+ FreeStrBuf(&WhichAttachment);
+ wc_printf("remove_attachment() completed\n");
+}