* fix multiple compiler warnings...
[citadel.git] / webcit / sitemap.c
1 /*
2  * XML sitemap generator
3  *
4  * Copyright (c) 2010-2011 by the citadel.org team
5  *
6  * This program is open source software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include "webcit.h"
22 #include "webserver.h"
23
24
25 /*
26  * XML sitemap generator -- go through the message list for a BBS room
27  */
28 void sitemap_do_bbs(void) {
29         wcsession *WCC = WC;
30         int num_msgs = 0;
31         int i;
32         SharedMessageStatus Stat;
33         message_summary *Msg = NULL;
34
35         memset(&Stat, 0, sizeof Stat);
36         Stat.maxload = INT_MAX;
37         Stat.lowest_found = (-1);
38         Stat.highest_found = (-1);
39         num_msgs = load_msg_ptrs("MSGS ALL", &Stat, NULL);
40         if (num_msgs < 1) return;
41
42         for (i=0; i<num_msgs; i+=20) {
43                 Msg = GetMessagePtrAt(i, WCC->summ);
44                 if (Msg != NULL) {
45                         wc_printf("<url><loc>%s/readfwd", ChrPtr(site_prefix));
46                         wc_printf("?go=");
47                         urlescputs(ChrPtr(WC->CurRoom.name));
48                         wc_printf("?start_reading_at=%ld", Msg->msgnum);
49                         wc_printf("</loc></url>\r\n");
50                 }
51         }
52 }
53
54
55 /*
56  * XML sitemap generator -- go through the message list for a wiki room
57  * (this might work for blogs too; we'll see)
58  */
59 void sitemap_do_wiki(void) {
60         wcsession *WCC = WC;
61         int num_msgs = 0;
62         int i;
63         SharedMessageStatus Stat;
64         message_summary *Msg = NULL;
65         char buf[256];
66
67         memset(&Stat, 0, sizeof Stat);
68         Stat.maxload = INT_MAX;
69         Stat.lowest_found = (-1);
70         Stat.highest_found = (-1);
71         num_msgs = load_msg_ptrs("MSGS ALL", &Stat, NULL);
72         if (num_msgs < 1) return;
73
74         for (i=0; i<num_msgs; ++i) {
75                 Msg = GetMessagePtrAt(i, WCC->summ);
76                 if (Msg != NULL) {
77
78                         serv_printf("MSG0 %ld|3", Msg->msgnum);
79                         serv_getln(buf, sizeof buf);
80                         if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
81                                 if (    (!strncasecmp(buf, "exti=", 5))
82                                         && (!bmstrcasestr(buf, "_HISTORY_"))
83                                 ) {
84                                         wc_printf("<url><loc>%s/wiki", ChrPtr(site_prefix));
85                                         wc_printf("?go=");
86                                         urlescputs(ChrPtr(WC->CurRoom.name));
87                                         wc_printf("?page=%s", &buf[5]);
88                                         wc_printf("</loc></url>\r\n");
89                                 }
90                         }
91                 }
92         }
93 }
94
95
96 /*
97  * Entry point for RSS feed generator
98  */
99 void sitemap(void) {
100         HashList *roomlist;
101         HashPos *it;
102         long HKlen;
103         const char *HashKey;
104         folder *room;
105
106         output_headers(0, 0, 0, 0, 1, 0);
107         hprintf("Content-type: text/xml\r\n");
108         hprintf(
109                 "Server: %s / %s\r\n"
110                 "Connection: close\r\n"
111         ,
112                 PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software)
113         );
114         begin_burst();
115
116         wc_printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
117         wc_printf("<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\r\n");
118
119         roomlist = GetRoomListHashLKRA(NULL, NULL);
120         it = GetNewHashPos(roomlist, 0);
121
122         while (GetNextHashPos(roomlist, it, &HKlen, &HashKey, (void *)&room))
123         {
124                 /* Output the messages in this room only if it's a room type we can make sense of */
125                 switch(room->defview) {
126                 case VIEW_BBS:
127                         gotoroom(room->name);
128                         sitemap_do_bbs();
129                         break;
130                 case VIEW_WIKI:
131                         gotoroom(room->name);
132                         sitemap_do_wiki();
133                         break;
134                 default:
135                         break;
136                 }
137         }
138
139         DeleteHashPos(&it);
140         /* DeleteHash(&roomlist); This will be freed when the session closes */
141
142         wc_printf("</urlset>\r\n");
143         wDumpContent(0);
144 }
145
146
147 void 
148 InitModule_SITEMAP
149 (void)
150 {
151         WebcitAddUrlHandler(HKEY("sitemap"), "", 0, sitemap, ANONYMOUS|COOKIEUNNEEDED);
152         WebcitAddUrlHandler(HKEY("sitemap.xml"), "", 0, sitemap, ANONYMOUS|COOKIEUNNEEDED);
153 }