1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski #ifndef INCLUDED_SERFREQUESTPROCESSOR_HXX
24*b1cdbd2cSJim Jagielski #define INCLUDED_SERFREQUESTPROCESSOR_HXX
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include <apr_errno.h>
27*b1cdbd2cSJim Jagielski #include <apr_pools.h>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include <serf.h>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include "DAVTypes.hxx"
32*b1cdbd2cSJim Jagielski #include "DAVResource.hxx"
33*b1cdbd2cSJim Jagielski #include "DAVException.hxx"
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #include "SerfTypes.hxx"
36*b1cdbd2cSJim Jagielski #include "SerfInputStream.hxx"
37*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XOutputStream.hpp>
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski namespace http_dav_ucp
40*b1cdbd2cSJim Jagielski {
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski class SerfSession;
43*b1cdbd2cSJim Jagielski class SerfRequestProcessorImpl;
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski class SerfRequestProcessor
46*b1cdbd2cSJim Jagielski {
47*b1cdbd2cSJim Jagielski public:
48*b1cdbd2cSJim Jagielski     SerfRequestProcessor( SerfSession& rSerfSession,
49*b1cdbd2cSJim Jagielski                           const rtl::OUString & inPath,
50*b1cdbd2cSJim Jagielski                           const bool bUseChunkedEncoding );
51*b1cdbd2cSJim Jagielski     ~SerfRequestProcessor();
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski     // PROPFIND - allprop & named
54*b1cdbd2cSJim Jagielski     bool processPropFind( const Depth inDepth,
55*b1cdbd2cSJim Jagielski                           const std::vector< ::rtl::OUString > & inPropNames,
56*b1cdbd2cSJim Jagielski                           std::vector< DAVResource > & ioResources,
57*b1cdbd2cSJim Jagielski                           apr_status_t& outSerfStatus );
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski     // PROPFIND - property names
60*b1cdbd2cSJim Jagielski     bool processPropFind( const Depth inDepth,
61*b1cdbd2cSJim Jagielski                           std::vector< DAVResourceInfo > & ioResInfo,
62*b1cdbd2cSJim Jagielski                           apr_status_t& outSerfStatus );
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski     // PROPPATCH
65*b1cdbd2cSJim Jagielski     bool processPropPatch( const std::vector< ProppatchValue > & inProperties,
66*b1cdbd2cSJim Jagielski                            const com::sun::star::ucb::Lock  inLock,
67*b1cdbd2cSJim Jagielski                            apr_status_t& outSerfStatus );
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski     // GET
70*b1cdbd2cSJim Jagielski     bool processGet( const com::sun::star::uno::Reference< SerfInputStream >& xioInStrm,
71*b1cdbd2cSJim Jagielski                      apr_status_t& outSerfStatus );
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski     // GET inclusive header fields
74*b1cdbd2cSJim Jagielski     bool processGet( const com::sun::star::uno::Reference< SerfInputStream >& xioInStrm,
75*b1cdbd2cSJim Jagielski                      const std::vector< ::rtl::OUString > & inHeaderNames,
76*b1cdbd2cSJim Jagielski                      DAVResource & ioResource,
77*b1cdbd2cSJim Jagielski                      apr_status_t& outSerfStatus );
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski     // GET
80*b1cdbd2cSJim Jagielski     bool processGet( const com::sun::star::uno::Reference< com::sun::star::io::XOutputStream >& xioOutStrm,
81*b1cdbd2cSJim Jagielski                      apr_status_t& outSerfStatus );
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski     // GET inclusive header fields
84*b1cdbd2cSJim Jagielski     bool processGet( const com::sun::star::uno::Reference< com::sun::star::io::XOutputStream >& xioOutStrm,
85*b1cdbd2cSJim Jagielski                      const std::vector< ::rtl::OUString > & inHeaderNames,
86*b1cdbd2cSJim Jagielski                      DAVResource & ioResource,
87*b1cdbd2cSJim Jagielski                      apr_status_t& outSerfStatus );
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski     // HEAD
90*b1cdbd2cSJim Jagielski     bool processHead( const std::vector< ::rtl::OUString > & inHeaderNames,
91*b1cdbd2cSJim Jagielski                       DAVResource & ioResource,
92*b1cdbd2cSJim Jagielski                       apr_status_t& outSerfStatus );
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski     // PUT
95*b1cdbd2cSJim Jagielski     bool processPut( const char* inData,
96*b1cdbd2cSJim Jagielski                      apr_size_t inDataLen,
97*b1cdbd2cSJim Jagielski                      const com::sun::star::ucb::Lock  inLock,
98*b1cdbd2cSJim Jagielski                      apr_status_t& outSerfStatus );
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski     // POST
101*b1cdbd2cSJim Jagielski     bool processPost( const char* inData,
102*b1cdbd2cSJim Jagielski                       apr_size_t inDataLen,
103*b1cdbd2cSJim Jagielski                       const rtl::OUString & inContentType,
104*b1cdbd2cSJim Jagielski                       const rtl::OUString & inReferer,
105*b1cdbd2cSJim Jagielski                       const com::sun::star::ucb::Lock  inLock,
106*b1cdbd2cSJim Jagielski                       const com::sun::star::uno::Reference< SerfInputStream >& xioInStrm,
107*b1cdbd2cSJim Jagielski                       apr_status_t& outSerfStatus );
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski     // POST
110*b1cdbd2cSJim Jagielski     bool processPost( const char* inData,
111*b1cdbd2cSJim Jagielski                       apr_size_t inDataLen,
112*b1cdbd2cSJim Jagielski                       const rtl::OUString & inContentType,
113*b1cdbd2cSJim Jagielski                       const rtl::OUString & inReferer,
114*b1cdbd2cSJim Jagielski                       const com::sun::star::ucb::Lock  inLock,
115*b1cdbd2cSJim Jagielski                       const com::sun::star::uno::Reference< com::sun::star::io::XOutputStream >& xioOutStrm,
116*b1cdbd2cSJim Jagielski                       apr_status_t& outSerfStatus );
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski     // DELETE
119*b1cdbd2cSJim Jagielski     bool processDelete( const com::sun::star::ucb::Lock inLock,
120*b1cdbd2cSJim Jagielski                         apr_status_t& outSerfStatus );
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski     // MKCOL
123*b1cdbd2cSJim Jagielski     bool processMkCol( const com::sun::star::ucb::Lock inLock,
124*b1cdbd2cSJim Jagielski                        apr_status_t& outSerfStatus );
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski     // COPY
127*b1cdbd2cSJim Jagielski     bool processCopy( const rtl::OUString & inDestinationPath,
128*b1cdbd2cSJim Jagielski                       const bool inOverwrite,
129*b1cdbd2cSJim Jagielski                       const com::sun::star::ucb::Lock inLock,
130*b1cdbd2cSJim Jagielski                       apr_status_t& outSerfStatus );
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski     // MOVE
133*b1cdbd2cSJim Jagielski     bool processMove( const rtl::OUString & inDestinationPath,
134*b1cdbd2cSJim Jagielski                       const bool inOverwrite,
135*b1cdbd2cSJim Jagielski                       const com::sun::star::ucb::Lock inLock,
136*b1cdbd2cSJim Jagielski                       apr_status_t& outSerfStatus );
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski     // LOCK
139*b1cdbd2cSJim Jagielski     bool processLock( const rtl::OUString & inDestinationPath,
140*b1cdbd2cSJim Jagielski                       const com::sun::star::ucb::Lock& inLock,
141*b1cdbd2cSJim Jagielski                       DAVPropertyValue & outLock,
142*b1cdbd2cSJim Jagielski                       apr_status_t& outSerfStatus );
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski     // LOCK refresh
145*b1cdbd2cSJim Jagielski     bool processLockRefresh( const rtl::OUString & inDestinationPath,
146*b1cdbd2cSJim Jagielski                       const com::sun::star::ucb::Lock& inLock,
147*b1cdbd2cSJim Jagielski                       DAVPropertyValue & outLock,
148*b1cdbd2cSJim Jagielski                       apr_status_t& outSerfStatus );
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski     //UNLOCK
151*b1cdbd2cSJim Jagielski     bool processUnlock( const rtl::OUString & inDestinationPath,
152*b1cdbd2cSJim Jagielski                         const com::sun::star::ucb::Lock& inLock,
153*b1cdbd2cSJim Jagielski                         apr_status_t& outSerfStatus );
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski     apr_status_t provideSerfCredentials( char ** outUsername,
156*b1cdbd2cSJim Jagielski                                          char ** outPassword,
157*b1cdbd2cSJim Jagielski                                          serf_request_t * inRequest,
158*b1cdbd2cSJim Jagielski                                          int inCode,
159*b1cdbd2cSJim Jagielski                                          const char *inAuthProtocol,
160*b1cdbd2cSJim Jagielski                                          const char *inRealm,
161*b1cdbd2cSJim Jagielski                                          apr_pool_t *inAprPool );
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski     apr_status_t setupSerfRequest( serf_request_t * inSerfRequest,
164*b1cdbd2cSJim Jagielski                                    serf_bucket_t ** outSerfRequestBucket,
165*b1cdbd2cSJim Jagielski                                    serf_response_acceptor_t * outSerfResponseAcceptor,
166*b1cdbd2cSJim Jagielski                                    void ** outSerfResponseAcceptorBaton,
167*b1cdbd2cSJim Jagielski                                    serf_response_handler_t * outSerfResponseHandler,
168*b1cdbd2cSJim Jagielski                                    void ** outSerfResponseHandlerBaton,
169*b1cdbd2cSJim Jagielski                                    apr_pool_t * inAprPool );
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski     serf_bucket_t* acceptSerfResponse( serf_request_t * inSerfRequest,
172*b1cdbd2cSJim Jagielski                                        serf_bucket_t * inSerfStreamBucket,
173*b1cdbd2cSJim Jagielski                                        apr_pool_t* inAprPool );
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski     apr_status_t handleSerfResponse( serf_request_t * inSerfRequest,
176*b1cdbd2cSJim Jagielski                                      serf_bucket_t * inSerfResponseBucket,
177*b1cdbd2cSJim Jagielski                                      apr_pool_t * inAprPool );
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski //private:
180*b1cdbd2cSJim Jagielski     void prepareProcessor();
181*b1cdbd2cSJim Jagielski     apr_status_t runProcessor();
182*b1cdbd2cSJim Jagielski     void postprocessProcessor( const apr_status_t inStatus );
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski     SerfSession& mrSerfSession;
185*b1cdbd2cSJim Jagielski     const char* mPathStr;
186*b1cdbd2cSJim Jagielski     const bool mbUseChunkedEncoding;
187*b1cdbd2cSJim Jagielski     const char* mDestPathStr;
188*b1cdbd2cSJim Jagielski     const char* mContentType;
189*b1cdbd2cSJim Jagielski     const char* mReferer;
190*b1cdbd2cSJim Jagielski     SerfRequestProcessorImpl* mpProcImpl;
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski     bool mbProcessingDone;
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski     DAVException* mpDAVException;
195*b1cdbd2cSJim Jagielski     sal_uInt16 mnHTTPStatusCode;
196*b1cdbd2cSJim Jagielski     rtl::OUString mHTTPStatusCodeText;
197*b1cdbd2cSJim Jagielski     rtl::OUString mRedirectLocation;
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski     sal_uInt8 mnSuccessfulCredentialAttempts;
200*b1cdbd2cSJim Jagielski     bool mbInputOfCredentialsAborted;
201*b1cdbd2cSJim Jagielski     bool mbSetupSerfRequestCalled;
202*b1cdbd2cSJim Jagielski     bool mbAcceptSerfResponseCalled;
203*b1cdbd2cSJim Jagielski     bool mbHandleSerfResponseCalled;
204*b1cdbd2cSJim Jagielski };
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski } // namespace http_dav_ucp
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski #endif // INCLUDED_SERFREQUESTPROCESSOR_HXX
209