Main Page | Modules | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

xml_handling.c

Go to the documentation of this file.
00001 
00010 /* {{{ Initial headers */
00011 /*
00012  * $LastChangedDate: 2003-11-27 01:55:17 +0100 (Thu, 27 Nov 2003) $
00013  * $LastChangedRevision: 5 $
00014  * $LastChangedBy: ckruse $
00015  *
00016  */
00017 /* }}} */
00018 
00019 /* {{{ Includes */
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 /* {{{ xml_create_doc */
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 /* {{{ xml_create_element */
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 /* {{{ xml_set_attribute */
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 /* {{{ xml_set_value */
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 /* {{{ stringify_posting */
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   /* the invisible flag */
00126   xml_set_attribute(m1,"invisible",p->invisible ? "1" : "0");
00127   xml_set_attribute(m2,"invisible",p->invisible ? "1" : "0");
00128 
00129   /* the name */
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   /* the email address */
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   /* the homepage url */
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   /* the image url */
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   /* category */
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   /* subject */
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   /* date */
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   /* set the id and the ip... */
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 { /* smaller or equal */
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 /* {{{ stringify_thread_and_write_to_disk */
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); /* this fucking silly line causes the memory leek :/ */
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   /* save doc to file... */
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 /* {{{ get_node_value
00341  * Returns: u_char *  (NULL on failure)
00342  * Parameters:
00343  *   - GdomeNode *n
00344  *
00345  * this function tries to get the node value
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 /* eof */
00384 

Generated on Sun Apr 25 16:37:39 2004 for Classic Forum by doxygen 1.3.5