ICAL: add conflict handling
[citadel.git] / webcit / vcard_edit.c
index a794dddd3b9de05d199e7986dd6ac54544f55880..950fae6f43671e43fb53a16449eacd4390554b48 100644 (file)
@@ -1,26 +1,20 @@
 /*
- * Copyright (c) 1996-2011 by the citadel.org team
+ * Copyright (c) 1996-2012 by the citadel.org team
  *
  * This program is open source 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.
+ * modify it under the terms of the GNU General Public License, version 3.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  */
 
 #include "webcit.h"
 #include "webserver.h"
 #include "calendar.h"
 
-
+CtxType CTX_VCARD = CTX_NONE;
 
 ConstStr VCStr [] = {
        {HKEY("n")}, /* N is name, but only if there's no FN already there */
@@ -657,7 +651,7 @@ TODO: check for layer II
 
 void tmplput_VCARD_ITEM(StrBuf *Target, WCTemplputParams *TP)
 {
-       HashList *VC = CTX;
+       HashList *VC = CTX(CTX_VCARD);
        eVC evc;
        void *vStr;
 
@@ -876,6 +870,7 @@ void do_edit_vcard(long msgnum, char *partnum,
                   wc_mime_attachment *VCAtt,
                   const char *return_to, 
                   const char *force_room) {
+       wcsession *WCC = WC;
        message_summary *Msg = NULL;
        wc_mime_attachment *VCMime = NULL;
        struct vCard *v;
@@ -1056,6 +1051,12 @@ void do_edit_vcard(long msgnum, char *partnum,
                escputs(force_room);
                wc_printf("\">\n");
        }
+       else
+       {
+               wc_printf("<input type=\"hidden\" name=\"go\" value=\"");
+               StrEscAppend(WCC->WBuf, WCC->CurRoom.name, NULL, 0, 0);
+               wc_printf("\">\n");
+       }
 
        wc_printf("<table class=\"vcard_edit_background\"><tr><td>\n");
 
@@ -1280,24 +1281,23 @@ void submit_vcard(void) {
                }
        }
 
-       sprintf(buf, "ENT0 1|||4||");
-       serv_puts(buf);
-       serv_getln(buf, sizeof buf);
-       if (buf[0] != '4') {
+       Buf = NewStrBuf();
+       serv_write(HKEY("ENT0 1|||4\n"));
+       if (!StrBuf_ServGetln(Buf) && (GetServerStatus(Buf, NULL) != 4))
+       {
                edit_vcard();
                return;
        }
 
        /* Make a vCard structure out of the data supplied in the form */
-       Buf = NewStrBuf();
        StrBufPrintf(Buf, "begin:vcard\r\n%s\r\nend:vcard\r\n",
                     bstr("extrafields")
        );
        v = VCardLoad(Buf);     /* Start with the extra fields */
-       FreeStrBuf(&Buf);
        if (v == NULL) {
                AppendImportantMessage(_("An error has occurred."), -1);
                edit_vcard();
+               FreeStrBuf(&Buf);
                return;
        }
 
@@ -1341,13 +1341,14 @@ void submit_vcard(void) {
        if (serialized_vcard == NULL) {
                AppendImportantMessage(_("An error has occurred."), -1);
                edit_vcard();
+               FreeStrBuf(&Buf);
                return;
        }
 
-       serv_puts("Content-type: text/x-vcard; charset=UTF-8");
-       serv_puts("");
+       serv_write(HKEY("Content-type: text/x-vcard; charset=UTF-8\n"));
+       serv_write(HKEY("\n"));
        serv_printf("%s\r\n", serialized_vcard);
-       serv_puts("000");
+       serv_write(HKEY("000\n"));
        free(serialized_vcard);
 
        if (!strcmp(bstr("return_to"), "select_user_to_edit")) {
@@ -1362,6 +1363,7 @@ void submit_vcard(void) {
        else {
                readloop(readnew, eUseDefault);
        }
+       FreeStrBuf(&Buf);
 }
 
 
@@ -1414,7 +1416,9 @@ int vcard_GetParamsGetServerCall(SharedMessageStatus *Stat,
                                 void **ViewSpecific, 
                                 long oper, 
                                 char *cmd, 
-                                long len)
+                                long len,
+                                char *filter,
+                                long flen)
 {
        vcardview_struct *VS;
 
@@ -1507,10 +1511,12 @@ void
 InitModule_VCARD
 (void)
 {
+       RegisterCTX(CTX_VCARD);
        RegisterReadLoopHandlerset(
                VIEW_ADDRESSBOOK,
                vcard_GetParamsGetServerCall,
                NULL,
+               NULL,
                NULL, 
                vcard_LoadMsgFromServer,
                vcard_RenderView_or_Tail,