xref: /AOO41X/main/ucb/source/ucp/webdav/webdavresponseparser.cxx (revision 3edf699282957a8d2e0e344ed73ba96dfb5a45a4)
18590a0fdSAndre Fischer /**************************************************************
28590a0fdSAndre Fischer  *
38590a0fdSAndre Fischer  * Licensed to the Apache Software Foundation (ASF) under one
48590a0fdSAndre Fischer  * or more contributor license agreements.  See the NOTICE file
58590a0fdSAndre Fischer  * distributed with this work for additional information
68590a0fdSAndre Fischer  * regarding copyright ownership.  The ASF licenses this file
78590a0fdSAndre Fischer  * to you under the Apache License, Version 2.0 (the
88590a0fdSAndre Fischer  * "License"); you may not use this file except in compliance
98590a0fdSAndre Fischer  * with the License.  You may obtain a copy of the License at
108590a0fdSAndre Fischer  *
118590a0fdSAndre Fischer  *   http://www.apache.org/licenses/LICENSE-2.0
128590a0fdSAndre Fischer  *
138590a0fdSAndre Fischer  * Unless required by applicable law or agreed to in writing,
148590a0fdSAndre Fischer  * software distributed under the License is distributed on an
158590a0fdSAndre Fischer  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
168590a0fdSAndre Fischer  * KIND, either express or implied.  See the License for the
178590a0fdSAndre Fischer  * specific language governing permissions and limitations
188590a0fdSAndre Fischer  * under the License.
198590a0fdSAndre Fischer  *
208590a0fdSAndre Fischer  *************************************************************/
218590a0fdSAndre Fischer 
228590a0fdSAndre Fischer // MARKER(update_precomp.py): autogen include statement, do not remove
238590a0fdSAndre Fischer #include "precompiled_ucb.hxx"
248590a0fdSAndre Fischer 
25c1c10f68SAriel Constenla-Haile #include "webdavresponseparser.hxx"
268590a0fdSAndre Fischer #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
278590a0fdSAndre Fischer #include <cppuhelper/implbase2.hxx>
288590a0fdSAndre Fischer #include <com/sun/star/xml/sax/XParser.hpp>
298590a0fdSAndre Fischer #include <com/sun/star/xml/sax/InputSource.hpp>
308590a0fdSAndre Fischer #include <comphelper/processfactory.hxx>
318590a0fdSAndre Fischer #include <comphelper/seqstream.hxx>
32*3edf6992SAndrea Pescetti #include <com/sun/star/ucb/Lock.hpp>
33*3edf6992SAndrea Pescetti #include <com/sun/star/ucb/LockDepth.hpp>
348590a0fdSAndre Fischer #include <com/sun/star/ucb/LockEntry.hpp>
358590a0fdSAndre Fischer #include <com/sun/star/ucb/LockScope.hpp>
368590a0fdSAndre Fischer #include <com/sun/star/ucb/LockType.hpp>
378590a0fdSAndre Fischer #include <map>
388590a0fdSAndre Fischer #include <hash_map>
398590a0fdSAndre Fischer 
408590a0fdSAndre Fischer //////////////////////////////////////////////////////////////////////////////
418590a0fdSAndre Fischer 
428590a0fdSAndre Fischer using namespace com::sun::star;
438590a0fdSAndre Fischer 
448590a0fdSAndre Fischer //////////////////////////////////////////////////////////////////////////////
458590a0fdSAndre Fischer // WebDAVNamespace enum and StringToEnum converter
468590a0fdSAndre Fischer 
478590a0fdSAndre Fischer namespace
488590a0fdSAndre Fischer {
498590a0fdSAndre Fischer     enum WebDAVNamespace
508590a0fdSAndre Fischer     {
518590a0fdSAndre Fischer         WebDAVNamespace_unknown = 0,
528590a0fdSAndre Fischer         WebDAVNamespace_DAV,
538590a0fdSAndre Fischer         WebDAVNamespace_ucb_openoffice_org_dav_props,
548590a0fdSAndre Fischer 
558590a0fdSAndre Fischer         WebDAVNamespace_last
568590a0fdSAndre Fischer     };
578590a0fdSAndre Fischer 
StrToWebDAVNamespace(const rtl::OUString & rStr)588590a0fdSAndre Fischer     WebDAVNamespace StrToWebDAVNamespace(const rtl::OUString& rStr)
598590a0fdSAndre Fischer     {
608590a0fdSAndre Fischer         static ::rtl::OUString aStrDAV(::rtl::OUString::createFromAscii("DAV:"));
618590a0fdSAndre Fischer         static ::rtl::OUString aStrUcbOpenofficeOrgDAVProps(::rtl::OUString::createFromAscii("http://ucb.openoffice.org/dav/props/"));
628590a0fdSAndre Fischer 
638590a0fdSAndre Fischer         if(rStr.equals(aStrDAV))
648590a0fdSAndre Fischer         {
658590a0fdSAndre Fischer             return WebDAVNamespace_DAV;
668590a0fdSAndre Fischer         }
678590a0fdSAndre Fischer         else if(rStr.equals(aStrUcbOpenofficeOrgDAVProps))
688590a0fdSAndre Fischer         {
698590a0fdSAndre Fischer             return WebDAVNamespace_ucb_openoffice_org_dav_props;
708590a0fdSAndre Fischer         }
718590a0fdSAndre Fischer 
728590a0fdSAndre Fischer         return WebDAVNamespace_unknown;
738590a0fdSAndre Fischer     }
748590a0fdSAndre Fischer } // end of anonymous namespace
758590a0fdSAndre Fischer 
768590a0fdSAndre Fischer //////////////////////////////////////////////////////////////////////////////
778590a0fdSAndre Fischer // WebDAVName enum and StringToEnum converter using hash_map
788590a0fdSAndre Fischer 
798590a0fdSAndre Fischer namespace
808590a0fdSAndre Fischer {
818590a0fdSAndre Fischer     enum WebDAVName
828590a0fdSAndre Fischer     {
838590a0fdSAndre Fischer         WebDAVName_unknown = 0,
848590a0fdSAndre Fischer         WebDAVName_multistatus,
858590a0fdSAndre Fischer         WebDAVName_response,
868590a0fdSAndre Fischer         WebDAVName_href,
878590a0fdSAndre Fischer         WebDAVName_propstat,
888590a0fdSAndre Fischer         WebDAVName_prop,
898590a0fdSAndre Fischer         WebDAVName_resourcetype,
908590a0fdSAndre Fischer         WebDAVName_collection,
918590a0fdSAndre Fischer         WebDAVName_getcontenttype,
928590a0fdSAndre Fischer         WebDAVName_supportedlock,
938590a0fdSAndre Fischer         WebDAVName_lockentry,
948590a0fdSAndre Fischer         WebDAVName_lockscope,
958590a0fdSAndre Fischer         WebDAVName_exclusive,
968590a0fdSAndre Fischer         WebDAVName_locktype,
978590a0fdSAndre Fischer         WebDAVName_write,
988590a0fdSAndre Fischer         WebDAVName_shared,
99*3edf6992SAndrea Pescetti         WebDAVName_lockdiscovery,
100*3edf6992SAndrea Pescetti         WebDAVName_activelock,
101*3edf6992SAndrea Pescetti         WebDAVName_depth,
102*3edf6992SAndrea Pescetti         WebDAVName_owner,
103*3edf6992SAndrea Pescetti         WebDAVName_timeout,
104*3edf6992SAndrea Pescetti         WebDAVName_locktoken,
1058590a0fdSAndre Fischer         WebDAVName_status,
1068590a0fdSAndre Fischer         WebDAVName_getlastmodified,
1078590a0fdSAndre Fischer         WebDAVName_creationdate,
1088590a0fdSAndre Fischer         WebDAVName_getcontentlength,
1098590a0fdSAndre Fischer 
1108590a0fdSAndre Fischer         WebDAVName_last
1118590a0fdSAndre Fischer     };
1128590a0fdSAndre Fischer 
StrToWebDAVName(const rtl::OUString & rStr)1138590a0fdSAndre Fischer     WebDAVName StrToWebDAVName(const rtl::OUString& rStr)
1148590a0fdSAndre Fischer     {
1158590a0fdSAndre Fischer         typedef std::hash_map< rtl::OUString, WebDAVName, rtl::OUStringHash > WebDAVNameMapper;
1168590a0fdSAndre Fischer         typedef std::pair< rtl::OUString, WebDAVName > WebDAVNameValueType;
1178590a0fdSAndre Fischer         static WebDAVNameMapper aWebDAVNameMapperList;
1188590a0fdSAndre Fischer 
1198590a0fdSAndre Fischer         if(aWebDAVNameMapperList.empty())
1208590a0fdSAndre Fischer         {
1218590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("multistatus"), WebDAVName_multistatus));
1228590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("response"), WebDAVName_response));
1238590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("href"), WebDAVName_href));
1248590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("propstat"), WebDAVName_propstat));
1258590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("prop"), WebDAVName_prop));
1268590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("resourcetype"), WebDAVName_resourcetype));
1278590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("collection"), WebDAVName_collection));
1288590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("getcontenttype"), WebDAVName_getcontenttype));
1298590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("supportedlock"), WebDAVName_supportedlock));
1308590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("lockentry"), WebDAVName_lockentry));
1318590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("lockscope"), WebDAVName_lockscope));
1328590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("exclusive"), WebDAVName_exclusive));
1338590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("locktype"), WebDAVName_locktype));
1348590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("write"), WebDAVName_write));
1358590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("shared"), WebDAVName_shared));
136*3edf6992SAndrea Pescetti             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("lockdiscovery"), WebDAVName_lockdiscovery));
137*3edf6992SAndrea Pescetti             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("activelock"), WebDAVName_activelock));
138*3edf6992SAndrea Pescetti             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("depth"), WebDAVName_depth));
139*3edf6992SAndrea Pescetti             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("owner"), WebDAVName_owner));
140*3edf6992SAndrea Pescetti             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("timeout"), WebDAVName_timeout));
141*3edf6992SAndrea Pescetti             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("locktoken"), WebDAVName_locktoken));
1428590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("status"), WebDAVName_status));
1438590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("getlastmodified"), WebDAVName_getlastmodified));
1448590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("creationdate"), WebDAVName_creationdate));
1458590a0fdSAndre Fischer             aWebDAVNameMapperList.insert(WebDAVNameValueType(rtl::OUString::createFromAscii("getcontentlength"), WebDAVName_getcontentlength));
1468590a0fdSAndre Fischer         }
1478590a0fdSAndre Fischer 
1488590a0fdSAndre Fischer         const WebDAVNameMapper::const_iterator aResult(aWebDAVNameMapperList.find(rStr));
1498590a0fdSAndre Fischer 
1508590a0fdSAndre Fischer         if(aResult == aWebDAVNameMapperList.end())
1518590a0fdSAndre Fischer         {
1528590a0fdSAndre Fischer             return WebDAVName_unknown;
1538590a0fdSAndre Fischer         }
1548590a0fdSAndre Fischer         else
1558590a0fdSAndre Fischer         {
1568590a0fdSAndre Fischer             return aResult->second;
1578590a0fdSAndre Fischer         }
1588590a0fdSAndre Fischer     }
1598590a0fdSAndre Fischer } // end of anonymous namespace
1608590a0fdSAndre Fischer 
1618590a0fdSAndre Fischer //////////////////////////////////////////////////////////////////////////////
1628590a0fdSAndre Fischer // WebDAVContext, holding information for each start/endElement pair
1638590a0fdSAndre Fischer 
1648590a0fdSAndre Fischer namespace
1658590a0fdSAndre Fischer {
1668590a0fdSAndre Fischer     typedef std::map< ::rtl::OUString, ::rtl::OUString > NamespaceMap;
1678590a0fdSAndre Fischer     typedef std::pair< const ::rtl::OUString, ::rtl::OUString > NamespaceValueType;
1688590a0fdSAndre Fischer 
1698590a0fdSAndre Fischer     class WebDAVContext
1708590a0fdSAndre Fischer     {
1718590a0fdSAndre Fischer     private:
1728590a0fdSAndre Fischer         WebDAVContext*              mpParent;
1738590a0fdSAndre Fischer         NamespaceMap                maNamespaceMap;
1748590a0fdSAndre Fischer         ::rtl::OUString             maWhiteSpace;
1758590a0fdSAndre Fischer 
1768590a0fdSAndre Fischer         ::rtl::OUString             maNamespace;
1778590a0fdSAndre Fischer         ::rtl::OUString             maName;
1788590a0fdSAndre Fischer 
1798590a0fdSAndre Fischer         WebDAVNamespace             maWebDAVNamespace;
1808590a0fdSAndre Fischer         WebDAVName                  maWebDAVName;
1818590a0fdSAndre Fischer 
1828590a0fdSAndre Fischer         // local helpers
1838590a0fdSAndre Fischer         void parseForNamespaceTokens(const uno::Reference< xml::sax::XAttributeList >& xAttribs);
1848590a0fdSAndre Fischer         ::rtl::OUString mapNamespaceToken(const ::rtl::OUString& rToken) const;
1858590a0fdSAndre Fischer         void splitName(const ::rtl::OUString& rSource);
1868590a0fdSAndre Fischer 
1878590a0fdSAndre Fischer     public:
1888590a0fdSAndre Fischer         WebDAVContext(WebDAVContext* pParent, const ::rtl::OUString& aName, const uno::Reference< xml::sax::XAttributeList >& xAttribs);
1898590a0fdSAndre Fischer         ~WebDAVContext();
1908590a0fdSAndre Fischer 
getParent() const1918590a0fdSAndre Fischer         WebDAVContext* getParent() const { return mpParent; }
getWhiteSpace()1928590a0fdSAndre Fischer         ::rtl::OUString& getWhiteSpace() { return maWhiteSpace; }
setWhiteSpace(const::rtl::OUString & rNew)1938590a0fdSAndre Fischer         void setWhiteSpace(const ::rtl::OUString& rNew) { maWhiteSpace = rNew; }
1948590a0fdSAndre Fischer 
getNamespace() const1958590a0fdSAndre Fischer         const ::rtl::OUString& getNamespace() const { return maNamespace; }
getName() const1968590a0fdSAndre Fischer         const ::rtl::OUString& getName() const { return maName; }
getWebDAVNamespace() const197a180b29cSHerbert Dürr         WebDAVNamespace getWebDAVNamespace() const { return maWebDAVNamespace; }
getWebDAVName() const198a180b29cSHerbert Dürr         WebDAVName getWebDAVName() const { return maWebDAVName; }
1998590a0fdSAndre Fischer     };
2008590a0fdSAndre Fischer 
parseForNamespaceTokens(const uno::Reference<xml::sax::XAttributeList> & xAttribs)2018590a0fdSAndre Fischer     void WebDAVContext::parseForNamespaceTokens(const uno::Reference< xml::sax::XAttributeList >& xAttribs)
2028590a0fdSAndre Fischer     {
2038590a0fdSAndre Fischer         const sal_Int16 nAttributes(xAttribs->getLength());
2048590a0fdSAndre Fischer         static ::rtl::OUString aStrXmlns(::rtl::OUString::createFromAscii("xmlns"));
2058590a0fdSAndre Fischer 
2068590a0fdSAndre Fischer         for(sal_Int16 a(0); a < nAttributes; a++)
2078590a0fdSAndre Fischer         {
2088590a0fdSAndre Fischer             const ::rtl::OUString aName(xAttribs->getNameByIndex(a));
2098590a0fdSAndre Fischer             const sal_Int32 nLen(aName.getLength());
2108590a0fdSAndre Fischer 
2118590a0fdSAndre Fischer             if(nLen)
2128590a0fdSAndre Fischer             {
2138590a0fdSAndre Fischer                 if(aName.match(aStrXmlns, 0))
2148590a0fdSAndre Fischer                 {
2158590a0fdSAndre Fischer                     const sal_Int32 nIndex(aName.indexOf(sal_Unicode(':'), 0));
2168590a0fdSAndre Fischer 
2178590a0fdSAndre Fischer                     if(-1 != nIndex && nIndex + 1 < nLen)
2188590a0fdSAndre Fischer                     {
2198590a0fdSAndre Fischer                         const ::rtl::OUString aToken(aName.copy(nIndex + 1));
2208590a0fdSAndre Fischer 
2218590a0fdSAndre Fischer                         maNamespaceMap.insert(NamespaceValueType(aToken, xAttribs->getValueByIndex(a)));
2228590a0fdSAndre Fischer                     }
2238590a0fdSAndre Fischer                 }
2248590a0fdSAndre Fischer             }
2258590a0fdSAndre Fischer         }
2268590a0fdSAndre Fischer     }
2278590a0fdSAndre Fischer 
mapNamespaceToken(const::rtl::OUString & rToken) const2288590a0fdSAndre Fischer     ::rtl::OUString WebDAVContext::mapNamespaceToken(const ::rtl::OUString& rToken) const
2298590a0fdSAndre Fischer     {
2308590a0fdSAndre Fischer         NamespaceMap::const_iterator iter = maNamespaceMap.find(rToken);
2318590a0fdSAndre Fischer 
2328590a0fdSAndre Fischer         if(maNamespaceMap.end() == iter)
2338590a0fdSAndre Fischer         {
2348590a0fdSAndre Fischer             if(getParent())
2358590a0fdSAndre Fischer             {
2368590a0fdSAndre Fischer                 return getParent()->mapNamespaceToken(rToken);
2378590a0fdSAndre Fischer             }
2388590a0fdSAndre Fischer             else
2398590a0fdSAndre Fischer             {
2408590a0fdSAndre Fischer                 return rToken;
2418590a0fdSAndre Fischer             }
2428590a0fdSAndre Fischer         }
2438590a0fdSAndre Fischer         else
2448590a0fdSAndre Fischer         {
2458590a0fdSAndre Fischer             return (*iter).second;
2468590a0fdSAndre Fischer         }
2478590a0fdSAndre Fischer     }
2488590a0fdSAndre Fischer 
splitName(const::rtl::OUString & rSource)2498590a0fdSAndre Fischer     void WebDAVContext::splitName(const ::rtl::OUString& rSource)
2508590a0fdSAndre Fischer     {
2518590a0fdSAndre Fischer         const sal_Int32 nLen(rSource.getLength());
2528590a0fdSAndre Fischer         maNamespace = ::rtl::OUString();
2538590a0fdSAndre Fischer         maName = rSource;
2548590a0fdSAndre Fischer 
2558590a0fdSAndre Fischer         if(nLen)
2568590a0fdSAndre Fischer         {
2578590a0fdSAndre Fischer             const sal_Int32 nIndex(rSource.indexOf(sal_Unicode(':'), 0));
2588590a0fdSAndre Fischer 
2598590a0fdSAndre Fischer             if(-1 != nIndex && nIndex > 0 && nIndex + 1 < nLen)
2608590a0fdSAndre Fischer             {
2618590a0fdSAndre Fischer                 maNamespace = mapNamespaceToken(rSource.copy(0, nIndex));
2628590a0fdSAndre Fischer                 maName = rSource.copy(nIndex + 1);
2638590a0fdSAndre Fischer             }
2648590a0fdSAndre Fischer         }
2658590a0fdSAndre Fischer     }
2668590a0fdSAndre Fischer 
WebDAVContext(WebDAVContext * pParent,const::rtl::OUString & aName,const uno::Reference<xml::sax::XAttributeList> & xAttribs)2678590a0fdSAndre Fischer     WebDAVContext::WebDAVContext(WebDAVContext* pParent, const ::rtl::OUString& aName, const uno::Reference< xml::sax::XAttributeList >& xAttribs)
2688590a0fdSAndre Fischer     :   mpParent(pParent),
2698590a0fdSAndre Fischer         maNamespaceMap(),
2708590a0fdSAndre Fischer         maWhiteSpace(),
2718590a0fdSAndre Fischer         maNamespace(),
2728590a0fdSAndre Fischer         maName(),
2738590a0fdSAndre Fischer         maWebDAVNamespace(WebDAVNamespace_unknown),
2748590a0fdSAndre Fischer         maWebDAVName(WebDAVName_unknown)
2758590a0fdSAndre Fischer     {
2768590a0fdSAndre Fischer         const sal_Int16 nAttributes(xAttribs->getLength());
2778590a0fdSAndre Fischer 
2788590a0fdSAndre Fischer         if(nAttributes)
2798590a0fdSAndre Fischer         {
2808590a0fdSAndre Fischer             // parse evtl. namespace entries
2818590a0fdSAndre Fischer             parseForNamespaceTokens(xAttribs);
2828590a0fdSAndre Fischer         }
2838590a0fdSAndre Fischer 
2848590a0fdSAndre Fischer         // split name to namespace and name
2858590a0fdSAndre Fischer         splitName(aName);
2868590a0fdSAndre Fischer 
2878590a0fdSAndre Fischer         // evaluate enums for namespace and name
2888590a0fdSAndre Fischer         maWebDAVNamespace = StrToWebDAVNamespace(maNamespace);
2898590a0fdSAndre Fischer         maWebDAVName = StrToWebDAVName(maName);
2908590a0fdSAndre Fischer     }
2918590a0fdSAndre Fischer 
~WebDAVContext()2928590a0fdSAndre Fischer     WebDAVContext::~WebDAVContext()
2938590a0fdSAndre Fischer     {
2948590a0fdSAndre Fischer     }
2958590a0fdSAndre Fischer } // end of anonymous namespace
2968590a0fdSAndre Fischer 
2978590a0fdSAndre Fischer //////////////////////////////////////////////////////////////////////////////
2988590a0fdSAndre Fischer // the Xml parser itself
2998590a0fdSAndre Fischer 
3008590a0fdSAndre Fischer namespace
3018590a0fdSAndre Fischer {
3028590a0fdSAndre Fischer     enum WebDAVResponseParserMode
3038590a0fdSAndre Fischer     {
3048590a0fdSAndre Fischer         WebDAVResponseParserMode_PropFind = 0,
305*3edf6992SAndrea Pescetti         WebDAVResponseParserMode_PropName,
306*3edf6992SAndrea Pescetti         WebDAVResponseParserMode_LockResponse
3078590a0fdSAndre Fischer     };
3088590a0fdSAndre Fischer 
3098590a0fdSAndre Fischer     class WebDAVResponseParser : public cppu::WeakImplHelper1< com::sun::star::xml::sax::XDocumentHandler >
3108590a0fdSAndre Fischer     {
3118590a0fdSAndre Fischer     private:
3128590a0fdSAndre Fischer         std::vector< http_dav_ucp::DAVResource >      maResult_PropFind;
3138590a0fdSAndre Fischer         std::vector< http_dav_ucp::DAVResourceInfo >  maResult_PropName;
314*3edf6992SAndrea Pescetti         http_dav_ucp::DAVPropertyValue                maResult_Lock;
3158590a0fdSAndre Fischer 
3168590a0fdSAndre Fischer         WebDAVContext*                              mpContext;
3178590a0fdSAndre Fischer         ::rtl::OUString                             maHref;
318*3edf6992SAndrea Pescetti         ::rtl::OUString                             maHrefLocks; //this is used for locks, when lockdiscoveryactive
319*3edf6992SAndrea Pescetti 
3208590a0fdSAndre Fischer         ::rtl::OUString                             maStatus;
3218590a0fdSAndre Fischer         std::vector< http_dav_ucp::DAVPropertyValue > maResponseProperties;
3228590a0fdSAndre Fischer         std::vector< http_dav_ucp::DAVPropertyValue > maPropStatProperties;
3238590a0fdSAndre Fischer         std::vector< ::rtl::OUString >              maResponseNames;
3248590a0fdSAndre Fischer         std::vector< ::rtl::OUString >              maPropStatNames;
325*3edf6992SAndrea Pescetti         uno::Sequence< ::rtl::OUString >            maLockTokens;
3268590a0fdSAndre Fischer         uno::Sequence< ucb::LockEntry >             maLockEntries;
327*3edf6992SAndrea Pescetti         uno::Sequence< ucb::Lock >                  maLocks;    //the returned locks following a lockdiscovery request
3288590a0fdSAndre Fischer         ucb::LockScope                              maLockScope;
3298590a0fdSAndre Fischer         ucb::LockType                               maLockType;
330*3edf6992SAndrea Pescetti         ucb::LockDepth                              maLockDepth;
331*3edf6992SAndrea Pescetti         ::rtl::OUString                             maLockOwner;
332*3edf6992SAndrea Pescetti         sal_Int64                                   maLockTimeout;
333*3edf6992SAndrea Pescetti         ::rtl::OUString                             maLockToken;
334*3edf6992SAndrea Pescetti 
3358590a0fdSAndre Fischer       WebDAVResponseParserMode                    meWebDAVResponseParserMode;
3368590a0fdSAndre Fischer 
3378590a0fdSAndre Fischer         // bitfield
3388590a0fdSAndre Fischer         bool                                        mbResourceTypeCollection : 1;
3398590a0fdSAndre Fischer         bool                                        mbLockScopeSet : 1;
3408590a0fdSAndre Fischer         bool                                        mbLockTypeSet : 1;
341*3edf6992SAndrea Pescetti         bool                                        mbLockTokenSet : 1;
342*3edf6992SAndrea Pescetti         //TODO: add other flag to manage reading od token, depth, timeout, owner
343*3edf6992SAndrea Pescetti         bool                                        mbLockDiscoveryActive : 1;
3448590a0fdSAndre Fischer 
3458590a0fdSAndre Fischer         // local helpers
whitespaceIsAvailable() const3468590a0fdSAndre Fischer         bool whitespaceIsAvailable() const
3478590a0fdSAndre Fischer         {
3488590a0fdSAndre Fischer             return mpContext && mpContext->getWhiteSpace().getLength();
3498590a0fdSAndre Fischer         }
hasParent(WebDAVName aWebDAVName) const3508590a0fdSAndre Fischer         bool hasParent(WebDAVName aWebDAVName) const
3518590a0fdSAndre Fischer         {
3528590a0fdSAndre Fischer             return mpContext && mpContext->getParent() && aWebDAVName == mpContext->getParent()->getWebDAVName();
3538590a0fdSAndre Fischer         }
propertyIsReady() const3548590a0fdSAndre Fischer         bool propertyIsReady() const
3558590a0fdSAndre Fischer         {
3568590a0fdSAndre Fischer             return hasParent(WebDAVName_prop) && whitespaceIsAvailable();
3578590a0fdSAndre Fischer         }
isCollectingProperties() const3588590a0fdSAndre Fischer         bool isCollectingProperties() const
3598590a0fdSAndre Fischer         {
3608590a0fdSAndre Fischer             return WebDAVResponseParserMode_PropFind == meWebDAVResponseParserMode;
3618590a0fdSAndre Fischer         }
isCollectingPropNames() const3628590a0fdSAndre Fischer         bool isCollectingPropNames() const
3638590a0fdSAndre Fischer         {
3648590a0fdSAndre Fischer             return WebDAVResponseParserMode_PropName == meWebDAVResponseParserMode;
3658590a0fdSAndre Fischer         }
isWaitingLockResponse() const366*3edf6992SAndrea Pescetti         bool isWaitingLockResponse() const
367*3edf6992SAndrea Pescetti         {
368*3edf6992SAndrea Pescetti             return WebDAVResponseParserMode_LockResponse == meWebDAVResponseParserMode;
369*3edf6992SAndrea Pescetti         }
collectThisPropertyAsName() const3708590a0fdSAndre Fischer         bool collectThisPropertyAsName() const
3718590a0fdSAndre Fischer         {
3728590a0fdSAndre Fischer             return isCollectingPropNames() && hasParent(WebDAVName_prop);
3738590a0fdSAndre Fischer         }
pop_context()3748590a0fdSAndre Fischer         void pop_context()
3758590a0fdSAndre Fischer         {
3768590a0fdSAndre Fischer             if(mpContext)
3778590a0fdSAndre Fischer             {
3788590a0fdSAndre Fischer                 WebDAVContext* pTemp = mpContext;
3798590a0fdSAndre Fischer                 mpContext = mpContext->getParent();
3808590a0fdSAndre Fischer                 delete pTemp;
3818590a0fdSAndre Fischer             }
3828590a0fdSAndre Fischer             else
3838590a0fdSAndre Fischer             {
3848590a0fdSAndre Fischer                 OSL_ENSURE(false, "Parser context pop without context (!)");
3858590a0fdSAndre Fischer             }
3868590a0fdSAndre Fischer         }
3878590a0fdSAndre Fischer 
3888590a0fdSAndre Fischer     public:
3898590a0fdSAndre Fischer         WebDAVResponseParser(WebDAVResponseParserMode eWebDAVResponseParserMode);
3908590a0fdSAndre Fischer         ~WebDAVResponseParser();
3918590a0fdSAndre Fischer 
3928590a0fdSAndre Fischer         // Methods XDocumentHandler
3938590a0fdSAndre Fischer         virtual void SAL_CALL startDocument(  ) throw (xml::sax::SAXException, uno::RuntimeException);
3948590a0fdSAndre Fischer         virtual void SAL_CALL endDocument(  ) throw (xml::sax::SAXException, uno::RuntimeException);
395*3edf6992SAndrea Pescetti         virtual void SAL_CALL startElement( const ::rtl::OUString& aName, const uno::Reference< xml::sax::XAttributeList >& xAttribs )
396*3edf6992SAndrea Pescetti             throw (xml::sax::SAXException, uno::RuntimeException);
3978590a0fdSAndre Fischer         virtual void SAL_CALL endElement( const ::rtl::OUString& aName ) throw (xml::sax::SAXException, uno::RuntimeException);
3988590a0fdSAndre Fischer         virtual void SAL_CALL characters( const ::rtl::OUString& aChars ) throw (xml::sax::SAXException, uno::RuntimeException);
3998590a0fdSAndre Fischer         virtual void SAL_CALL ignorableWhitespace( const ::rtl::OUString& aWhitespaces ) throw (xml::sax::SAXException, uno::RuntimeException);
4008590a0fdSAndre Fischer         virtual void SAL_CALL processingInstruction( const ::rtl::OUString& aTarget, const ::rtl::OUString& aData ) throw (xml::sax::SAXException, uno::RuntimeException);
4018590a0fdSAndre Fischer         virtual void SAL_CALL setDocumentLocator( const uno::Reference< xml::sax::XLocator >& xLocator ) throw (xml::sax::SAXException, uno::RuntimeException);
4028590a0fdSAndre Fischer 
getResult_PropFind() const4038590a0fdSAndre Fischer         const std::vector< http_dav_ucp::DAVResource >& getResult_PropFind() const { return maResult_PropFind; }
getResult_PropName() const4048590a0fdSAndre Fischer         const std::vector< http_dav_ucp::DAVResourceInfo >& getResult_PropName() const { return maResult_PropName; }
getResult_Lock() const405*3edf6992SAndrea Pescetti         const http_dav_ucp::DAVPropertyValue& getResult_Lock() const { return maResult_Lock; }
4068590a0fdSAndre Fischer     };
4078590a0fdSAndre Fischer 
WebDAVResponseParser(WebDAVResponseParserMode eWebDAVResponseParserMode)4088590a0fdSAndre Fischer     WebDAVResponseParser::WebDAVResponseParser(WebDAVResponseParserMode eWebDAVResponseParserMode)
4098590a0fdSAndre Fischer     :   maResult_PropFind(),
4108590a0fdSAndre Fischer         maResult_PropName(),
411*3edf6992SAndrea Pescetti         maResult_Lock(),
4128590a0fdSAndre Fischer         mpContext(0),
4138590a0fdSAndre Fischer         maHref(),
414*3edf6992SAndrea Pescetti         maHrefLocks(),
4158590a0fdSAndre Fischer         maStatus(),
4168590a0fdSAndre Fischer         maResponseProperties(),
4178590a0fdSAndre Fischer         maPropStatProperties(),
4188590a0fdSAndre Fischer         maResponseNames(),
4198590a0fdSAndre Fischer         maPropStatNames(),
420*3edf6992SAndrea Pescetti         maLockTokens(),
4218590a0fdSAndre Fischer         maLockEntries(),
422*3edf6992SAndrea Pescetti         maLocks(),
4238590a0fdSAndre Fischer         maLockScope(ucb::LockScope_EXCLUSIVE),
4248590a0fdSAndre Fischer         maLockType(ucb::LockType_WRITE),
425*3edf6992SAndrea Pescetti         maLockDepth(ucb::LockDepth_ZERO),
426*3edf6992SAndrea Pescetti         maLockOwner(),
427*3edf6992SAndrea Pescetti         maLockTimeout(0),
4288590a0fdSAndre Fischer         meWebDAVResponseParserMode(eWebDAVResponseParserMode),
4298590a0fdSAndre Fischer         mbResourceTypeCollection(false),
4308590a0fdSAndre Fischer         mbLockScopeSet(false),
431*3edf6992SAndrea Pescetti         mbLockTypeSet(false),
432*3edf6992SAndrea Pescetti         mbLockDiscoveryActive(false)
4338590a0fdSAndre Fischer     {
4348590a0fdSAndre Fischer     }
4358590a0fdSAndre Fischer 
~WebDAVResponseParser()4368590a0fdSAndre Fischer     WebDAVResponseParser::~WebDAVResponseParser()
4378590a0fdSAndre Fischer     {
4388590a0fdSAndre Fischer         OSL_ENSURE(!mpContext, "Parser destructed with existing content (!)");
4398590a0fdSAndre Fischer         while(mpContext)
4408590a0fdSAndre Fischer         {
4418590a0fdSAndre Fischer             pop_context();
4428590a0fdSAndre Fischer         }
4438590a0fdSAndre Fischer     }
4448590a0fdSAndre Fischer 
startDocument()4458590a0fdSAndre Fischer     void SAL_CALL WebDAVResponseParser::startDocument(  ) throw (xml::sax::SAXException, uno::RuntimeException)
4468590a0fdSAndre Fischer     {
4478590a0fdSAndre Fischer         OSL_ENSURE(!mpContext, "Parser start with existing content (!)");
4488590a0fdSAndre Fischer     }
4498590a0fdSAndre Fischer 
endDocument()4508590a0fdSAndre Fischer     void SAL_CALL WebDAVResponseParser::endDocument(  ) throw (xml::sax::SAXException, uno::RuntimeException)
4518590a0fdSAndre Fischer     {
4528590a0fdSAndre Fischer         OSL_ENSURE(!mpContext, "Parser end with existing content (!)");
4538590a0fdSAndre Fischer     }
4548590a0fdSAndre Fischer 
startElement(const::rtl::OUString & aName,const uno::Reference<xml::sax::XAttributeList> & xAttribs)455*3edf6992SAndrea Pescetti     void SAL_CALL WebDAVResponseParser::startElement( const ::rtl::OUString& aName, const uno::Reference< xml::sax::XAttributeList >& xAttribs )
456*3edf6992SAndrea Pescetti         throw (xml::sax::SAXException, uno::RuntimeException)
4578590a0fdSAndre Fischer     {
4588590a0fdSAndre Fischer         const sal_Int32 nLen(aName.getLength());
4598590a0fdSAndre Fischer 
4608590a0fdSAndre Fischer         if(nLen)
4618590a0fdSAndre Fischer         {
4628590a0fdSAndre Fischer             // create new context (push)
4638590a0fdSAndre Fischer             mpContext = new WebDAVContext(mpContext, aName, xAttribs);
4648590a0fdSAndre Fischer 
4658590a0fdSAndre Fischer             if(collectThisPropertyAsName())
4668590a0fdSAndre Fischer             {
4678590a0fdSAndre Fischer                 // When collecting property names and parent is prop there is no need
4688590a0fdSAndre Fischer                 // to handle the content of this property deeper (evtl. preparations)
4698590a0fdSAndre Fischer             }
4708590a0fdSAndre Fischer             else
4718590a0fdSAndre Fischer             {
4728590a0fdSAndre Fischer                 switch(mpContext->getWebDAVNamespace())
4738590a0fdSAndre Fischer                 {
4748590a0fdSAndre Fischer                     default: // WebDAVNamespace_unknown, WebDAVNamespace_last or unhandled
4758590a0fdSAndre Fischer                     {
4768590a0fdSAndre Fischer                         break;
4778590a0fdSAndre Fischer                     }
4788590a0fdSAndre Fischer                     case WebDAVNamespace_DAV:
4798590a0fdSAndre Fischer                     {
4808590a0fdSAndre Fischer                         switch(mpContext->getWebDAVName())
4818590a0fdSAndre Fischer                         {
4828590a0fdSAndre Fischer                             default: // WebDAVName_unknown, WebDAVName_last or unhandled
4838590a0fdSAndre Fischer                             {
4848590a0fdSAndre Fischer                                 break;
4858590a0fdSAndre Fischer                             }
4868590a0fdSAndre Fischer                             case WebDAVName_propstat:
4878590a0fdSAndre Fischer                             {
4888590a0fdSAndre Fischer                                 // propstat start
4898590a0fdSAndre Fischer                                 if(isCollectingProperties())
4908590a0fdSAndre Fischer                                 {
4918590a0fdSAndre Fischer                                     // reset maPropStatProperties
4928590a0fdSAndre Fischer                                     maPropStatProperties.clear();
4938590a0fdSAndre Fischer                                 }
4948590a0fdSAndre Fischer                                 else
4958590a0fdSAndre Fischer                                 {
4968590a0fdSAndre Fischer                                     // when collecting properties reset maPropStatNames
4978590a0fdSAndre Fischer                                     maPropStatNames.clear();
4988590a0fdSAndre Fischer                                 }
4998590a0fdSAndre Fischer                                 break;
5008590a0fdSAndre Fischer                             }
5018590a0fdSAndre Fischer                             case WebDAVName_response:
5028590a0fdSAndre Fischer                             {
5038590a0fdSAndre Fischer                                 // response start, reset Href and status and maResponseProperties
5048590a0fdSAndre Fischer                                 maHref = maStatus = ::rtl::OUString();
5058590a0fdSAndre Fischer 
5068590a0fdSAndre Fischer                                 if(isCollectingProperties())
5078590a0fdSAndre Fischer                                 {
5088590a0fdSAndre Fischer                                     // reset maResponseProperties
5098590a0fdSAndre Fischer                                     maResponseProperties.clear();
5108590a0fdSAndre Fischer                                 }
5118590a0fdSAndre Fischer                                 else
5128590a0fdSAndre Fischer                                 {
5138590a0fdSAndre Fischer                                     // reset maResponseNames when collecting properties
5148590a0fdSAndre Fischer                                     maResponseNames.clear();
5158590a0fdSAndre Fischer                                 }
5168590a0fdSAndre Fischer                                 break;
5178590a0fdSAndre Fischer                             }
5188590a0fdSAndre Fischer                             case WebDAVName_resourcetype:
5198590a0fdSAndre Fischer                             {
5208590a0fdSAndre Fischer                                 // resourcetype start, reset collection
5218590a0fdSAndre Fischer                                 mbResourceTypeCollection = false;
5228590a0fdSAndre Fischer                                 break;
5238590a0fdSAndre Fischer                             }
5248590a0fdSAndre Fischer                             case WebDAVName_supportedlock:
5258590a0fdSAndre Fischer                             {
5268590a0fdSAndre Fischer                                 // supportedlock start, reset maLockEntries
5278590a0fdSAndre Fischer                                 maLockEntries.realloc(0);
5288590a0fdSAndre Fischer                                 break;
5298590a0fdSAndre Fischer                             }
5308590a0fdSAndre Fischer                             case WebDAVName_lockentry:
5318590a0fdSAndre Fischer                             {
5328590a0fdSAndre Fischer                                 // lockentry start, reset maLockEntries
5338590a0fdSAndre Fischer                                 mbLockScopeSet = false;
5348590a0fdSAndre Fischer                                 mbLockTypeSet = false;
5358590a0fdSAndre Fischer                                 break;
5368590a0fdSAndre Fischer                             }
537*3edf6992SAndrea Pescetti                             case WebDAVName_lockdiscovery:
538*3edf6992SAndrea Pescetti                             {
539*3edf6992SAndrea Pescetti                                 // lockentry start, reset maLocks
540*3edf6992SAndrea Pescetti                                 maLocks.realloc(0);
541*3edf6992SAndrea Pescetti                                 mbLockDiscoveryActive = true;
542*3edf6992SAndrea Pescetti                                 break;
543*3edf6992SAndrea Pescetti                             }
544*3edf6992SAndrea Pescetti                             case WebDAVName_activelock:
545*3edf6992SAndrea Pescetti                             {
546*3edf6992SAndrea Pescetti                                 //  activelockstart, reset vars
547*3edf6992SAndrea Pescetti                                 mbLockScopeSet = false;
548*3edf6992SAndrea Pescetti                                 mbLockTypeSet = false;
549*3edf6992SAndrea Pescetti                                 mbLockTokenSet = false;
550*3edf6992SAndrea Pescetti                                 maLockTokens.realloc(0);
551*3edf6992SAndrea Pescetti                                 maHrefLocks = ::rtl::OUString();
552*3edf6992SAndrea Pescetti                                 break;
553*3edf6992SAndrea Pescetti                             }
554*3edf6992SAndrea Pescetti                             case WebDAVName_locktoken:
555*3edf6992SAndrea Pescetti                             {
556*3edf6992SAndrea Pescetti                                 mbLockTokenSet = true;
557*3edf6992SAndrea Pescetti                                 break;
558*3edf6992SAndrea Pescetti                             }
5598590a0fdSAndre Fischer                         }
5608590a0fdSAndre Fischer                         break;
5618590a0fdSAndre Fischer                     }
5628590a0fdSAndre Fischer                     case WebDAVNamespace_ucb_openoffice_org_dav_props:
5638590a0fdSAndre Fischer                     {
5648590a0fdSAndre Fischer                         break;
5658590a0fdSAndre Fischer                     }
5668590a0fdSAndre Fischer                 }
5678590a0fdSAndre Fischer             }
5688590a0fdSAndre Fischer         }
5698590a0fdSAndre Fischer     }
5708590a0fdSAndre Fischer 
endElement(const::rtl::OUString & aName)5718590a0fdSAndre Fischer     void SAL_CALL WebDAVResponseParser::endElement( const ::rtl::OUString& aName ) throw (xml::sax::SAXException, uno::RuntimeException)
5728590a0fdSAndre Fischer     {
5738590a0fdSAndre Fischer         const sal_Int32 nLen(aName.getLength());
5748590a0fdSAndre Fischer         OSL_ENSURE(mpContext, "Parser EndElement without content (!)");
5758590a0fdSAndre Fischer 
5768590a0fdSAndre Fischer         if(mpContext && nLen)
5778590a0fdSAndre Fischer         {
5788590a0fdSAndre Fischer             if(collectThisPropertyAsName())
5798590a0fdSAndre Fischer             {
5808590a0fdSAndre Fischer                 // When collecting property names and parent is prop, just append the prop name
5818590a0fdSAndre Fischer                 // to the collection, no need to parse deeper
5828590a0fdSAndre Fischer                 maPropStatNames.push_back(mpContext->getNamespace() + mpContext->getName());
5838590a0fdSAndre Fischer             }
5848590a0fdSAndre Fischer             else
5858590a0fdSAndre Fischer             {
5868590a0fdSAndre Fischer                 switch(mpContext->getWebDAVNamespace())
5878590a0fdSAndre Fischer                 {
5888590a0fdSAndre Fischer                     default: // WebDAVNamespace_unknown, WebDAVNamespace_last or unhandled
5898590a0fdSAndre Fischer                     {
5908590a0fdSAndre Fischer                         break;
5918590a0fdSAndre Fischer                     }
5928590a0fdSAndre Fischer                     case WebDAVNamespace_DAV:
5938590a0fdSAndre Fischer                     {
5948590a0fdSAndre Fischer                         switch(mpContext->getWebDAVName())
5958590a0fdSAndre Fischer                         {
5968590a0fdSAndre Fischer                             default: // WebDAVName_unknown, WebDAVName_last or unhandled
5978590a0fdSAndre Fischer                             {
5988590a0fdSAndre Fischer                                 break;
5998590a0fdSAndre Fischer                             }
6008590a0fdSAndre Fischer                             case WebDAVName_href:
6018590a0fdSAndre Fischer                             {
6028590a0fdSAndre Fischer                                 // href end, save it if we have whitespace
6038590a0fdSAndre Fischer                                 if(whitespaceIsAvailable())
6048590a0fdSAndre Fischer                                 {
605*3edf6992SAndrea Pescetti                                     if(mbLockDiscoveryActive)
606*3edf6992SAndrea Pescetti                                     {
607*3edf6992SAndrea Pescetti                                         maHrefLocks = mpContext->getWhiteSpace();
608*3edf6992SAndrea Pescetti                                     }
609*3edf6992SAndrea Pescetti                                     else
610*3edf6992SAndrea Pescetti                                     {
6118590a0fdSAndre Fischer                                         maHref = mpContext->getWhiteSpace();
6128590a0fdSAndre Fischer                                     }
613*3edf6992SAndrea Pescetti                                 }
6148590a0fdSAndre Fischer                                 break;
6158590a0fdSAndre Fischer                             }
6168590a0fdSAndre Fischer                             case WebDAVName_status:
6178590a0fdSAndre Fischer                             {
6188590a0fdSAndre Fischer                                 // status end, save it if we have whitespace
6198590a0fdSAndre Fischer                                 if(whitespaceIsAvailable())
6208590a0fdSAndre Fischer                                 {
6218590a0fdSAndre Fischer                                     maStatus = mpContext->getWhiteSpace();
6228590a0fdSAndre Fischer                                 }
6238590a0fdSAndre Fischer                                 break;
6248590a0fdSAndre Fischer                             }
6258590a0fdSAndre Fischer                             case WebDAVName_getlastmodified:
6268590a0fdSAndre Fischer                             {
6278590a0fdSAndre Fischer                                 // getlastmodified end, safe if content is correct
6288590a0fdSAndre Fischer                                 if(propertyIsReady())
6298590a0fdSAndre Fischer                                 {
6308590a0fdSAndre Fischer                                     static rtl::OUString aStr(rtl::OUString::createFromAscii("DAV:getlastmodified"));
6318590a0fdSAndre Fischer                                     http_dav_ucp::DAVPropertyValue aDAVPropertyValue;
6328590a0fdSAndre Fischer 
6338590a0fdSAndre Fischer                                     aDAVPropertyValue.Name = aStr;
6348590a0fdSAndre Fischer                                     aDAVPropertyValue.Value <<= mpContext->getWhiteSpace();
6358590a0fdSAndre Fischer                                     maPropStatProperties.push_back(aDAVPropertyValue);
6368590a0fdSAndre Fischer                                 }
6378590a0fdSAndre Fischer                                 break;
6388590a0fdSAndre Fischer                             }
6398590a0fdSAndre Fischer                             case WebDAVName_creationdate:
6408590a0fdSAndre Fischer                             {
6418590a0fdSAndre Fischer                                 // creationdate end, safe if content is correct
6428590a0fdSAndre Fischer                                 if(propertyIsReady())
6438590a0fdSAndre Fischer                                 {
6448590a0fdSAndre Fischer                                     static rtl::OUString aStr(rtl::OUString::createFromAscii("DAV:creationdate"));
6458590a0fdSAndre Fischer                                     http_dav_ucp::DAVPropertyValue aDAVPropertyValue;
6468590a0fdSAndre Fischer 
6478590a0fdSAndre Fischer                                     aDAVPropertyValue.Name = aStr;
6488590a0fdSAndre Fischer                                     aDAVPropertyValue.Value <<= mpContext->getWhiteSpace();
6498590a0fdSAndre Fischer                                     maPropStatProperties.push_back(aDAVPropertyValue);
6508590a0fdSAndre Fischer                                 }
6518590a0fdSAndre Fischer                                 break;
6528590a0fdSAndre Fischer                             }
6538590a0fdSAndre Fischer                             case WebDAVName_collection:
6548590a0fdSAndre Fischer                             {
6558590a0fdSAndre Fischer                                 // collection end, check and set
6568590a0fdSAndre Fischer                                 if(hasParent(WebDAVName_resourcetype))
6578590a0fdSAndre Fischer                                 {
6588590a0fdSAndre Fischer                                     mbResourceTypeCollection = true;
6598590a0fdSAndre Fischer                                 }
6608590a0fdSAndre Fischer                                 break;
6618590a0fdSAndre Fischer                             }
6628590a0fdSAndre Fischer                             case WebDAVName_resourcetype:
6638590a0fdSAndre Fischer                             {
6648590a0fdSAndre Fischer                                 // resourcetype end, check for collection
6658590a0fdSAndre Fischer                                 if(hasParent(WebDAVName_prop))
6668590a0fdSAndre Fischer                                 {
6678590a0fdSAndre Fischer                                     static rtl::OUString aStrA(rtl::OUString::createFromAscii("DAV:resourcetype"));
6688590a0fdSAndre Fischer                                     static rtl::OUString aStrB(rtl::OUString::createFromAscii("collection"));
6698590a0fdSAndre Fischer                                     http_dav_ucp::DAVPropertyValue aDAVPropertyValue;
6708590a0fdSAndre Fischer 
6718590a0fdSAndre Fischer                                     aDAVPropertyValue.Name = aStrA;
6728590a0fdSAndre Fischer                                     aDAVPropertyValue.Value <<= (mbResourceTypeCollection ? aStrB : rtl::OUString());
6738590a0fdSAndre Fischer                                     maPropStatProperties.push_back(aDAVPropertyValue);
6748590a0fdSAndre Fischer                                 }
6758590a0fdSAndre Fischer                                 break;
6768590a0fdSAndre Fischer                             }
6778590a0fdSAndre Fischer                             case WebDAVName_getcontentlength:
6788590a0fdSAndre Fischer                             {
6798590a0fdSAndre Fischer                                 // getcontentlength end, safe if content is correct
6808590a0fdSAndre Fischer                                 if(propertyIsReady())
6818590a0fdSAndre Fischer                                 {
6828590a0fdSAndre Fischer                                     static rtl::OUString aStr(rtl::OUString::createFromAscii("DAV:getcontentlength"));
6838590a0fdSAndre Fischer                                     http_dav_ucp::DAVPropertyValue aDAVPropertyValue;
6848590a0fdSAndre Fischer 
6858590a0fdSAndre Fischer                                     aDAVPropertyValue.Name = aStr;
6868590a0fdSAndre Fischer                                     aDAVPropertyValue.Value <<= mpContext->getWhiteSpace();
6878590a0fdSAndre Fischer                                     maPropStatProperties.push_back(aDAVPropertyValue);
6888590a0fdSAndre Fischer                                 }
6898590a0fdSAndre Fischer                                 break;
6908590a0fdSAndre Fischer                             }
6918590a0fdSAndre Fischer                             case WebDAVName_getcontenttype:
6928590a0fdSAndre Fischer                             {
6938590a0fdSAndre Fischer                                 // getcontenttype end, safe if content is correct
6948590a0fdSAndre Fischer                                 if(propertyIsReady())
6958590a0fdSAndre Fischer                                 {
6968590a0fdSAndre Fischer                                     static rtl::OUString aStr(rtl::OUString::createFromAscii("DAV:getcontenttype"));
6978590a0fdSAndre Fischer                                     http_dav_ucp::DAVPropertyValue aDAVPropertyValue;
6988590a0fdSAndre Fischer 
6998590a0fdSAndre Fischer                                     aDAVPropertyValue.Name = aStr;
7008590a0fdSAndre Fischer                                     aDAVPropertyValue.Value <<= mpContext->getWhiteSpace();
7018590a0fdSAndre Fischer                                     maPropStatProperties.push_back(aDAVPropertyValue);
7028590a0fdSAndre Fischer                                 }
7038590a0fdSAndre Fischer                                 break;
7048590a0fdSAndre Fischer                             }
7058590a0fdSAndre Fischer                             case WebDAVName_supportedlock:
7068590a0fdSAndre Fischer                             {
7078590a0fdSAndre Fischer                                 // supportedlock end
7088590a0fdSAndre Fischer                                 if(hasParent(WebDAVName_prop) && maLockEntries.hasElements())
7098590a0fdSAndre Fischer                                 {
7108590a0fdSAndre Fischer                                     static rtl::OUString aStr(rtl::OUString::createFromAscii("DAV:supportedlock"));
7118590a0fdSAndre Fischer                                     http_dav_ucp::DAVPropertyValue aDAVPropertyValue;
7128590a0fdSAndre Fischer 
7138590a0fdSAndre Fischer                                     aDAVPropertyValue.Name = aStr;
7148590a0fdSAndre Fischer                                     aDAVPropertyValue.Value <<= maLockEntries;
7158590a0fdSAndre Fischer                                     maPropStatProperties.push_back(aDAVPropertyValue);
7168590a0fdSAndre Fischer                                 }
7178590a0fdSAndre Fischer                                 break;
7188590a0fdSAndre Fischer                             }
7198590a0fdSAndre Fischer                             case WebDAVName_lockentry:
7208590a0fdSAndre Fischer                             {
7218590a0fdSAndre Fischer                                 // lockentry end
7228590a0fdSAndre Fischer                                 if(hasParent(WebDAVName_supportedlock) && (mbLockScopeSet && mbLockTypeSet))
7238590a0fdSAndre Fischer                                 {
7248590a0fdSAndre Fischer                                     const sal_Int32 nLength(maLockEntries.getLength());
7258590a0fdSAndre Fischer                                     ucb::LockEntry aEntry;
7268590a0fdSAndre Fischer 
7278590a0fdSAndre Fischer                                     aEntry.Scope = maLockScope;
7288590a0fdSAndre Fischer                                     aEntry.Type = maLockType;
7298590a0fdSAndre Fischer                                     maLockEntries.realloc(nLength + 1);
7308590a0fdSAndre Fischer                                     maLockEntries[nLength] = aEntry;
7318590a0fdSAndre Fischer                                 }
7328590a0fdSAndre Fischer                                 break;
7338590a0fdSAndre Fischer                             }
7348590a0fdSAndre Fischer                             case WebDAVName_exclusive:
7358590a0fdSAndre Fischer                             {
7368590a0fdSAndre Fischer                                 // exclusive lockscope end
737*3edf6992SAndrea Pescetti                                 if(hasParent(WebDAVName_lockscope) || hasParent(WebDAVName_activelock))
7388590a0fdSAndre Fischer                                 {
7398590a0fdSAndre Fischer                                     maLockScope = ucb::LockScope_EXCLUSIVE;
7408590a0fdSAndre Fischer                                     mbLockScopeSet = true;
7418590a0fdSAndre Fischer                                 }
7428590a0fdSAndre Fischer                                 break;
7438590a0fdSAndre Fischer                             }
7448590a0fdSAndre Fischer                             case WebDAVName_shared:
7458590a0fdSAndre Fischer                             {
7468590a0fdSAndre Fischer                                 // shared lockscope end
747*3edf6992SAndrea Pescetti                                 if(hasParent(WebDAVName_lockscope) || hasParent(WebDAVName_activelock))
7488590a0fdSAndre Fischer                                 {
7498590a0fdSAndre Fischer                                     maLockScope = ucb::LockScope_SHARED;
7508590a0fdSAndre Fischer                                     mbLockScopeSet = true;
7518590a0fdSAndre Fischer                                 }
7528590a0fdSAndre Fischer                                 break;
7538590a0fdSAndre Fischer                             }
7548590a0fdSAndre Fischer                             case WebDAVName_write:
7558590a0fdSAndre Fischer                             {
7568590a0fdSAndre Fischer                                 // write locktype end
757*3edf6992SAndrea Pescetti                                 if(hasParent(WebDAVName_locktype) || hasParent(WebDAVName_activelock))
7588590a0fdSAndre Fischer                                 {
7598590a0fdSAndre Fischer                                     maLockType = ucb::LockType_WRITE;
7608590a0fdSAndre Fischer                                     mbLockTypeSet = true;
7618590a0fdSAndre Fischer                                 }
7628590a0fdSAndre Fischer                                 break;
7638590a0fdSAndre Fischer                             }
764*3edf6992SAndrea Pescetti                             case WebDAVName_lockdiscovery:
765*3edf6992SAndrea Pescetti                             {
766*3edf6992SAndrea Pescetti                                 // lockdiscovery end
767*3edf6992SAndrea Pescetti                                 if(hasParent(WebDAVName_prop))
768*3edf6992SAndrea Pescetti                                 {
769*3edf6992SAndrea Pescetti                                     static ::rtl::OUString aStr(rtl::OUString::createFromAscii("DAV:lockdiscovery"));
770*3edf6992SAndrea Pescetti                                     if(isWaitingLockResponse())
771*3edf6992SAndrea Pescetti                                     {
772*3edf6992SAndrea Pescetti                                         maResult_Lock.Name = aStr;
773*3edf6992SAndrea Pescetti                                         maResult_Lock.Value <<= maLocks;
774*3edf6992SAndrea Pescetti                                     }
775*3edf6992SAndrea Pescetti                                     else
776*3edf6992SAndrea Pescetti                                     {
777*3edf6992SAndrea Pescetti                                         ::http_dav_ucp::DAVPropertyValue aDAVPropertyValue;
778*3edf6992SAndrea Pescetti 
779*3edf6992SAndrea Pescetti                                         aDAVPropertyValue.Name = aStr;
780*3edf6992SAndrea Pescetti                                         aDAVPropertyValue.Value <<= maLocks;
781*3edf6992SAndrea Pescetti                                         maPropStatProperties.push_back(aDAVPropertyValue);
782*3edf6992SAndrea Pescetti                                     }
783*3edf6992SAndrea Pescetti                                 }
784*3edf6992SAndrea Pescetti                                 mbLockDiscoveryActive = false;
785*3edf6992SAndrea Pescetti                                 break;
786*3edf6992SAndrea Pescetti                             }
787*3edf6992SAndrea Pescetti                             case WebDAVName_activelock:
788*3edf6992SAndrea Pescetti                             {
789*3edf6992SAndrea Pescetti                                 if(hasParent(WebDAVName_lockdiscovery) &&
790*3edf6992SAndrea Pescetti                                    mbLockScopeSet && mbLockTypeSet && mbLockTokenSet)
791*3edf6992SAndrea Pescetti                                 {
792*3edf6992SAndrea Pescetti                                     const sal_Int32 nLength(maLocks.getLength());
793*3edf6992SAndrea Pescetti                                     ucb::Lock aLock;
794*3edf6992SAndrea Pescetti 
795*3edf6992SAndrea Pescetti                                     aLock.Scope = maLockScope;
796*3edf6992SAndrea Pescetti                                     aLock.Type = maLockType;
797*3edf6992SAndrea Pescetti                                     //add tokens, depth, timeout, owner
798*3edf6992SAndrea Pescetti                                     aLock.LockTokens = maLockTokens;
799*3edf6992SAndrea Pescetti                                     aLock.Depth = maLockDepth;
800*3edf6992SAndrea Pescetti                                     aLock.Owner <<= maLockOwner;
801*3edf6992SAndrea Pescetti                                     aLock.Timeout = maLockTimeout;
802*3edf6992SAndrea Pescetti                                     maLocks.realloc(nLength + 1);
803*3edf6992SAndrea Pescetti                                     maLocks[nLength] = aLock;
804*3edf6992SAndrea Pescetti                                 }
805*3edf6992SAndrea Pescetti                                 break;
806*3edf6992SAndrea Pescetti                             }
807*3edf6992SAndrea Pescetti                             case WebDAVName_locktoken:
808*3edf6992SAndrea Pescetti                             {
809*3edf6992SAndrea Pescetti                                 if(hasParent(WebDAVName_activelock))
810*3edf6992SAndrea Pescetti                                 {
811*3edf6992SAndrea Pescetti                                     //add a token to the list of tokens
812*3edf6992SAndrea Pescetti                                     const sal_Int32 nLength(maLockTokens.getLength());
813*3edf6992SAndrea Pescetti                                     maLockTokens.realloc(nLength + 1);
814*3edf6992SAndrea Pescetti                                     maLockTokens[nLength] = maHrefLocks;
815*3edf6992SAndrea Pescetti                                     mbLockTokenSet = true;
816*3edf6992SAndrea Pescetti                                 }
817*3edf6992SAndrea Pescetti                                 break;
818*3edf6992SAndrea Pescetti                             }
819*3edf6992SAndrea Pescetti                             case WebDAVName_timeout:
820*3edf6992SAndrea Pescetti                             {
821*3edf6992SAndrea Pescetti                                 if(hasParent(WebDAVName_activelock))
822*3edf6992SAndrea Pescetti                                 {
823*3edf6992SAndrea Pescetti                                     ::rtl::OUString aStr( mpContext->getWhiteSpace().toAsciiLowerCase());
824*3edf6992SAndrea Pescetti                                     static ::rtl::OUString aInfinite( ::rtl::OUString::createFromAscii( "infinite" ) );
825*3edf6992SAndrea Pescetti                                     static ::rtl::OUString aSecond( ::rtl::OUString::createFromAscii( "second-" ) );
826*3edf6992SAndrea Pescetti                                     //look for infinity
827*3edf6992SAndrea Pescetti                                     sal_Int32 secondIndex;
828*3edf6992SAndrea Pescetti                                     if(aStr.indexOf(aInfinite) != -1)
829*3edf6992SAndrea Pescetti                                     {
830*3edf6992SAndrea Pescetti                                         maLockTimeout = -1;
831*3edf6992SAndrea Pescetti                                     }
832*3edf6992SAndrea Pescetti                                     else if((secondIndex = aStr.indexOf(aSecond)) != -1)
833*3edf6992SAndrea Pescetti                                     {
834*3edf6992SAndrea Pescetti                                         secondIndex += aSecond.getLength();
835*3edf6992SAndrea Pescetti                                         maLockTimeout = aStr.copy(secondIndex).toInt64();
836*3edf6992SAndrea Pescetti                                     }
837*3edf6992SAndrea Pescetti                                 }
838*3edf6992SAndrea Pescetti                                 break;
839*3edf6992SAndrea Pescetti                             }
840*3edf6992SAndrea Pescetti                             case WebDAVName_owner:
841*3edf6992SAndrea Pescetti                             {
842*3edf6992SAndrea Pescetti                                 if(whitespaceIsAvailable())
843*3edf6992SAndrea Pescetti                                 {
844*3edf6992SAndrea Pescetti                                     if(hasParent(WebDAVName_activelock))
845*3edf6992SAndrea Pescetti                                     {
846*3edf6992SAndrea Pescetti                                         maLockOwner = mpContext->getWhiteSpace();
847*3edf6992SAndrea Pescetti                                     }
848*3edf6992SAndrea Pescetti                                 }
849*3edf6992SAndrea Pescetti                                 break;
850*3edf6992SAndrea Pescetti                             }
851*3edf6992SAndrea Pescetti                             case WebDAVName_depth:
852*3edf6992SAndrea Pescetti                             {
853*3edf6992SAndrea Pescetti                                 if(hasParent(WebDAVName_activelock))
854*3edf6992SAndrea Pescetti                                 {
855*3edf6992SAndrea Pescetti                                     //set depth, one of three values
856*3edf6992SAndrea Pescetti                                     ::rtl::OUString aStr( mpContext->getWhiteSpace() );
857*3edf6992SAndrea Pescetti                                     //default to zero, if not found
858*3edf6992SAndrea Pescetti                                     maLockDepth = ucb::LockDepth_ZERO;
859*3edf6992SAndrea Pescetti                                     if(aStr.equalsIgnoreAsciiCase(::rtl::OUString::createFromAscii("0")))
860*3edf6992SAndrea Pescetti                                        maLockDepth = ucb::LockDepth_ZERO;
861*3edf6992SAndrea Pescetti                                     else if(aStr.equalsIgnoreAsciiCase(::rtl::OUString::createFromAscii("1")))
862*3edf6992SAndrea Pescetti                                        maLockDepth = ucb::LockDepth_ONE;
863*3edf6992SAndrea Pescetti                                     else if(aStr.equalsIgnoreAsciiCase(::rtl::OUString::createFromAscii("infinity")))
864*3edf6992SAndrea Pescetti                                        maLockDepth = ucb::LockDepth_INFINITY;
865*3edf6992SAndrea Pescetti                                 }
866*3edf6992SAndrea Pescetti                                 break;
867*3edf6992SAndrea Pescetti                             }
8688590a0fdSAndre Fischer                             case WebDAVName_propstat:
8698590a0fdSAndre Fischer                             {
8708590a0fdSAndre Fischer                                 // propstat end, check status
8718590a0fdSAndre Fischer                                 if(maStatus.getLength())
8728590a0fdSAndre Fischer                                 {
8738590a0fdSAndre Fischer                                     static ::rtl::OUString aStrStatusOkay(::rtl::OUString::createFromAscii("HTTP/1.1 200 OK"));
8748590a0fdSAndre Fischer 
8758590a0fdSAndre Fischer                                     if(maStatus.equals(aStrStatusOkay))
8768590a0fdSAndre Fischer                                     {
8778590a0fdSAndre Fischer                                         if(isCollectingProperties())
8788590a0fdSAndre Fischer                                         {
8798590a0fdSAndre Fischer                                             if(maPropStatProperties.size())
8808590a0fdSAndre Fischer                                             {
8818590a0fdSAndre Fischer                                                 // append to maResponseProperties if okay
8828590a0fdSAndre Fischer                                                 maResponseProperties.insert(maResponseProperties.end(), maPropStatProperties.begin(), maPropStatProperties.end());
8838590a0fdSAndre Fischer                                             }
8848590a0fdSAndre Fischer                                         }
8858590a0fdSAndre Fischer                                         else
8868590a0fdSAndre Fischer                                         {
8878590a0fdSAndre Fischer                                             if(maPropStatNames.size())
8888590a0fdSAndre Fischer                                             {
8898590a0fdSAndre Fischer                                                 // when collecting properties append to
8908590a0fdSAndre Fischer                                                 maResponseNames.insert(maResponseNames.end(), maPropStatNames.begin(), maPropStatNames.end());
8918590a0fdSAndre Fischer                                             }
8928590a0fdSAndre Fischer                                         }
8938590a0fdSAndre Fischer                                     }
8948590a0fdSAndre Fischer                                 }
8958590a0fdSAndre Fischer                                 break;
8968590a0fdSAndre Fischer                             }
8978590a0fdSAndre Fischer                             case WebDAVName_response:
8988590a0fdSAndre Fischer                             {
899*3edf6992SAndrea Pescetti                                 // response end
9008590a0fdSAndre Fischer                                 if(maHref.getLength())
9018590a0fdSAndre Fischer                                 {
9028590a0fdSAndre Fischer                                     if(isCollectingProperties())
9038590a0fdSAndre Fischer                                     {
9048590a0fdSAndre Fischer                                         // create DAVResource when we have content
9058590a0fdSAndre Fischer                                         if(maResponseProperties.size())
9068590a0fdSAndre Fischer                                         {
907*3edf6992SAndrea Pescetti                                             ::http_dav_ucp::DAVResource aDAVResource;
9088590a0fdSAndre Fischer 
9098590a0fdSAndre Fischer                                             aDAVResource.uri = maHref;
9108590a0fdSAndre Fischer                                             aDAVResource.properties = maResponseProperties;
9118590a0fdSAndre Fischer                                             maResult_PropFind.push_back(aDAVResource);
9128590a0fdSAndre Fischer                                         }
9138590a0fdSAndre Fischer                                     }
9148590a0fdSAndre Fischer                                     else
9158590a0fdSAndre Fischer                                     {
9168590a0fdSAndre Fischer                                         // when collecting properties add them to result when there are some
9178590a0fdSAndre Fischer                                         if(maResponseNames.size())
9188590a0fdSAndre Fischer                                         {
9198590a0fdSAndre Fischer                                             http_dav_ucp::DAVResourceInfo aDAVResourceInfo(maHref);
9208590a0fdSAndre Fischer 
9218590a0fdSAndre Fischer                                             aDAVResourceInfo.properties = maResponseNames;
9228590a0fdSAndre Fischer                                             maResult_PropName.push_back(aDAVResourceInfo);
9238590a0fdSAndre Fischer                                         }
9248590a0fdSAndre Fischer                                     }
9258590a0fdSAndre Fischer                                 }
9268590a0fdSAndre Fischer                                 break;
9278590a0fdSAndre Fischer                             }
9288590a0fdSAndre Fischer                         }
9298590a0fdSAndre Fischer                         break;
9308590a0fdSAndre Fischer                     }
9318590a0fdSAndre Fischer                     case WebDAVNamespace_ucb_openoffice_org_dav_props:
9328590a0fdSAndre Fischer                     {
9338590a0fdSAndre Fischer                         break;
9348590a0fdSAndre Fischer                     }
9358590a0fdSAndre Fischer                 }
9368590a0fdSAndre Fischer             }
9378590a0fdSAndre Fischer 
9388590a0fdSAndre Fischer             // destroy last context (pop)
9398590a0fdSAndre Fischer             pop_context();
9408590a0fdSAndre Fischer         }
9418590a0fdSAndre Fischer     }
9428590a0fdSAndre Fischer 
characters(const::rtl::OUString & aChars)9438590a0fdSAndre Fischer     void SAL_CALL WebDAVResponseParser::characters( const ::rtl::OUString& aChars ) throw (xml::sax::SAXException, uno::RuntimeException)
9448590a0fdSAndre Fischer     {
9458590a0fdSAndre Fischer         // collect whitespace over evtl. several calls in mpContext
9468590a0fdSAndre Fischer         OSL_ENSURE(mpContext, "Parser characters without content (!)");
9478590a0fdSAndre Fischer         const sal_Int32 nLen(aChars.getLength());
9488590a0fdSAndre Fischer 
9498590a0fdSAndre Fischer         if(mpContext && nLen)
9508590a0fdSAndre Fischer         {
9518590a0fdSAndre Fischer             // remove leading/trailing blanks and CRLF
9528590a0fdSAndre Fischer             const ::rtl::OUString aTrimmedChars(aChars.trim());
9538590a0fdSAndre Fischer 
9548590a0fdSAndre Fischer             if(aTrimmedChars.getLength())
9558590a0fdSAndre Fischer             {
9568590a0fdSAndre Fischer                 ::rtl::OUString aNew(mpContext->getWhiteSpace());
9578590a0fdSAndre Fischer 
9588590a0fdSAndre Fischer                 if(aNew.getLength())
9598590a0fdSAndre Fischer                 {
9608590a0fdSAndre Fischer                     // add one char when appending (see html1.1 spec)
9618590a0fdSAndre Fischer                     aNew += ::rtl::OUString(sal_Unicode(' '));
9628590a0fdSAndre Fischer                 }
9638590a0fdSAndre Fischer 
9648590a0fdSAndre Fischer                 aNew += aTrimmedChars;
9658590a0fdSAndre Fischer                 mpContext->setWhiteSpace(aNew);
9668590a0fdSAndre Fischer             }
9678590a0fdSAndre Fischer         }
9688590a0fdSAndre Fischer     }
9698590a0fdSAndre Fischer 
ignorableWhitespace(const::rtl::OUString &)9708590a0fdSAndre Fischer     void SAL_CALL WebDAVResponseParser::ignorableWhitespace( const ::rtl::OUString& /*aWhitespaces*/ ) throw (xml::sax::SAXException, uno::RuntimeException)
9718590a0fdSAndre Fischer     {
9728590a0fdSAndre Fischer     }
9738590a0fdSAndre Fischer 
processingInstruction(const::rtl::OUString &,const::rtl::OUString &)974*3edf6992SAndrea Pescetti     void SAL_CALL WebDAVResponseParser::processingInstruction( const ::rtl::OUString& /*aTarget*/, const ::rtl::OUString& /*aData*/ )
975*3edf6992SAndrea Pescetti         throw (xml::sax::SAXException, uno::RuntimeException)
9768590a0fdSAndre Fischer     {
9778590a0fdSAndre Fischer     }
9788590a0fdSAndre Fischer 
setDocumentLocator(const uno::Reference<xml::sax::XLocator> &)9798590a0fdSAndre Fischer     void SAL_CALL WebDAVResponseParser::setDocumentLocator( const uno::Reference< xml::sax::XLocator >& /*xLocator*/ ) throw (xml::sax::SAXException, uno::RuntimeException)
9808590a0fdSAndre Fischer     {
9818590a0fdSAndre Fischer     }
9828590a0fdSAndre Fischer } // end of anonymous namespace
9838590a0fdSAndre Fischer 
9848590a0fdSAndre Fischer //////////////////////////////////////////////////////////////////////////////
9858590a0fdSAndre Fischer // wrapper for various calls to the parser
9868590a0fdSAndre Fischer 
9878590a0fdSAndre Fischer namespace
9888590a0fdSAndre Fischer {
parseWebDAVPropNameResponse(const uno::Reference<io::XInputStream> & xInputStream,std::vector<http_dav_ucp::DAVResource> & rPropFind,std::vector<http_dav_ucp::DAVResourceInfo> & rPropName,http_dav_ucp::DAVPropertyValue & rPropValue,WebDAVResponseParserMode eWebDAVResponseParserMode)9898590a0fdSAndre Fischer     void parseWebDAVPropNameResponse(
9908590a0fdSAndre Fischer         const uno::Reference< io::XInputStream >& xInputStream,
9918590a0fdSAndre Fischer         std::vector< http_dav_ucp::DAVResource >& rPropFind,
9928590a0fdSAndre Fischer         std::vector< http_dav_ucp::DAVResourceInfo >& rPropName,
993*3edf6992SAndrea Pescetti         http_dav_ucp::DAVPropertyValue&           rPropValue,
9948590a0fdSAndre Fischer         WebDAVResponseParserMode eWebDAVResponseParserMode)
9958590a0fdSAndre Fischer     {
9968590a0fdSAndre Fischer         if(xInputStream.is())
9978590a0fdSAndre Fischer         {
9988590a0fdSAndre Fischer             try
9998590a0fdSAndre Fischer             {
10008590a0fdSAndre Fischer                 // prepare ParserInputSrouce
10018590a0fdSAndre Fischer                 xml::sax::InputSource myInputSource;
10028590a0fdSAndre Fischer                 myInputSource.aInputStream = xInputStream;
10038590a0fdSAndre Fischer 
10048590a0fdSAndre Fischer                 // get parser
10058590a0fdSAndre Fischer                 uno::Reference< xml::sax::XParser > xParser(
10068590a0fdSAndre Fischer                     comphelper::getProcessServiceFactory()->createInstance(
10078590a0fdSAndre Fischer                         rtl::OUString::createFromAscii("com.sun.star.xml.sax.Parser") ),
10088590a0fdSAndre Fischer                     uno::UNO_QUERY_THROW );
10098590a0fdSAndre Fischer 
10108590a0fdSAndre Fischer                 // create parser; connect parser and filter
10118590a0fdSAndre Fischer                 WebDAVResponseParser* pWebDAVResponseParser = new WebDAVResponseParser(eWebDAVResponseParserMode);
10128590a0fdSAndre Fischer                 uno::Reference< xml::sax::XDocumentHandler > xWebDAVHdl(pWebDAVResponseParser);
10138590a0fdSAndre Fischer                 xParser->setDocumentHandler(xWebDAVHdl);
10148590a0fdSAndre Fischer 
10158590a0fdSAndre Fischer                 // finally, parse the stream
10168590a0fdSAndre Fischer                 xParser->parseStream(myInputSource);
10178590a0fdSAndre Fischer 
10188590a0fdSAndre Fischer                 // get result
10198590a0fdSAndre Fischer                 switch(eWebDAVResponseParserMode)
10208590a0fdSAndre Fischer                 {
10218590a0fdSAndre Fischer                     case WebDAVResponseParserMode_PropFind:
10228590a0fdSAndre Fischer                     {
10238590a0fdSAndre Fischer                         rPropFind = pWebDAVResponseParser->getResult_PropFind();
10248590a0fdSAndre Fischer                         break;
10258590a0fdSAndre Fischer                     }
10268590a0fdSAndre Fischer                     case WebDAVResponseParserMode_PropName:
10278590a0fdSAndre Fischer                     {
10288590a0fdSAndre Fischer                         rPropName = pWebDAVResponseParser->getResult_PropName();
10298590a0fdSAndre Fischer                         break;
10308590a0fdSAndre Fischer                     }
1031*3edf6992SAndrea Pescetti                     case WebDAVResponseParserMode_LockResponse:
1032*3edf6992SAndrea Pescetti                     {
1033*3edf6992SAndrea Pescetti                         rPropValue = pWebDAVResponseParser->getResult_Lock();
1034*3edf6992SAndrea Pescetti                         break;
1035*3edf6992SAndrea Pescetti                     }
10368590a0fdSAndre Fischer                 }
10378590a0fdSAndre Fischer             }
10388590a0fdSAndre Fischer             catch(uno::Exception&)
10398590a0fdSAndre Fischer             {
10408590a0fdSAndre Fischer                 OSL_ENSURE(false, "WebDAV Parse error (!)");
10418590a0fdSAndre Fischer             }
10428590a0fdSAndre Fischer         }
10438590a0fdSAndre Fischer     }
10448590a0fdSAndre Fischer } // end of anonymous namespace
10458590a0fdSAndre Fischer 
10468590a0fdSAndre Fischer //////////////////////////////////////////////////////////////////////////////
10478590a0fdSAndre Fischer // helper to parse a XML WebDAV response
10488590a0fdSAndre Fischer 
10498590a0fdSAndre Fischer namespace http_dav_ucp
10508590a0fdSAndre Fischer {
parseWebDAVPropFindResponse(const uno::Reference<io::XInputStream> & xInputStream)10518590a0fdSAndre Fischer     std::vector< DAVResource > parseWebDAVPropFindResponse(const uno::Reference< io::XInputStream >& xInputStream)
10528590a0fdSAndre Fischer     {
10538590a0fdSAndre Fischer         std::vector< DAVResource > aRetval;
10548590a0fdSAndre Fischer         std::vector< DAVResourceInfo > aFoo;
1055*3edf6992SAndrea Pescetti         DAVPropertyValue               aFoo2;
10568590a0fdSAndre Fischer 
1057*3edf6992SAndrea Pescetti         parseWebDAVPropNameResponse(xInputStream, aRetval, aFoo, aFoo2, WebDAVResponseParserMode_PropFind);
10588590a0fdSAndre Fischer         return aRetval;
10598590a0fdSAndre Fischer     }
10608590a0fdSAndre Fischer 
parseWebDAVPropNameResponse(const uno::Reference<io::XInputStream> & xInputStream)10618590a0fdSAndre Fischer     std::vector< DAVResourceInfo > parseWebDAVPropNameResponse(const uno::Reference< io::XInputStream >& xInputStream)
10628590a0fdSAndre Fischer     {
10638590a0fdSAndre Fischer         std::vector< DAVResource > aFoo;
10648590a0fdSAndre Fischer         std::vector< DAVResourceInfo > aRetval;
1065*3edf6992SAndrea Pescetti         DAVPropertyValue               aFoo2;
10668590a0fdSAndre Fischer 
1067*3edf6992SAndrea Pescetti         parseWebDAVPropNameResponse(xInputStream, aFoo, aRetval, aFoo2, WebDAVResponseParserMode_PropName);
10688590a0fdSAndre Fischer         return aRetval;
10698590a0fdSAndre Fischer     }
1070*3edf6992SAndrea Pescetti 
parseWebDAVLockResponse(const uno::Reference<io::XInputStream> & xInputStream)1071*3edf6992SAndrea Pescetti     http_dav_ucp::DAVPropertyValue parseWebDAVLockResponse(const uno::Reference< io::XInputStream >& xInputStream)
1072*3edf6992SAndrea Pescetti     {
1073*3edf6992SAndrea Pescetti         std::vector< DAVResource > aFoo2;
1074*3edf6992SAndrea Pescetti         std::vector< DAVResourceInfo > aFoo;
1075*3edf6992SAndrea Pescetti         http_dav_ucp::DAVPropertyValue               aRetval;
1076*3edf6992SAndrea Pescetti 
1077*3edf6992SAndrea Pescetti 
1078*3edf6992SAndrea Pescetti         parseWebDAVPropNameResponse(xInputStream, aFoo2, aFoo, aRetval, WebDAVResponseParserMode_LockResponse);
1079*3edf6992SAndrea Pescetti         return aRetval;
1080*3edf6992SAndrea Pescetti     }
1081*3edf6992SAndrea Pescetti 
10828590a0fdSAndre Fischer } // namespace http_dav_ucp
10838590a0fdSAndre Fischer 
10848590a0fdSAndre Fischer //////////////////////////////////////////////////////////////////////////////
10858590a0fdSAndre Fischer // eof
1086