/* produce full duplicate of x with a new xode_pool, x must be a tag! */ xode xode_dup(xode x) { xode x2; if(x == NULL) return NULL; x2 = xode_new(xode_get_name(x)); if (xode_has_attribs(x)) xode_insert_node(x2, xode_get_firstattrib(x)); if (xode_has_children(x)) xode_insert_node(x2, xode_get_firstchild(x)); return x2; }
static void _xode_expat_startElement(void* userdata, const char* name, const char** atts) { /* get the xmlnode pointed to by the userdata */ xode *x = userdata; xode current = *x; if (current == NULL) { /* allocate a base node */ current = xode_new(name); _xode_put_expatattribs(current, atts); *x = current; } else { *x = xode_insert_tag(current, name); _xode_put_expatattribs(*x, atts); } }
/* attempts to parse the buff onto this stream firing events to the handler, returns the last known status */ int xode_stream_eat(xode_stream xs, char *buff, int len) { char *err; xode xerr; static char maxerr[] = "maximum node size reached"; static char deeperr[] = "maximum node depth reached"; if(xs == NULL) { fprintf(stderr,"Fatal Programming Error: xode_streameat() was improperly called with NULL.\n"); return XODE_STREAM_ERROR; } if(len == 0 || buff == NULL) return xs->status; if(len == -1) /* easy for hand-fed eat calls */ len = strlen(buff); if(!XML_Parse(xs->parser, buff, len, 0)) { err = (char *)XML_ErrorString(XML_GetErrorCode(xs->parser)); xs->status = XODE_STREAM_ERROR; }else if(xode_pool_size(xode_get_pool(xs->node)) > XODE_STREAM_MAXNODE || xs->cdata_len > XODE_STREAM_MAXNODE){ err = maxerr; xs->status = XODE_STREAM_ERROR; }else if(xs->status == XODE_STREAM_ERROR){ /* set within expat handlers */ err = deeperr; }else{ err = deeperr; } /* fire parsing error event, make a node containing the error string */ if(xs->status == XODE_STREAM_ERROR) { xerr = xode_new("error"); xode_insert_cdata(xerr,err,-1); (xs->f)(XODE_STREAM_ERROR, xerr, xs->arg); } return xs->status; }
tt_user *users_save(const char *jid) { tt_user **user, *user0; xode cfg, x; char *file; if (jid == NULL) return NULL; if ((file = malloc(strlen(config_dir) + strlen(jid) + 2)) == NULL) { perror("malloc()"); exit(1); } sprintf(file, "%s/%s", config_dir, jid); my_debug(0, "users: Zapisuje plik %s", file); user = jid_jid2user(jid); user0 = *user; cfg = xode_new("user"); x = xode_insert_tag(cfg, "jid"); xode_insert_cdata(x, user0->jid, -1); x = xode_insert_tag(cfg, "tid"); xode_insert_cdata(x, user0->tid_short, -1); x = xode_insert_tag(cfg, "password"); xode_insert_cdata(x, user0->password, -1); x = xode_insert_tag(cfg, "notify"); xode_put_attrib(x, "mail", (user0->mailnotify ? "1" : "0")); xode_put_attrib(x, "typing", (user0->typingnotify ? "1" : "0")); xode_put_attrib(x, "alarm", (user0->alarmnotify ? "1" : "0")); xode_to_file(file, cfg); xode_free(cfg); t_free(file); return user0; }