xref: /AOO42X/main/ucb/source/ucp/webdav/ProppatchRequest.cxx (revision b1c5455db1639c48e26c568e4fa7ee78ca5d60ee)
1*9646dec5SDamjan Jovanovic /**************************************************************
2*9646dec5SDamjan Jovanovic  *
3*9646dec5SDamjan Jovanovic  * Licensed to the Apache Software Foundation (ASF) under one
4*9646dec5SDamjan Jovanovic  * or more contributor license agreements.  See the NOTICE file
5*9646dec5SDamjan Jovanovic  * distributed with this work for additional information
6*9646dec5SDamjan Jovanovic  * regarding copyright ownership.  The ASF licenses this file
7*9646dec5SDamjan Jovanovic  * to you under the Apache License, Version 2.0 (the
8*9646dec5SDamjan Jovanovic  * "License"); you may not use this file except in compliance
9*9646dec5SDamjan Jovanovic  * with the License.  You may obtain a copy of the License at
10*9646dec5SDamjan Jovanovic  *
11*9646dec5SDamjan Jovanovic  *   http://www.apache.org/licenses/LICENSE-2.0
12*9646dec5SDamjan Jovanovic  *
13*9646dec5SDamjan Jovanovic  * Unless required by applicable law or agreed to in writing,
14*9646dec5SDamjan Jovanovic  * software distributed under the License is distributed on an
15*9646dec5SDamjan Jovanovic  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*9646dec5SDamjan Jovanovic  * KIND, either express or implied.  See the License for the
17*9646dec5SDamjan Jovanovic  * specific language governing permissions and limitations
18*9646dec5SDamjan Jovanovic  * under the License.
19*9646dec5SDamjan Jovanovic  *
20*9646dec5SDamjan Jovanovic  *************************************************************/
21*9646dec5SDamjan Jovanovic 
22*9646dec5SDamjan Jovanovic // MARKER(update_precomp.py): autogen include statement, do not remove
23*9646dec5SDamjan Jovanovic #include "precompiled_webdav.hxx"
24*9646dec5SDamjan Jovanovic 
25*9646dec5SDamjan Jovanovic #include <rtl/ustrbuf.hxx>
26*9646dec5SDamjan Jovanovic #include "DAVProperties.hxx"
27*9646dec5SDamjan Jovanovic #include "ProppatchRequest.hxx"
28*9646dec5SDamjan Jovanovic #include "UCBDeadPropertyValue.hxx"
29*9646dec5SDamjan Jovanovic 
30*9646dec5SDamjan Jovanovic using namespace http_dav_ucp;
31*9646dec5SDamjan Jovanovic 
32*9646dec5SDamjan Jovanovic #define PROPPATCH_HEADER "<?xml version=\"1.0\" encoding=\"utf-8\"?><propertyupdate xmlns=\"DAV:\">"
33*9646dec5SDamjan Jovanovic #define PROPPATCH_TRAILER "</propertyupdate>"
34*9646dec5SDamjan Jovanovic 
generatePROPPATCHRequestBody(const std::vector<ProppatchValue> & inProperties)35*9646dec5SDamjan Jovanovic rtl::OString ProppatchRequest::generatePROPPATCHRequestBody(
36*9646dec5SDamjan Jovanovic             const std::vector< ProppatchValue > & inProperties )
37*9646dec5SDamjan Jovanovic {
38*9646dec5SDamjan Jovanovic     rtl::OString aBodyText;
39*9646dec5SDamjan Jovanovic     static const struct
40*9646dec5SDamjan Jovanovic     {
41*9646dec5SDamjan Jovanovic         const char *str;
42*9646dec5SDamjan Jovanovic         sal_Int32   len;
43*9646dec5SDamjan Jovanovic     }
44*9646dec5SDamjan Jovanovic     OpCode [] = {
45*9646dec5SDamjan Jovanovic         { RTL_CONSTASCII_STRINGPARAM( "set" ) },
46*9646dec5SDamjan Jovanovic         { RTL_CONSTASCII_STRINGPARAM( "remove" ) }
47*9646dec5SDamjan Jovanovic     };
48*9646dec5SDamjan Jovanovic     if ( inProperties.size() > 0 )
49*9646dec5SDamjan Jovanovic     {
50*9646dec5SDamjan Jovanovic         rtl::OUStringBuffer aBuffer;
51*9646dec5SDamjan Jovanovic         // add PropPatch xml header in front
52*9646dec5SDamjan Jovanovic         aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( PROPPATCH_HEADER ));
53*9646dec5SDamjan Jovanovic 
54*9646dec5SDamjan Jovanovic         // <*operation code*><prop>
55*9646dec5SDamjan Jovanovic 
56*9646dec5SDamjan Jovanovic         ProppatchOperation lastOp = inProperties[ 0 ].operation;
57*9646dec5SDamjan Jovanovic         aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "<" ));
58*9646dec5SDamjan Jovanovic         aBuffer.appendAscii( OpCode[lastOp].str, OpCode[lastOp].len );
59*9646dec5SDamjan Jovanovic         aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "><prop>" ));
60*9646dec5SDamjan Jovanovic 
61*9646dec5SDamjan Jovanovic         CurlPropName thePropName;
62*9646dec5SDamjan Jovanovic         for ( unsigned long n = 0; n < inProperties.size(); ++n )
63*9646dec5SDamjan Jovanovic         {
64*9646dec5SDamjan Jovanovic             const ProppatchValue & rProperty = inProperties[ n ];
65*9646dec5SDamjan Jovanovic             // split fullname into namespace and name!
66*9646dec5SDamjan Jovanovic             DAVProperties::createCurlPropName( rProperty.name,
67*9646dec5SDamjan Jovanovic                                                thePropName );
68*9646dec5SDamjan Jovanovic 
69*9646dec5SDamjan Jovanovic             if ( rProperty.operation != lastOp )
70*9646dec5SDamjan Jovanovic             {
71*9646dec5SDamjan Jovanovic                 // </prop></*last operation code*><*operation code><prop>
72*9646dec5SDamjan Jovanovic                 aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "</prop></" ));
73*9646dec5SDamjan Jovanovic                 aBuffer.appendAscii( OpCode[lastOp].str, OpCode[lastOp].len );
74*9646dec5SDamjan Jovanovic                 aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "><" ));
75*9646dec5SDamjan Jovanovic                 aBuffer.appendAscii( OpCode[rProperty.operation].str, OpCode[rProperty.operation].len );
76*9646dec5SDamjan Jovanovic                 aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "><prop>" ));
77*9646dec5SDamjan Jovanovic             }
78*9646dec5SDamjan Jovanovic 
79*9646dec5SDamjan Jovanovic             // <*propname* xmlns="*propns*"
80*9646dec5SDamjan Jovanovic             aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "<" ));
81*9646dec5SDamjan Jovanovic             aBuffer.appendAscii( thePropName.name );
82*9646dec5SDamjan Jovanovic             aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( " xmlns=\"" ));
83*9646dec5SDamjan Jovanovic             aBuffer.appendAscii( thePropName.nspace );
84*9646dec5SDamjan Jovanovic             aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "\"" ));
85*9646dec5SDamjan Jovanovic 
86*9646dec5SDamjan Jovanovic             if ( rProperty.operation == PROPSET )
87*9646dec5SDamjan Jovanovic             {
88*9646dec5SDamjan Jovanovic                 // >*property value*</*propname*>
89*9646dec5SDamjan Jovanovic                 aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( ">" ));
90*9646dec5SDamjan Jovanovic 
91*9646dec5SDamjan Jovanovic                 rtl::OUString aStringValue;
92*9646dec5SDamjan Jovanovic                 if ( DAVProperties::isUCBDeadProperty( thePropName ) )
93*9646dec5SDamjan Jovanovic                 {
94*9646dec5SDamjan Jovanovic                     UCBDeadPropertyValue::toXML( rProperty.value,
95*9646dec5SDamjan Jovanovic                                                  aStringValue );
96*9646dec5SDamjan Jovanovic                 }
97*9646dec5SDamjan Jovanovic                 else
98*9646dec5SDamjan Jovanovic                 {
99*9646dec5SDamjan Jovanovic                     rProperty.value >>= aStringValue;
100*9646dec5SDamjan Jovanovic                 }
101*9646dec5SDamjan Jovanovic                 aBuffer.append( aStringValue );
102*9646dec5SDamjan Jovanovic                 aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "</" ));
103*9646dec5SDamjan Jovanovic                 aBuffer.appendAscii( thePropName.name );
104*9646dec5SDamjan Jovanovic                 aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( ">" ));
105*9646dec5SDamjan Jovanovic             }
106*9646dec5SDamjan Jovanovic             else
107*9646dec5SDamjan Jovanovic             {
108*9646dec5SDamjan Jovanovic                 // />
109*9646dec5SDamjan Jovanovic                 aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "/>" ));
110*9646dec5SDamjan Jovanovic             }
111*9646dec5SDamjan Jovanovic 
112*9646dec5SDamjan Jovanovic             lastOp = rProperty.operation;
113*9646dec5SDamjan Jovanovic         }
114*9646dec5SDamjan Jovanovic 
115*9646dec5SDamjan Jovanovic         // </prop></*last operation code*>
116*9646dec5SDamjan Jovanovic         aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "</prop></" ));
117*9646dec5SDamjan Jovanovic         aBuffer.appendAscii( OpCode[lastOp].str, OpCode[lastOp].len );
118*9646dec5SDamjan Jovanovic         aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( ">" ));
119*9646dec5SDamjan Jovanovic 
120*9646dec5SDamjan Jovanovic         // add PropPatch xml trailer at end
121*9646dec5SDamjan Jovanovic         aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( PROPPATCH_TRAILER ));
122*9646dec5SDamjan Jovanovic 
123*9646dec5SDamjan Jovanovic         return rtl::OUStringToOString( aBuffer.makeStringAndClear(), RTL_TEXTENCODING_UTF8 );
124*9646dec5SDamjan Jovanovic     }
125*9646dec5SDamjan Jovanovic     return rtl::OString();
126*9646dec5SDamjan Jovanovic }
127