00001
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "config.h"
00021 #include "defines.h"
00022
00023 #include <stdlib.h>
00024 #include <gdome.h>
00025 #include <pthread.h>
00026 #include <stdio.h>
00027 #include <ctype.h>
00028 #include <string.h>
00029 #include <errno.h>
00030
00031 #include <sys/types.h>
00032 #include <sys/stat.h>
00033
00034 #include "cf_pthread.h"
00035
00036 #include "charconvert.h"
00037 #include "utils.h"
00038 #include "hashlib.h"
00039 #include "readline.h"
00040 #include "fo_server.h"
00041 #include "configparser.h"
00042 #include "xml_handling.h"
00043 #include "serverlib.h"
00044
00045
00046
00047 GdomeDocument *xml_create_doc(GdomeDOMImplementation *impl,const u_char *dtd_uri) {
00048 GdomeException e;
00049 GdomeDOMString *qname = gdome_str_mkref("Forum");
00050 GdomeDOMString *sysid = gdome_str_mkref_dup(dtd_uri);
00051 GdomeDocumentType *dtd = gdome_di_createDocumentType(impl,qname,NULL,sysid,&e);
00052 GdomeDocument *doc = gdome_di_createDocument(impl,NULL,qname,dtd,&e);
00053
00054 gdome_str_unref(qname);
00055 gdome_str_unref(sysid);
00056 gdome_dt_unref(dtd,&e);
00057
00058 return doc;
00059 }
00060
00061
00062
00063 GdomeElement *xml_create_element(GdomeDocument *doc,const u_char *name) {
00064 GdomeException e;
00065 GdomeDOMString *tmp = gdome_str_mkref_dup(name);
00066 GdomeElement *el = gdome_doc_createElement(doc,tmp,&e);
00067 gdome_str_unref(tmp);
00068
00069 return el;
00070 }
00071
00072
00073
00074 void xml_set_attribute(GdomeElement *el,const u_char *name,const u_char *val) {
00075 GdomeException e;
00076 GdomeDOMString *nm = gdome_str_mkref_dup(name);
00077 GdomeDOMString *vl = gdome_str_mkref_dup(val);
00078
00079 if(val == NULL) {
00080 cf_log(LOG_ERR,__FILE__,__LINE__,"val is null! (name: %s)\n",name);
00081 }
00082
00083 gdome_el_setAttribute(el,nm,vl,&e);
00084
00085 gdome_str_unref(nm);
00086 gdome_str_unref(vl);
00087 }
00088
00089
00090
00091 void xml_set_value(GdomeDocument *doc,GdomeElement *el,const u_char *value) {
00092 GdomeException e;
00093 GdomeDOMString *str = gdome_str_mkref_dup(value);
00094 GdomeText *txt = gdome_doc_createTextNode(doc,str,&e);
00095
00096 gdome_el_appendChild(el,(GdomeNode *)txt,&e);
00097
00098 gdome_t_unref(txt,&e);
00099 gdome_str_unref(str);
00100 }
00101
00102
00103
00104 t_posting *stringify_posting(GdomeDocument *doc1,GdomeElement *t1,GdomeDocument *doc2,GdomeElement *t2,t_posting *p) {
00105 int lvl = p->level;
00106 u_char buff[50];
00107 GdomeException e;
00108 GdomeElement *elem1,*elem2;
00109 GdomeElement *m1 = xml_create_element(doc1,"Message");
00110 GdomeElement *m2 = xml_create_element(doc2,"Message");
00111
00112 GdomeElement *header1 = xml_create_element(doc1,"Header");
00113 GdomeElement *header2 = xml_create_element(doc2,"Header");
00114
00115 GdomeElement *author1 = xml_create_element(doc1,"Author");
00116 GdomeElement *author2 = xml_create_element(doc2,"Author");
00117
00118 gdome_el_appendChild(m1,(GdomeNode *)header1,&e);
00119 gdome_el_appendChild(m2,(GdomeNode *)header2,&e);
00120
00121 gdome_el_appendChild(header1,(GdomeNode *)author1,&e);
00122 gdome_el_appendChild(header2,(GdomeNode *)author2,&e);
00123
00124
00125
00126 xml_set_attribute(m1,"invisible",p->invisible ? "1" : "0");
00127 xml_set_attribute(m2,"invisible",p->invisible ? "1" : "0");
00128
00129
00130 elem1 = xml_create_element(doc1,"Name");
00131 elem2 = xml_create_element(doc2,"Name");
00132
00133 xml_set_value(doc1,elem1,p->user.name);
00134 xml_set_value(doc2,elem2,p->user.name);
00135
00136 gdome_el_appendChild(author1,(GdomeNode *)elem1,&e);
00137 gdome_el_appendChild(author2,(GdomeNode *)elem2,&e);
00138
00139 gdome_el_unref(elem1,&e);
00140 gdome_el_unref(elem2,&e);
00141
00142
00143
00144 elem1 = xml_create_element(doc1,"Email");
00145 elem2 = xml_create_element(doc2,"Email");
00146
00147 if(p->user.email) {
00148 xml_set_value(doc1,elem1,p->user.email);
00149 xml_set_value(doc2,elem2,p->user.email);
00150 }
00151
00152 gdome_el_appendChild(author1,(GdomeNode *)elem1,&e);
00153 gdome_el_appendChild(author2,(GdomeNode *)elem2,&e);
00154
00155 gdome_el_unref(elem1,&e);
00156 gdome_el_unref(elem2,&e);
00157
00158
00159 elem1 = xml_create_element(doc1,"HomepageUrl");
00160 elem2 = xml_create_element(doc2,"HomepageUrl");
00161
00162 if(p->user.hp) {
00163 xml_set_value(doc1,elem1,p->user.hp);
00164 xml_set_value(doc2,elem2,p->user.hp);
00165 }
00166
00167 gdome_el_appendChild(author1,(GdomeNode *)elem1,&e);
00168 gdome_el_appendChild(author2,(GdomeNode *)elem2,&e);
00169
00170 gdome_el_unref(elem1,&e);
00171 gdome_el_unref(elem2,&e);
00172
00173
00174 elem1 = xml_create_element(doc1,"ImageUrl");
00175 elem2 = xml_create_element(doc2,"ImageUrl");
00176
00177 if(p->user.img) {
00178 xml_set_value(doc1,elem1,p->user.img);
00179 xml_set_value(doc2,elem2,p->user.img);
00180 }
00181
00182 gdome_el_appendChild(author1,(GdomeNode *)elem1,&e);
00183 gdome_el_appendChild(author2,(GdomeNode *)elem2,&e);
00184
00185 gdome_el_unref(elem1,&e);
00186 gdome_el_unref(elem2,&e);
00187
00188
00189 elem1 = xml_create_element(doc1,"Category");
00190 elem2 = xml_create_element(doc2,"Category");
00191
00192 if(p->category) {
00193 xml_set_value(doc1,elem1,p->category);
00194 xml_set_value(doc2,elem2,p->category);
00195 }
00196
00197 gdome_el_appendChild(header1,(GdomeNode *)elem1,&e);
00198 gdome_el_appendChild(header2,(GdomeNode *)elem2,&e);
00199
00200 gdome_el_unref(elem1,&e);
00201 gdome_el_unref(elem2,&e);
00202
00203
00204 elem1 = xml_create_element(doc1,"Subject");
00205 elem2 = xml_create_element(doc2,"Subject");
00206
00207 xml_set_value(doc1,elem1,p->subject);
00208 xml_set_value(doc2,elem2,p->subject);
00209
00210 gdome_el_appendChild(header1,(GdomeNode *)elem1,&e);
00211 gdome_el_appendChild(header2,(GdomeNode *)elem2,&e);
00212
00213 gdome_el_unref(elem1,&e);
00214 gdome_el_unref(elem2,&e);
00215
00216
00217 elem1 = xml_create_element(doc1,"Date");
00218 elem2 = xml_create_element(doc2,"Date");
00219
00220 sprintf(buff,"%ld",p->date);
00221
00222 xml_set_attribute(elem1,"longSec",buff);
00223 xml_set_attribute(elem2,"longSec",buff);
00224
00225 gdome_el_appendChild(header1,(GdomeNode *)elem1,&e);
00226 gdome_el_appendChild(header2,(GdomeNode *)elem2,&e);
00227
00228 gdome_el_unref(elem1,&e);
00229 gdome_el_unref(elem2,&e);
00230
00231
00232
00233 sprintf(buff,"m%lld",p->mid);
00234 xml_set_attribute(m1,"id",buff);
00235
00236 if(p->unid) {
00237 xml_set_attribute(m1,"unid",p->unid);
00238 }
00239
00240 xml_set_attribute(m2,"id",buff);
00241 xml_set_attribute(m2,"ip",p->user.ip);
00242
00243 gdome_el_appendChild(t1,(GdomeNode *)m1,&e);
00244 gdome_el_appendChild(t2,(GdomeNode *)m2,&e);
00245
00246 for(p=p->next;p;) {
00247 if(p->level > lvl) {
00248 p = stringify_posting(doc1,m1,doc2,m2,p);
00249 }
00250 else {
00251 gdome_el_unref(m1,&e);
00252 gdome_el_unref(m2,&e);
00253
00254 gdome_el_unref(header1,&e);
00255 gdome_el_unref(header2,&e);
00256
00257 gdome_el_unref(author1,&e);
00258 gdome_el_unref(author2,&e);
00259
00260 return p;
00261 }
00262 }
00263
00264 gdome_el_unref(m1,&e);
00265 gdome_el_unref(m2,&e);
00266
00267 gdome_el_unref(header1,&e);
00268 gdome_el_unref(header2,&e);
00269
00270 gdome_el_unref(author1,&e);
00271 gdome_el_unref(author2,&e);
00272
00273 return NULL;
00274 }
00275
00276
00277
00278 void stringify_thread_and_write_to_disk(GdomeDocument *doc1,t_thread *t) {
00279 t_name_value *mpath = cfg_get_value(&fo_default_conf,"MessagePath");
00280 GdomeException e;
00281 u_char buff[256];
00282 GdomeDOMImplementation *impl = gdome_di_mkref();
00283 GdomeDocument *doc2 = xml_create_doc(impl,FORUM_DTD);
00284 GdomeElement *thread1 = xml_create_element(doc1,"Thread");
00285 GdomeElement *thread2 = xml_create_element(doc2,"Thread");
00286 GdomeElement *msgcnt = xml_create_element(doc2,"ContentList");
00287 GdomeElement *root = gdome_doc_documentElement(doc1,&e);
00288 GdomeElement *el;
00289 GdomeCDATASection *cd;
00290 GdomeDOMString *str;
00291 t_posting *p;
00292
00293 sprintf(buff,"t%lld",t->tid);
00294
00295 xml_set_attribute(thread1,"id",buff);
00296 xml_set_attribute(thread2,"id",buff);
00297
00298 stringify_posting(doc1,thread1,doc2,thread2,t->postings);
00299
00300 for(p=t->postings;p;p=p->next) {
00301 el = xml_create_element(doc2,"MessageContent");
00302 sprintf(buff,"m%lld",p->mid);
00303 xml_set_attribute(el,"mid",buff);
00304
00305 str = gdome_str_mkref_dup(p->content);
00306
00307 cd = gdome_doc_createCDATASection(doc2,str,&e);
00308 gdome_el_appendChild(el,(GdomeNode *)cd,&e);
00309 gdome_el_appendChild(msgcnt,(GdomeNode *)el,&e);
00310
00311 gdome_cds_unref(cd,&e);
00312 gdome_str_unref(str);
00313 gdome_el_unref(el,&e);
00314 }
00315
00316 gdome_el_appendChild(root,(GdomeNode *)thread1,&e);
00317 gdome_el_unref(root,&e);
00318
00319 root = gdome_doc_documentElement(doc2,&e);
00320 gdome_el_appendChild(root,(GdomeNode *)thread2,&e);
00321 gdome_el_appendChild(root,(GdomeNode *)msgcnt,&e);
00322
00323
00324 snprintf(buff,256,"%s/t%lld.xml",mpath->values[0],t->tid);
00325 if(!gdome_di_saveDocToFile(impl,doc2,buff,0,&e)) {
00326 cf_log(LOG_ERR,__FILE__,__LINE__,"ERROR! COULD NOT WRITE XML FILE!\n");
00327 }
00328
00329 gdome_el_unref(thread1,&e);
00330 gdome_el_unref(thread2,&e);
00331 gdome_el_unref(msgcnt,&e);
00332 gdome_el_unref(root,&e);
00333
00334 gdome_doc_unref(doc2,&e);
00335
00336 gdome_di_unref(impl,&e);
00337 }
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 u_char *get_node_value(GdomeNode *n) {
00349 GdomeException exc;
00350 GdomeNode *x = gdome_n_firstChild(n,&exc);
00351
00352 if(x) {
00353 GdomeDOMString *y = gdome_n_nodeValue(x,&exc);
00354
00355 if(y) {
00356 u_char *z = strdup(y->str);
00357
00358 gdome_n_unref(x,&exc);
00359 gdome_str_unref(y);
00360
00361 return z;
00362 }
00363 else {
00364 GdomeDOMString *y = gdome_n_nodeValue(n,&exc);
00365
00366 if(y) {
00367 u_char *z = strdup(y->str);
00368
00369 gdome_n_unref(x,&exc);
00370 gdome_str_unref(y);
00371
00372 return z;
00373 }
00374 }
00375
00376 gdome_n_unref(x,&exc);
00377 }
00378
00379 return NULL;
00380 }
00381
00382
00383
00384