diff -r 1fdbf4170ef4 -r b8bf95b39952 src/server/webdav/saxhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/server/webdav/saxhandler.cpp Sat Jan 14 13:53:44 2012 +0100 @@ -0,0 +1,128 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2011 Olaf Wintermann. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include "../ucx/sstring.h" +#include "../ucx/dlist.h" +#include "../util/pool.h" + +#include "saxhandler.h" + +using std; + +PropfindHandler::PropfindHandler(PropfindRequest *rq, pool_handle_t *p) { + davrq = rq; + pool = p; + + davPropTag = false; + property = NULL; +} + +PropfindHandler::~PropfindHandler() { + +} + +void PropfindHandler::startElement( + const XMLCh *const uri, + const XMLCh* const localname, + const XMLCh* const qname, + const Attributes& attrs) +{ + char *ns = XMLString::transcode(uri); + char *name = XMLString::transcode(localname); + + if(!strcmp(ns, "DAV:") && !strcmp(name, "prop")) { + davPropTag = true; + } else if(davPropTag && property == NULL) { + //property = (DavProperty*)pool_malloc(pool, sizeof(DavProperty)); + property = (DavProperty*)malloc(sizeof(DavProperty)); + /* Ultra TODO: pool_malloc makes big mistakes!! */ + + size_t nslen = strlen(ns); + size_t namelen = strlen(name); + if(nslen > 0) { + property->xmlns = (char*)pool_malloc(pool, nslen + 1); + property->xmlns[nslen] = 0; + memcpy(property->xmlns, ns, nslen); + } else { + property->xmlns = NULL; + } + + if(namelen > 0) { + property->name = (char*)pool_malloc(pool, namelen + 1); + property->name[namelen] = 0; + memcpy(property->name, name, namelen); + } else { + property->name = NULL; + } + } + + XMLString::release(&ns); + XMLString::release(&name); +} + + +void PropfindHandler::endElement( + const XMLCh* const uri, + const XMLCh* const localname, + const XMLCh* const qname) +{ + char *ns = XMLString::transcode(uri); + char *name = XMLString::transcode(localname); + + if(property != NULL) { + const char *xmlns = (property->xmlns) ? property->xmlns : ""; + + if(!strcmp(ns, xmlns) && !strcmp(name, property->name)) { + // add property to DavRequest + UcxDlist *elm = (UcxDlist*)pool_malloc(pool, sizeof(UcxDlist)); + elm->prev = NULL; + elm->next = NULL; + elm->data = property; + //printf("saxhandler: add property: {%s}\n", property->name); + davrq->properties = ucx_dlist_concat(davrq->properties, elm); + + property = NULL; + } + } + + XMLString::release(&ns); + XMLString::release(&name); +} + +void PropfindHandler::startDocument() { + +} + +void PropfindHandler::endDocument() { + +} +