X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fsitemap.c;h=cab60d43ec01307ceef379db619a34fe0a22c485;hb=4b4dc864ede7c5d8d956febe4a0afb422b78e7c4;hp=c49c001a6929801503958505777007e520862b1d;hpb=88063ed1e26f3262c0a9cd5c344ec60824467f38;p=citadel.git diff --git a/webcit/sitemap.c b/webcit/sitemap.c index c49c001a6..cab60d43e 100644 --- a/webcit/sitemap.c +++ b/webcit/sitemap.c @@ -1,9 +1,9 @@ /* * XML sitemap generator * - * Copyright (c) 2010 by the citadel.org team + * Copyright (c) 2010-2011 by the citadel.org team * - * This program is free software; you can redistribute it and/or modify + * 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. @@ -23,9 +23,9 @@ /* - * XML sitemap generator -- go through the message list + * XML sitemap generator -- go through the message list for a BBS room */ -void sitemap_do_messages(void) { +void sitemap_do_bbs(void) { wcsession *WCC = WC; int num_msgs = 0; int i; @@ -36,14 +36,14 @@ void sitemap_do_messages(void) { Stat.maxload = INT_MAX; Stat.lowest_found = (-1); Stat.highest_found = (-1); - num_msgs = load_msg_ptrs("MSGS ALL", &Stat, NULL); + num_msgs = load_msg_ptrs("MSGS ALL", NULL, &Stat, NULL); if (num_msgs < 1) return; for (i=0; isumm); if (Msg != NULL) { wc_printf("%s/readfwd", ChrPtr(site_prefix)); - wc_printf("?gotofirst="); + wc_printf("?go="); urlescputs(ChrPtr(WC->CurRoom.name)); wc_printf("?start_reading_at=%ld", Msg->msgnum); wc_printf("\r\n"); @@ -52,11 +52,114 @@ void sitemap_do_messages(void) { } +/* + * XML sitemap generator -- go through the message list for a Blog room + */ +void sitemap_do_blog(void) { + wcsession *WCC = WC; + int num_msgs = 0; + int i; + SharedMessageStatus Stat; + message_summary *Msg = NULL; + + memset(&Stat, 0, sizeof Stat); + Stat.maxload = INT_MAX; + Stat.lowest_found = (-1); + Stat.highest_found = (-1); + num_msgs = load_msg_ptrs("MSGS ALL", NULL, &Stat, NULL); + if (num_msgs < 1) return; + + for (i=0; isumm); + if (Msg != NULL) { + struct bltr bltr = blogview_learn_thread_references(Msg->msgnum); + /* Show only top level posts, not comments */ + if ((bltr.id != 0) && (bltr.refs == 0)) { + WC->bptlid = bltr.id; + wc_printf("%s", ChrPtr(site_prefix)); + tmplput_blog_permalink(NULL, NULL); + wc_printf("\r\n"); + } + } + } +} + + +/* + * XML sitemap generator -- go through the message list for a wiki room + */ +void sitemap_do_wiki(void) { + wcsession *WCC = WC; + int num_msgs = 0; + int i; + SharedMessageStatus Stat; + message_summary *Msg = NULL; + char buf[256]; + + memset(&Stat, 0, sizeof Stat); + Stat.maxload = INT_MAX; + Stat.lowest_found = (-1); + Stat.highest_found = (-1); + num_msgs = load_msg_ptrs("MSGS ALL", NULL, &Stat, NULL); + if (num_msgs < 1) return; + + for (i=0; isumm); + if (Msg != NULL) { + + serv_printf("MSG0 %ld|3", Msg->msgnum); + serv_getln(buf, sizeof buf); + if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { + if ( (!strncasecmp(buf, "exti=", 5)) + && (!bmstrcasestr(buf, "_HISTORY_")) + ) { + wc_printf("%s/wiki", ChrPtr(site_prefix)); + wc_printf("?go="); + urlescputs(ChrPtr(WC->CurRoom.name)); + wc_printf("?page=%s", &buf[5]); + wc_printf("\r\n"); + } + } + } + } +} + + +struct sitemap_room_list { + struct sitemap_room_list *next; + StrBuf *roomname; + int defview; +}; + + +/* + * Load the room list for the sitemap + */ +struct sitemap_room_list *sitemap_load_roomlist(void) { + char buf[SIZ]; + char roomname_plain[SIZ]; + struct sitemap_room_list *roomlist = NULL; + + serv_puts("LKRA"); + serv_getln(buf, sizeof buf); + if (buf[0] == '1') while(serv_getln(buf, sizeof buf), strcmp(buf, "000")) { + struct sitemap_room_list *ptr = malloc(sizeof(struct sitemap_room_list)); + extract_token(roomname_plain, buf, 0, '|', sizeof roomname_plain); + ptr->roomname = NewStrBufPlain(roomname_plain, -1); + ptr->defview = extract_int(buf, 6); + ptr->next = roomlist; + roomlist = ptr; + } + + return(roomlist); +} + + /* * Entry point for RSS feed generator */ void sitemap(void) { - + struct sitemap_room_list *roomlist = NULL; output_headers(0, 0, 0, 0, 1, 0); hprintf("Content-type: text/xml\r\n"); hprintf( @@ -70,24 +173,32 @@ void sitemap(void) { wc_printf("\r\n"); wc_printf("\r\n"); - HashList *roomlist = GetRoomListHashLKRA(NULL, NULL); - HashPos *it = GetNewHashPos(roomlist, 0); - long HKlen; - const char *HashKey; - folder *room; + roomlist = sitemap_load_roomlist(); - while (GetNextHashPos(roomlist, it, &HKlen, &HashKey, (void *)&room)) + while (roomlist != NULL) { - /* Output the messages in this room only if it's a message board */ - if (room->defview == VIEW_BBS) - { - gotoroom(room->name); - sitemap_do_messages(); + gotoroom(roomlist->roomname); + + /* Output the messages in this room only if it's a room type we can make sense of */ + switch(roomlist->defview) { + case VIEW_BBS: + sitemap_do_bbs(); + break; + case VIEW_WIKI: + sitemap_do_wiki(); + break; + case VIEW_BLOG: + sitemap_do_blog(); + break; + default: + break; } - } - DeleteHashPos(&it); - /* DeleteHash(&roomlist); This will be freed when the session closes */ + struct sitemap_room_list *ptr = roomlist; + roomlist = roomlist->next; + FreeStrBuf(&ptr->roomname); + free(ptr); + } wc_printf("\r\n"); wDumpContent(0);