X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fdav_propfind.c;h=b3a848a9ddf80cbb2e0cb1abd002eb14aadadd03;hb=HEAD;hp=61e7e71c72bc756600694ac450449da923fddab7;hpb=c6aec42f213ec284e34648f3d69bcf927dccddb1;p=citadel.git diff --git a/webcit/dav_propfind.c b/webcit/dav_propfind.c index 61e7e71c7..b09b52c17 100644 --- a/webcit/dav_propfind.c +++ b/webcit/dav_propfind.c @@ -1,4 +1,3 @@ - /* * Handles GroupDAV and CalDAV PROPFIND requests. * @@ -28,7 +27,7 @@ */ #include "webcit.h" -#include "webserver.h" + #include "dav.h" /* @@ -52,7 +51,7 @@ long locate_message_by_uid(const char *uid) { retval = atol(&buf[4]); } - return (retval); + return(retval); } @@ -60,18 +59,19 @@ long locate_message_by_uid(const char *uid) { * IgnoreFloor: set to 0 or 1 _nothing else_ * Subfolders: direct child floors will be put here. */ -const folder *GetRESTFolder(int IgnoreFloor, HashList * Subfolders) { - wcsession *WCC = WC; +const folder *GetRESTFolder(int IgnoreFloor, HashList *Subfolders) +{ + wcsession *WCC = WC; void *vFolder; const folder *ThisFolder = NULL; const folder *FoundFolder = NULL; const folder *BestGuess = NULL; int nBestGuess = 0; - HashPos *itd, *itfl; - StrBuf *Dir; - void *vDir; - long len; - const char *Key; + HashPos *itd, *itfl; + StrBuf * Dir; + void *vDir; + long len; + const char *Key; int iRoom, jURL, urlp; int delta; @@ -83,69 +83,86 @@ const folder *GetRESTFolder(int IgnoreFloor, HashList * Subfolders) { itfl = GetNewHashPos(WCC->Floors, 0); urlp = GetCount(WCC->Directory); - while (GetNextHashPos(WCC->Floors, itfl, &len, &Key, &vFolder) && (ThisFolder == NULL)) { + while (GetNextHashPos(WCC->Floors, itfl, &len, &Key, &vFolder) && + (ThisFolder == NULL)) + { ThisFolder = vFolder; - if (!IgnoreFloor && /* so we can handle legacy URLS... */ + if (!IgnoreFloor && /* so we can handle legacy URLS... */ (ThisFolder->Floor != WCC->CurrentFloor)) continue; - if (ThisFolder->nRoomNameParts > 1) { + if (ThisFolder->nRoomNameParts > 1) + { /*TODO: is that number all right? */ -// if (urlp - ThisFolder->nRoomNameParts != 2) { -// if (BestGuess != NULL) -// continue; +// if (urlp - ThisFolder->nRoomNameParts != 2) { +// if (BestGuess != NULL) +// continue; //ThisFolder->name -// itd = GetNewHashPos(WCC->Directory, 0); -// GetNextHashPos(WCC->Directory, itd, &len, &Key, &vDir); //TODO: how many to fast forward? -// } - itd = GetNewHashPos(WCC->Directory, 0); - GetNextHashPos(WCC->Directory, itd, &len, &Key, &vDir); //TODO: how many to fast forward? - - for (iRoom = 0, /* Fast forward the floorname as we checked it above: */ jURL = IgnoreFloor; - (iRoom <= ThisFolder->nRoomNameParts) && (jURL <= urlp); - iRoom++, jURL++, GetNextHashPos(WCC->Directory, itd, &len, &Key, &vDir)) { - Dir = (StrBuf *) vDir; - if (strcmp(ChrPtr(ThisFolder->RoomNameParts[iRoom]), ChrPtr(Dir)) != 0) { +// itd = GetNewHashPos(WCC->Directory, 0); +// GetNextHashPos(WCC->Directory, itd, &len, &Key, &vDir); //TODO: how many to fast forward? +// } + itd = GetNewHashPos(WCC->Directory, 0); + GetNextHashPos(WCC->Directory, itd, &len, &Key, &vDir); //TODO: how many to fast forward? + + for (iRoom = 0, /* Fast forward the floorname as we checked it above: */ jURL = IgnoreFloor; + + (iRoom <= ThisFolder->nRoomNameParts) && (jURL <= urlp); + + iRoom++, jURL++, GetNextHashPos(WCC->Directory, itd, &len, &Key, &vDir)) + { + Dir = (StrBuf*)vDir; + if (strcmp(ChrPtr(ThisFolder->RoomNameParts[iRoom]), + ChrPtr(Dir)) != 0) + { DeleteHashPos(&itd); continue; } } DeleteHashPos(&itd); /* Gotcha? */ - if ((iRoom == ThisFolder->nRoomNameParts) && (jURL == urlp)) { + if ((iRoom == ThisFolder->nRoomNameParts) && (jURL == urlp)) + { FoundFolder = ThisFolder; } - /* URL got more parts then this room, so we remember it for the best guess */ - else if ((jURL <= urlp) && (ThisFolder->nRoomNameParts <= nBestGuess)) { + /* URL got more parts then this room, so we remember it for the best guess*/ + else if ((jURL <= urlp) && + (ThisFolder->nRoomNameParts <= nBestGuess)) + { BestGuess = ThisFolder; nBestGuess = jURL - 1; } /* Room has more parts than the URL, it might be a sub-room? */ - else if (iRoom < ThisFolder->nRoomNameParts) { //// TODO: ThisFolder->nRoomNameParts == urlp - IgnoreFloor??? - Put(Subfolders, SKEY(ThisFolder->name), + else if (iRoom nRoomNameParts) + {//// TODO: ThisFolder->nRoomNameParts == urlp - IgnoreFloor??? + Put(Subfolders, SKEY(ThisFolder->name), /* Cast away const, its a reference. */ - (void *) ThisFolder, reference_free_handler); + (void*)ThisFolder, reference_free_handler); } } else { delta = GetCount(WCC->Directory) - ThisFolder->nRoomNameParts; if ((delta != 2) && (nBestGuess > 1)) - continue; - - itd = GetNewHashPos(WCC->Directory, 0); - - if (!GetNextHashPos(WCC->Directory, itd, &len, &Key, &vDir) || (vDir == NULL)) { + continue; + + itd = GetNewHashPos(WCC->Directory, 0); + + if (!GetNextHashPos(WCC->Directory, + itd, &len, &Key, &vDir) || + (vDir == NULL)) + { DeleteHashPos(&itd); - + syslog(LOG_DEBUG, "5\n"); continue; } DeleteHashPos(&itd); - Dir = (StrBuf *) vDir; - if (strcmp(ChrPtr(ThisFolder->name), ChrPtr(Dir)) - != 0) { + Dir = (StrBuf*) vDir; + if (strcmp(ChrPtr(ThisFolder->name), + ChrPtr(Dir)) + != 0) + { DeleteHashPos(&itd); - + syslog(LOG_DEBUG, "5\n"); continue; } @@ -155,7 +172,7 @@ const folder *GetRESTFolder(int IgnoreFloor, HashList * Subfolders) { nBestGuess = 1; BestGuess = ThisFolder; } - else + else FoundFolder = ThisFolder; } } @@ -171,8 +188,9 @@ const folder *GetRESTFolder(int IgnoreFloor, HashList * Subfolders) { -long GotoRestRoom(HashList * SubRooms) { - int IgnoreFloor = 0; /* deprecated... */ +long GotoRestRoom(HashList *SubRooms) +{ + int IgnoreFloor = 0; /* deprecated... */ wcsession *WCC = WC; long Count; long State; @@ -180,42 +198,44 @@ long GotoRestRoom(HashList * SubRooms) { State = REST_TOPLEVEL; - if (WCC->Hdr->HR.Handler != NULL) + if (WCC->Hdr->HR.Handler != NULL) State |= REST_IN_NAMESPACE; Count = GetCount(WCC->Directory); + + if (Count == 0) return State; - if (Count == 0) - return State; - - if (Count >= 1) - State |= REST_IN_FLOOR; - if (Count == 1) - return State; - + if (Count >= 1) State |=REST_IN_FLOOR; + if (Count == 1) return State; + /* * More than 3 params and no floor found? * -> fall back to old non-floored notation */ if ((Count >= 3) && (WCC->CurrentFloor == NULL)) IgnoreFloor = 1; - if (Count >= 3) { + if (Count >= 3) + { IgnoreFloor = 0; State |= REST_IN_FLOOR; ThisFolder = GetRESTFolder(IgnoreFloor, SubRooms); - if (ThisFolder != NULL) { + if (ThisFolder != NULL) + { if (WCC->ThisRoom != NULL) if (CompareRooms(WCC->ThisRoom, ThisFolder) != 0) gotoroom(ThisFolder->name); State |= REST_IN_ROOM; - + } if (GetCount(SubRooms) > 0) State |= REST_HAVE_SUB_ROOMS; } - if ((WCC->ThisRoom != NULL) && (Count + IgnoreFloor > 3)) { - if (WCC->Hdr->HR.Handler->RID(ExistsID, IgnoreFloor)) { + if ((WCC->ThisRoom != NULL) && + (Count + IgnoreFloor > 3)) + { + if (WCC->Hdr->HR.Handler->RID(ExistsID, IgnoreFloor)) + { State |= REST_GOT_LOCAL_PART; } else { @@ -234,7 +254,8 @@ long GotoRestRoom(HashList * SubRooms) { * List rooms (or "collections" in DAV terminology) which contain * interesting groupware objects. */ -void dav_collection_list(void) { +void dav_collection_list(void) +{ wcsession *WCC = WC; char buf[256]; char roomname[256]; @@ -243,7 +264,6 @@ void dav_collection_list(void) { time_t now; time_t mtime; int is_groupware_collection = 0; - int starting_point = 1; /**< 0 for /, 1 for /groupdav/ */ if (WCC->Hdr->HR.Handler == NULL) { @@ -267,32 +287,34 @@ void dav_collection_list(void) { dav_common_headers(); hprintf("Date: %s\r\n", datestring); hprintf("Content-type: text/xml\r\n"); - if (DisableGzip || (!WCC->Hdr->HR.gzip_ok)) + if (DisableGzip || (!WCC->Hdr->HR.gzip_ok)) hprintf("Content-encoding: identity\r\n"); begin_burst(); - wc_printf("" ""); + wc_printf("" + "" + ); /* * If the client is requesting the root, show a root node. */ if (starting_point == 0) { wc_printf(""); - wc_printf(""); - dav_identify_host(); - wc_printf("/"); - wc_printf(""); - wc_printf(""); - wc_printf("HTTP/1.1 200 OK"); - wc_printf(""); - wc_printf("/"); - wc_printf(""); - wc_printf(""); - escputs(datestring); - wc_printf(""); - wc_printf(""); - wc_printf(""); + wc_printf(""); + dav_identify_host(); + wc_printf("/"); + wc_printf(""); + wc_printf(""); + wc_printf("HTTP/1.1 200 OK"); + wc_printf(""); + wc_printf("/"); + wc_printf(""); + wc_printf(""); + escputs(datestring); + wc_printf(""); + wc_printf(""); + wc_printf(""); wc_printf(""); } @@ -301,20 +323,20 @@ void dav_collection_list(void) { */ if ((starting_point + WCC->Hdr->HR.dav_depth) >= 1) { wc_printf(""); - wc_printf(""); - dav_identify_host(); - wc_printf("/groupdav"); - wc_printf(""); - wc_printf(""); - wc_printf("HTTP/1.1 200 OK"); - wc_printf(""); - wc_printf("GroupDAV"); - wc_printf(""); - wc_printf(""); - escputs(datestring); - wc_printf(""); - wc_printf(""); - wc_printf(""); + wc_printf(""); + dav_identify_host(); + wc_printf("/groupdav"); + wc_printf(""); + wc_printf(""); + wc_printf("HTTP/1.1 200 OK"); + wc_printf(""); + wc_printf("GroupDAV"); + wc_printf(""); + wc_printf(""); + escputs(datestring); + wc_printf(""); + wc_printf(""); + wc_printf(""); wc_printf(""); } @@ -323,82 +345,84 @@ void dav_collection_list(void) { */ serv_puts("LKRA"); serv_getln(buf, sizeof buf); - if (buf[0] == '1') - while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - - extract_token(roomname, buf, 0, '|', sizeof roomname); - view = extract_int(buf, 7); - mtime = extract_long(buf, 8); - http_datestring(datestring, sizeof datestring, mtime); - - /* - * For now, only list rooms that we know a GroupDAV client - * might be interested in. In the future we may add - * the rest. - * - * We determine the type of objects which are stored in each - * room by looking at the *default* view for the room. This - * allows, for example, a Calendar room to appear as a - * GroupDAV calendar even if the user has switched it to a - * Calendar List view. - */ - if ((view == VIEW_CALENDAR) || - (view == VIEW_TASKS) || - (view == VIEW_ADDRESSBOOK) || (view == VIEW_NOTES) || (view == VIEW_JOURNAL) || (view == VIEW_WIKI) - ) { - is_groupware_collection = 1; - } - else { - is_groupware_collection = 0; - } - - if ((is_groupware_collection) && ((starting_point + WCC->Hdr->HR.dav_depth) >= 2)) { - wc_printf(""); - - wc_printf(""); - dav_identify_host(); - wc_printf("/groupdav/"); - urlescputs(roomname); - wc_printf("/"); + if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { + + extract_token(roomname, buf, 0, '|', sizeof roomname); + view = extract_int(buf, 7); + mtime = extract_long(buf, 8); + http_datestring(datestring, sizeof datestring, mtime); + + /* + * For now, only list rooms that we know a GroupDAV client + * might be interested in. In the future we may add + * the rest. + * + * We determine the type of objects which are stored in each + * room by looking at the *default* view for the room. This + * allows, for example, a Calendar room to appear as a + * GroupDAV calendar even if the user has switched it to a + * Calendar List view. + */ + if ( (view == VIEW_CALENDAR) || + (view == VIEW_TASKS) || + (view == VIEW_ADDRESSBOOK) || + (view == VIEW_NOTES) || + (view == VIEW_JOURNAL) || + (view == VIEW_WIKI) + ) { + is_groupware_collection = 1; + } + else { + is_groupware_collection = 0; + } - wc_printf(""); - wc_printf("HTTP/1.1 200 OK"); - wc_printf(""); - wc_printf(""); - escputs(roomname); - wc_printf(""); - wc_printf(""); - - switch (view) { - case VIEW_CALENDAR: - wc_printf(""); - break; - case VIEW_TASKS: - wc_printf(""); - break; - case VIEW_ADDRESSBOOK: - wc_printf(""); - break; - case VIEW_NOTES: - wc_printf(""); - break; - case VIEW_JOURNAL: - wc_printf(""); - break; - case VIEW_WIKI: - wc_printf(""); - break; - } + if ( (is_groupware_collection) && ((starting_point + WCC->Hdr->HR.dav_depth) >= 2) ) { + wc_printf(""); + + wc_printf(""); + dav_identify_host(); + wc_printf("/groupdav/"); + urlescputs(roomname); + wc_printf("/"); + + wc_printf(""); + wc_printf("HTTP/1.1 200 OK"); + wc_printf(""); + wc_printf(""); + escputs(roomname); + wc_printf(""); + wc_printf(""); + + switch(view) { + case VIEW_CALENDAR: + wc_printf(""); + break; + case VIEW_TASKS: + wc_printf(""); + break; + case VIEW_ADDRESSBOOK: + wc_printf(""); + break; + case VIEW_NOTES: + wc_printf(""); + break; + case VIEW_JOURNAL: + wc_printf(""); + break; + case VIEW_WIKI: + wc_printf(""); + break; + } - wc_printf(""); - wc_printf(""); + wc_printf(""); + wc_printf(""); escputs(datestring); - wc_printf(""); - wc_printf(""); - wc_printf(""); - wc_printf(""); - } + wc_printf(""); + wc_printf(""); + wc_printf(""); + wc_printf(""); } + } wc_printf("\n"); end_burst(); @@ -418,7 +442,8 @@ void propfind_xml_end(void *data, const char *supplied_el) { /* * The pathname is always going to be /groupdav/room_name/msg_num */ -void dav_propfind(void) { +void dav_propfind(void) +{ wcsession *WCC = WC; StrBuf *dav_roomname; StrBuf *dav_uid; @@ -445,10 +470,10 @@ void dav_propfind(void) { const char *req = ChrPtr(WCC->upload); if (req) { - req = strchr(req, '<'); /* hunt for the first tag */ + req = strchr(req, '<'); /* hunt for the first tag */ } if (!req) { - req = "ERROR"; /* force it to barf */ + req = "ERROR"; /* force it to barf */ } i = XML_Parse(xp, req, strlen(req), 1); @@ -467,7 +492,7 @@ void dav_propfind(void) { dav_common_headers(); hprintf("Date: %s\r\n", datestring); hprintf("Content-Type: text/plain\r\n"); - wc_printf("An internal error has occurred at %s:%d.\r\n", __FILE__, __LINE__); + wc_printf("An internal error has occurred at %s:%d.\r\n", __FILE__ , __LINE__ ); end_burst(); return; } @@ -477,7 +502,9 @@ void dav_propfind(void) { StrBufExtract_token(dav_roomname, WCC->Hdr->HR.ReqLine, 0, '/'); StrBufExtract_token(dav_uid, WCC->Hdr->HR.ReqLine, 1, '/'); - syslog(LOG_DEBUG, "PROPFIND requested for '%s' at depth %d", ChrPtr(dav_roomname), WCC->Hdr->HR.dav_depth); + syslog(LOG_DEBUG, "PROPFIND requested for '%s' at depth %d", + ChrPtr(dav_roomname), WCC->Hdr->HR.dav_depth + ); /* * If the room name is blank, the client is requesting a folder list. @@ -516,15 +543,17 @@ void dav_propfind(void) { hprintf("HTTP/1.1 404 not found\r\n"); dav_common_headers(); hprintf("Content-Type: text/plain\r\n"); - wc_printf("Object \"%s\" was not found in the \"%s\" folder.\r\n", ChrPtr(dav_uid), ChrPtr(dav_roomname) - ); + wc_printf("Object \"%s\" was not found in the \"%s\" folder.\r\n", + ChrPtr(dav_uid), + ChrPtr(dav_roomname) + ); end_burst(); FreeStrBuf(&dav_roomname); FreeStrBuf(&dav_uid); return; } - /* Be rude. Completely ignore the XML request and simply send them + /* Be rude. Completely ignore the XML request and simply send them * everything we know about (which is going to simply be the ETag and * nothing else). Let the client-side parser sort it out. */ @@ -532,15 +561,17 @@ void dav_propfind(void) { dav_common_headers(); hprintf("Date: %s\r\n", datestring); hprintf("Content-type: text/xml\r\n"); - if (DisableGzip || (!WCC->Hdr->HR.gzip_ok)) + if (DisableGzip || (!WCC->Hdr->HR.gzip_ok)) hprintf("Content-encoding: identity\r\n"); - + begin_burst(); - - wc_printf("" ""); + + wc_printf("" + "" + ); wc_printf(""); - + wc_printf(""); dav_identify_host(); wc_printf("/groupdav/"); @@ -590,8 +621,12 @@ void dav_propfind(void) { begin_burst(); wc_printf("" - ""); + "" + ); /* Transmit the collection resource */ wc_printf(""); @@ -609,28 +644,28 @@ void dav_propfind(void) { escputs(ChrPtr(WCC->CurRoom.name)); wc_printf(""); - wc_printf(""); /* empty owner ought to be legal; see rfc3744 section 5.1 */ + wc_printf(""); /* empty owner ought to be legal; see rfc3744 section 5.1 */ wc_printf(""); - switch (WCC->CurRoom.defview) { - case VIEW_CALENDAR: - wc_printf(""); - wc_printf(""); - break; - case VIEW_TASKS: - wc_printf(""); - break; - case VIEW_ADDRESSBOOK: - wc_printf(""); - break; + switch(WCC->CurRoom.defview) { + case VIEW_CALENDAR: + wc_printf(""); + wc_printf(""); + break; + case VIEW_TASKS: + wc_printf(""); + break; + case VIEW_ADDRESSBOOK: + wc_printf(""); + break; } wc_printf(""); /* FIXME get the mtime - wc_printf(""); - escputs(datestring); - wc_printf(""); - */ + wc_printf(""); + escputs(datestring); + wc_printf(""); + */ wc_printf(""); wc_printf(""); wc_printf(""); @@ -640,48 +675,51 @@ void dav_propfind(void) { if (WCC->Hdr->HR.dav_depth > 0) { MsgNum = NewStrBuf(); serv_puts("MSGS ALL"); - + StrBuf_ServGetln(MsgNum); if (GetServerStatus(MsgNum, NULL) == 1) - while (BufLen = StrBuf_ServGetln(MsgNum), - ((BufLen >= 0) && ((BufLen != 3) || strcmp(ChrPtr(MsgNum), "000")))) { + while (BufLen = StrBuf_ServGetln(MsgNum), + ((BufLen >= 0) && + ((BufLen != 3) || strcmp(ChrPtr(MsgNum), "000")) )) + { msgs = realloc(msgs, ++num_msgs * sizeof(long)); - msgs[num_msgs - 1] = StrTol(MsgNum); + msgs[num_msgs-1] = StrTol(MsgNum); } - - if (num_msgs > 0) - for (i = 0; i < num_msgs; ++i) { - - syslog(LOG_DEBUG, "PROPFIND enumerating message # %ld", msgs[i]); - strcpy(uid, ""); - now = (-1); - serv_printf("MSG0 %ld|3", msgs[i]); - StrBuf_ServGetln(MsgNum); - if (GetServerStatus(MsgNum, NULL) == 1) - while (BufLen = StrBuf_ServGetln(MsgNum), - ((BufLen >= 0) && ((BufLen != 3) || strcmp(ChrPtr(MsgNum), "000")))) { - if (!strncasecmp(ChrPtr(MsgNum), "exti=", 5)) { - strcpy(uid, &ChrPtr(MsgNum)[5]); - } - else if (!strncasecmp(ChrPtr(MsgNum), "time=", 5)) { - now = atol(&ChrPtr(MsgNum)[5]); - } + + if (num_msgs > 0) for (i=0; i= 0) && + ((BufLen != 3) || strcmp(ChrPtr(MsgNum), "000")) )) + { + if (!strncasecmp(ChrPtr(MsgNum), "exti=", 5)) { + strcpy(uid, &ChrPtr(MsgNum)[5]); } - - if (!IsEmptyStr(uid)) { - wc_printf(""); - wc_printf(""); - dav_identify_host(); - wc_printf("/groupdav/"); - urlescputs(ChrPtr(WCC->CurRoom.name)); - euid_escapize(encoded_uid, uid); - wc_printf("/%s", encoded_uid); - wc_printf(""); - wc_printf(""); - wc_printf("HTTP/1.1 200 OK"); - wc_printf(""); - wc_printf("\"%ld\"", msgs[i]); - switch (WCC->CurRoom.defview) { + else if (!strncasecmp(ChrPtr(MsgNum), "time=", 5)) { + now = atol(&ChrPtr(MsgNum)[5]); + } + } + + if (!IsEmptyStr(uid)) { + wc_printf(""); + wc_printf(""); + dav_identify_host(); + wc_printf("/groupdav/"); + urlescputs(ChrPtr(WCC->CurRoom.name)); + euid_escapize(encoded_uid, uid); + wc_printf("/%s", encoded_uid); + wc_printf(""); + wc_printf(""); + wc_printf("HTTP/1.1 200 OK"); + wc_printf(""); + wc_printf("\"%ld\"", msgs[i]); + switch(WCC->CurRoom.defview) { case VIEW_CALENDAR: wc_printf("text/x-ical"); break; @@ -691,18 +729,18 @@ void dav_propfind(void) { case VIEW_ADDRESSBOOK: wc_printf("text/x-vcard"); break; - } - if (now > 0L) { - http_datestring(datestring, sizeof datestring, now); - wc_printf(""); - escputs(datestring); - wc_printf(""); - } - wc_printf(""); - wc_printf(""); - wc_printf(""); } + if (now > 0L) { + http_datestring(datestring, sizeof datestring, now); + wc_printf(""); + escputs(datestring); + wc_printf(""); + } + wc_printf(""); + wc_printf(""); + wc_printf(""); } + } FreeStrBuf(&MsgNum); } @@ -716,34 +754,48 @@ void dav_propfind(void) { -int ParseMessageListHeaders_EUID(StrBuf * Line, - const char **pos, message_summary * Msg, StrBuf * ConversionBuffer, void **ViewSpecific) { +int ParseMessageListHeaders_EUID(StrBuf *Line, + const char **pos, + message_summary *Msg, + StrBuf *ConversionBuffer, + void **ViewSpecific) +{ Msg->euid = NewStrBuf(); - StrBufExtract_NextToken(Msg->euid, Line, pos, '|'); + StrBufExtract_NextToken(Msg->euid, Line, pos, '|'); Msg->date = StrBufExtractNext_long(Line, pos, '|'); - + return StrLength(Msg->euid) > 0; } -int DavUIDL_GetParamsGetServerCall(SharedMessageStatus * Stat, - void **ViewSpecific, long oper, char *cmd, long len, char *filter, long flen) { +int DavUIDL_GetParamsGetServerCall(SharedMessageStatus *Stat, + void **ViewSpecific, + long oper, + char *cmd, + long len, + char *filter, + long flen) +{ Stat->defaultsortorder = 0; Stat->sortit = 0; Stat->load_seen = 0; - Stat->maxmsgs = 9999999; + Stat->maxmsgs = 9999999; snprintf(cmd, len, "MSGS ALL|||2"); return 200; } -int DavUIDL_RenderView_or_Tail(SharedMessageStatus * Stat, void **ViewSpecific, long oper) { - - DoTemplate(HKEY("msg_listview"), NULL, &NoCtx); - +int DavUIDL_RenderView_or_Tail(SharedMessageStatus *Stat, + void **ViewSpecific, + long oper) +{ + + DoTemplate(HKEY("msg_listview"),NULL,&NoCtx); + return 0; } -int DavUIDL_Cleanup(void **ViewSpecific) { +int DavUIDL_Cleanup(void **ViewSpecific) +{ /* Note: wDumpContent() will output one additional tag. */ /* We ought to move this out into template */ wDumpContent(1); @@ -754,10 +806,19 @@ int DavUIDL_Cleanup(void **ViewSpecific) { -void InitModule_PROPFIND(void) { - RegisterReadLoopHandlerset(eReadEUIDS, - DavUIDL_GetParamsGetServerCall, - NULL, - NULL, ParseMessageListHeaders_EUID, NULL, DavUIDL_RenderView_or_Tail, DavUIDL_Cleanup, NULL); +void +InitModule_PROPFIND +(void) +{ + RegisterReadLoopHandlerset( + eReadEUIDS, + DavUIDL_GetParamsGetServerCall, + NULL, + NULL, + ParseMessageListHeaders_EUID, + NULL, + DavUIDL_RenderView_or_Tail, + DavUIDL_Cleanup, + NULL); }