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 258590a0fdSAndre Fischer #include <rtl/ustring.hxx> 26*efc9b74fSAriel Constenla-Haile #include <rtl/ustrbuf.hxx> 27c1c10f68SAriel Constenla-Haile #include "DAVProperties.hxx" 28c1c10f68SAriel Constenla-Haile #include "UCBDeadPropertyValue.hxx" 298590a0fdSAndre Fischer 30c1c10f68SAriel Constenla-Haile #include "SerfPropPatchReqProcImpl.hxx" 31c1c10f68SAriel Constenla-Haile #include "SerfTypes.hxx" 328590a0fdSAndre Fischer 338590a0fdSAndre Fischer namespace http_dav_ucp 348590a0fdSAndre Fischer { 358590a0fdSAndre Fischer 368590a0fdSAndre Fischer SerfPropPatchReqProcImpl::SerfPropPatchReqProcImpl( const char* inPath, 37e9ff7e89SOliver-Rainer Wittmann const DAVRequestHeaders& inRequestHeaders, 388590a0fdSAndre Fischer const std::vector< ProppatchValue > & inProperties ) 39e9ff7e89SOliver-Rainer Wittmann : SerfRequestProcessorImpl( inPath, inRequestHeaders ) 408590a0fdSAndre Fischer , mpProperties( &inProperties ) 418590a0fdSAndre Fischer { 428590a0fdSAndre Fischer } 438590a0fdSAndre Fischer 448590a0fdSAndre Fischer SerfPropPatchReqProcImpl::~SerfPropPatchReqProcImpl() 458590a0fdSAndre Fischer { 468590a0fdSAndre Fischer } 478590a0fdSAndre Fischer 488590a0fdSAndre Fischer #define PROPPATCH_HEADER "<?xml version=\"1.0\" encoding=\"utf-8\"?><propertyupdate xmlns=\"DAV:\">" 498590a0fdSAndre Fischer #define PROPPATCH_TRAILER "</propertyupdate>" 508590a0fdSAndre Fischer 518590a0fdSAndre Fischer serf_bucket_t * SerfPropPatchReqProcImpl::createSerfRequestBucket( serf_request_t * inSerfRequest ) 528590a0fdSAndre Fischer { 538590a0fdSAndre Fischer serf_bucket_alloc_t* pSerfBucketAlloc = serf_request_get_alloc( inSerfRequest ); 548590a0fdSAndre Fischer 558590a0fdSAndre Fischer // body bucket 568590a0fdSAndre Fischer serf_bucket_t* body_bkt = 0; 57*efc9b74fSAriel Constenla-Haile rtl::OString aBodyText; 588590a0fdSAndre Fischer { 598590a0fdSAndre Fischer // create and fill body bucket with properties to be set or removed 60*efc9b74fSAriel Constenla-Haile static const struct 61*efc9b74fSAriel Constenla-Haile { 62*efc9b74fSAriel Constenla-Haile const char *str; 63*efc9b74fSAriel Constenla-Haile sal_Int32 len; 64*efc9b74fSAriel Constenla-Haile } 65*efc9b74fSAriel Constenla-Haile OpCode [] = { 66*efc9b74fSAriel Constenla-Haile { RTL_CONSTASCII_STRINGPARAM( "set" ) }, 67*efc9b74fSAriel Constenla-Haile { RTL_CONSTASCII_STRINGPARAM( "remove" ) } 68*efc9b74fSAriel Constenla-Haile }; 698590a0fdSAndre Fischer const int nPropCount = ( mpProperties != 0 ) 708590a0fdSAndre Fischer ? mpProperties->size() 718590a0fdSAndre Fischer : 0; 728590a0fdSAndre Fischer if ( nPropCount > 0 ) 738590a0fdSAndre Fischer { 74*efc9b74fSAriel Constenla-Haile rtl::OUStringBuffer aBuffer; 75*efc9b74fSAriel Constenla-Haile // add PropPatch xml header in front 76*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( PROPPATCH_HEADER )); 77*efc9b74fSAriel Constenla-Haile 788590a0fdSAndre Fischer // <*operation code*><prop> 79*efc9b74fSAriel Constenla-Haile 808590a0fdSAndre Fischer ProppatchOperation lastOp = (*mpProperties)[ 0 ].operation; 81*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "<" )); 82*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( OpCode[lastOp].str, OpCode[lastOp].len ); 83*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "><prop>" )); 848590a0fdSAndre Fischer 858590a0fdSAndre Fischer SerfPropName thePropName; 868590a0fdSAndre Fischer for ( int n = 0; n < nPropCount; ++n ) 878590a0fdSAndre Fischer { 888590a0fdSAndre Fischer const ProppatchValue & rProperty = (*mpProperties)[ n ]; 898590a0fdSAndre Fischer // split fullname into namespace and name! 908590a0fdSAndre Fischer DAVProperties::createSerfPropName( rProperty.name, 918590a0fdSAndre Fischer thePropName ); 928590a0fdSAndre Fischer 938590a0fdSAndre Fischer if ( rProperty.operation != lastOp ) 948590a0fdSAndre Fischer { 958590a0fdSAndre Fischer // </prop></*last operation code*><*operation code><prop> 96*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "</prop></" )); 97*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( OpCode[lastOp].str, OpCode[lastOp].len ); 98*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "><" )); 99*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( OpCode[rProperty.operation].str, OpCode[rProperty.operation].len ); 100*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "><prop>" )); 1018590a0fdSAndre Fischer } 1028590a0fdSAndre Fischer 1038590a0fdSAndre Fischer // <*propname* xmlns="*propns*" 104*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "<" )); 105*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( thePropName.name ); 106*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( " xmlns=\"" )); 107*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( thePropName.nspace ); 108*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "\"" )); 1098590a0fdSAndre Fischer 1108590a0fdSAndre Fischer if ( rProperty.operation == PROPSET ) 1118590a0fdSAndre Fischer { 1128590a0fdSAndre Fischer // >*property value*</*propname*> 113*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( ">" )); 1148590a0fdSAndre Fischer 1158590a0fdSAndre Fischer rtl::OUString aStringValue; 1168590a0fdSAndre Fischer if ( DAVProperties::isUCBDeadProperty( thePropName ) ) 1178590a0fdSAndre Fischer { 1188590a0fdSAndre Fischer UCBDeadPropertyValue::toXML( rProperty.value, 1198590a0fdSAndre Fischer aStringValue ); 1208590a0fdSAndre Fischer } 1218590a0fdSAndre Fischer else 1228590a0fdSAndre Fischer { 1238590a0fdSAndre Fischer rProperty.value >>= aStringValue; 1248590a0fdSAndre Fischer } 125*efc9b74fSAriel Constenla-Haile aBuffer.append( aStringValue ); 126*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "</" )); 127*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( thePropName.name ); 128*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( ">" )); 1298590a0fdSAndre Fischer } 1308590a0fdSAndre Fischer else 1318590a0fdSAndre Fischer { 1328590a0fdSAndre Fischer // /> 133*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "/>" )); 1348590a0fdSAndre Fischer } 1358590a0fdSAndre Fischer 1368590a0fdSAndre Fischer lastOp = rProperty.operation; 1378590a0fdSAndre Fischer } 1388590a0fdSAndre Fischer 1398590a0fdSAndre Fischer // </prop></*last operation code*> 140*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "</prop></" )); 141*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( OpCode[lastOp].str, OpCode[lastOp].len ); 142*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( ">" )); 1438590a0fdSAndre Fischer 1448590a0fdSAndre Fischer // add PropPatch xml trailer at end 145*efc9b74fSAriel Constenla-Haile aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( PROPPATCH_TRAILER )); 1468590a0fdSAndre Fischer 147*efc9b74fSAriel Constenla-Haile aBodyText = rtl::OUStringToOString( aBuffer.makeStringAndClear(), RTL_TEXTENCODING_UTF8 ); 148*efc9b74fSAriel Constenla-Haile body_bkt = serf_bucket_simple_copy_create( aBodyText.getStr(), 149*efc9b74fSAriel Constenla-Haile aBodyText.getLength(), 1508590a0fdSAndre Fischer pSerfBucketAlloc ); 1518590a0fdSAndre Fischer } 1528590a0fdSAndre Fischer } 1538590a0fdSAndre Fischer 1548590a0fdSAndre Fischer // create serf request 1558590a0fdSAndre Fischer serf_bucket_t *req_bkt = serf_request_bucket_request_create( inSerfRequest, 1568590a0fdSAndre Fischer "PROPPATCH", 1578590a0fdSAndre Fischer getPathStr(), 1588590a0fdSAndre Fischer body_bkt, 15925eaca47SOliver-Rainer Wittmann pSerfBucketAlloc ) ; 16010e20387SAndre Fischer handleChunkedEncoding(req_bkt, aBodyText.getLength()); 1618590a0fdSAndre Fischer 1628590a0fdSAndre Fischer // set request header fields 1638590a0fdSAndre Fischer serf_bucket_t* hdrs_bkt = serf_bucket_request_get_headers( req_bkt ); 16410e20387SAndre Fischer if (hdrs_bkt != NULL) 16510e20387SAndre Fischer { 166e9ff7e89SOliver-Rainer Wittmann // general header fields provided by caller 167e9ff7e89SOliver-Rainer Wittmann setRequestHeaders( hdrs_bkt ); 1688590a0fdSAndre Fischer 1698590a0fdSAndre Fischer // request specific header fields 1708590a0fdSAndre Fischer if ( body_bkt != 0 && aBodyText.getLength() > 0 ) 1718590a0fdSAndre Fischer { 172e9ff7e89SOliver-Rainer Wittmann serf_bucket_headers_set( hdrs_bkt, "Content-Type", "application/xml" ); 17310e20387SAndre Fischer } 17410e20387SAndre Fischer } 17510e20387SAndre Fischer else 17610e20387SAndre Fischer { 17710e20387SAndre Fischer OSL_ASSERT("Headers Bucket missing"); 1788590a0fdSAndre Fischer } 1798590a0fdSAndre Fischer 1808590a0fdSAndre Fischer return req_bkt; 1818590a0fdSAndre Fischer } 1828590a0fdSAndre Fischer 18349989859SOliver-Rainer Wittmann void SerfPropPatchReqProcImpl::processChunkOfResponseData( const char* /*data*/, 18449989859SOliver-Rainer Wittmann apr_size_t /*len*/ ) 1858590a0fdSAndre Fischer { 18649989859SOliver-Rainer Wittmann // nothing to do; 1878590a0fdSAndre Fischer } 1888590a0fdSAndre Fischer 18949989859SOliver-Rainer Wittmann void SerfPropPatchReqProcImpl::handleEndOfResponseData( serf_bucket_t * /*inSerfResponseBucket*/ ) 1908590a0fdSAndre Fischer { 19149989859SOliver-Rainer Wittmann // nothing to do; 1928590a0fdSAndre Fischer } 1938590a0fdSAndre Fischer 1948590a0fdSAndre Fischer } // namespace http_dav_ucp 195