1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _DAVRESOURCEACCESS_HXX_
25 #define _DAVRESOURCEACCESS_HXX_
26 
27 #include <vector>
28 #include <rtl/ustring.hxx>
29 #include <rtl/ref.hxx>
30 #include <osl/mutex.hxx>
31 #include <com/sun/star/io/XInputStream.hpp>
32 #include <com/sun/star/io/XOutputStream.hpp>
33 #include <com/sun/star/ucb/Lock.hpp>
34 #include <com/sun/star/ucb/XCommandEnvironment.hpp>
35 #include <com/sun/star/ucb/WebDAVHTTPMethod.hpp>
36 #include "DAVAuthListener.hxx"
37 #include "DAVException.hxx"
38 #include "DAVSession.hxx"
39 #include "DAVResource.hxx"
40 #include "DAVTypes.hxx"
41 #include "SerfUri.hxx"
42 
43 namespace http_dav_ucp
44 {
45 
46 class DAVSessionFactory;
47 
48 class DAVResourceAccess
49 {
50     osl::Mutex    m_aMutex;
51     rtl::OUString m_aURL;
52     rtl::OUString m_aPath;
53     rtl::Reference< DAVSession > m_xSession;
54     rtl::Reference< DAVSessionFactory > m_xSessionFactory;
55     com::sun::star::uno::Reference<
56         com::sun::star::lang::XMultiServiceFactory > m_xSMgr;
57     std::vector< SerfUri > m_aRedirectURIs;
58 
59 public:
60     DAVResourceAccess() : m_xSessionFactory( 0 ) {}
61     DAVResourceAccess( const com::sun::star::uno::Reference<
62                            com::sun::star::lang::XMultiServiceFactory > & rSMgr,
63                        rtl::Reference<
64                        DAVSessionFactory > const & rSessionFactory,
65                        const rtl::OUString & rURL );
66     DAVResourceAccess( const DAVResourceAccess & rOther );
67 
68     DAVResourceAccess & operator=( const DAVResourceAccess & rOther );
69 
70     void setURL( const rtl::OUString & rNewURL )
71         throw ( DAVException );
72 
73     void resetUri();
74 
75     const rtl::OUString & getURL() const { return m_aURL; }
76 
77     rtl::Reference< DAVSessionFactory > getSessionFactory() const
78     { return m_xSessionFactory; }
79 
80     // DAV methods
81     //
82 
83     // allprop & named
84     void
85     PROPFIND( const Depth nDepth,
86               const std::vector< rtl::OUString > & rPropertyNames,
87               std::vector< DAVResource > & rResources,
88               const com::sun::star::uno::Reference<
89                   com::sun::star::ucb::XCommandEnvironment > & xEnv )
90         throw ( DAVException );
91 
92     // propnames
93     void
94     PROPFIND( const Depth nDepth,
95               std::vector< DAVResourceInfo > & rResInfo,
96               const com::sun::star::uno::Reference<
97                   com::sun::star::ucb::XCommandEnvironment > & xEnv )
98         throw ( DAVException );
99 
100     void
101     PROPPATCH( const std::vector< ProppatchValue > & rValues,
102                const com::sun::star::uno::Reference<
103                    com::sun::star::ucb::XCommandEnvironment >& xEnv )
104         throw ( DAVException );
105 
106     void
107     HEAD( const std::vector< rtl::OUString > & rHeaderNames, // empty == 'all'
108           DAVResource & rResource,
109           const com::sun::star::uno::Reference<
110               com::sun::star::ucb::XCommandEnvironment >& xEnv )
111         throw ( DAVException );
112 
113     com::sun::star::uno::Reference< com::sun::star::io::XInputStream >
114     GET( const com::sun::star::uno::Reference<
115              com::sun::star::ucb::XCommandEnvironment > & xEnv )
116         throw ( DAVException );
117 
118     void
119     GET( com::sun::star::uno::Reference<
120              com::sun::star::io::XOutputStream > & rStream,
121          const com::sun::star::uno::Reference<
122              com::sun::star::ucb::XCommandEnvironment > & xEnv )
123         throw ( DAVException );
124 
125     com::sun::star::uno::Reference< com::sun::star::io::XInputStream >
126     GET( const std::vector< rtl::OUString > & rHeaderNames, // empty == 'all'
127          DAVResource & rResource,
128          const com::sun::star::uno::Reference<
129              com::sun::star::ucb::XCommandEnvironment > & xEnv )
130         throw ( DAVException );
131 
132     com::sun::star::uno::Reference< com::sun::star::io::XInputStream >
133     GET( DAVRequestHeaders & rRequestHeaders,
134          const std::vector< rtl::OUString > & rHeaderNames, // empty == 'all'
135          DAVResource & rResource,
136          const com::sun::star::uno::Reference<
137              com::sun::star::ucb::XCommandEnvironment > & xEnv )
138         throw ( DAVException );
139 
140     void
141     GET( com::sun::star::uno::Reference<
142              com::sun::star::io::XOutputStream > & rStream,
143          const std::vector< rtl::OUString > & rHeaderNames, // empty == 'all'
144          DAVResource & rResource,
145          const com::sun::star::uno::Reference<
146              com::sun::star::ucb::XCommandEnvironment > & xEnv )
147         throw ( DAVException );
148 
149     void
150     PUT( const com::sun::star::uno::Reference<
151              com::sun::star::io::XInputStream > & rStream,
152          const com::sun::star::uno::Reference<
153              com::sun::star::ucb::XCommandEnvironment > & xEnv )
154         throw ( DAVException );
155 
156     com::sun::star::uno::Reference< com::sun::star::io::XInputStream >
157     POST( const rtl::OUString & rContentType,
158           const rtl::OUString & rReferer,
159           const com::sun::star::uno::Reference<
160               com::sun::star::io::XInputStream > & rInputStream,
161           const com::sun::star::uno::Reference<
162           com::sun::star::ucb::XCommandEnvironment >& xEnv )
163         throw ( DAVException );
164 
165     void
166     POST( const rtl::OUString & rContentType,
167           const rtl::OUString & rReferer,
168           const com::sun::star::uno::Reference<
169               com::sun::star::io::XInputStream > & rInputStream,
170           com::sun::star::uno::Reference<
171               com::sun::star::io::XOutputStream > & rOutputStream,
172           const com::sun::star::uno::Reference<
173               com::sun::star::ucb::XCommandEnvironment >& xEnv )
174         throw ( DAVException );
175 
176     void
177     MKCOL( const com::sun::star::uno::Reference<
178                com::sun::star::ucb::XCommandEnvironment > & xEnv )
179         throw ( DAVException );
180 
181     void
182     COPY( const ::rtl::OUString & rSourcePath,
183           const ::rtl::OUString & rDestinationURI,
184           sal_Bool bOverwrite,
185           const com::sun::star::uno::Reference<
186               com::sun::star::ucb::XCommandEnvironment > & xEnv )
187         throw ( DAVException );
188 
189     void
190     MOVE( const ::rtl::OUString & rSourcePath,
191           const ::rtl::OUString & rDestinationURI,
192           sal_Bool bOverwrite,
193           const com::sun::star::uno::Reference<
194               com::sun::star::ucb::XCommandEnvironment > & xEnv )
195         throw ( DAVException );
196 
197     void
198     DESTROY( const com::sun::star::uno::Reference<
199                  com::sun::star::ucb::XCommandEnvironment > & xEnv )
200         throw ( DAVException );
201 
202     // set new lock.
203     void
204     LOCK( com::sun::star::ucb::Lock & inLock,
205           const com::sun::star::uno::Reference<
206           com::sun::star::ucb::XCommandEnvironment > & xEnv )
207         throw( DAVException );
208 
209 #if 0 // currently not used, but please don't remove code
210     // refresh existing lock.
211     sal_Int64
212     LOCK( sal_Int64 nTimeout,
213           const com::sun::star::uno::Reference<
214               com::sun::star::ucb::XCommandEnvironment > & xEnv )
215         throw ( DAVException );
216 #endif
217 
218     void
219     UNLOCK( const com::sun::star::uno::Reference<
220                 com::sun::star::ucb::XCommandEnvironment > & xEnv )
221         throw ( DAVException );
222 
223     void
224     abort()
225         throw ( DAVException );
226 
227     // helper
228     static void
229     getUserRequestHeaders(
230         const com::sun::star::uno::Reference<
231             com::sun::star::ucb::XCommandEnvironment > & xEnv,
232         const rtl::OUString & rURI,
233         com::sun::star::ucb::WebDAVHTTPMethod eMethod,
234         DAVRequestHeaders & rRequestHeaders );
235 
236 private:
237     const rtl::OUString & getRequestURI() const;
238     sal_Bool detectRedirectCycle( const rtl::OUString& rRedirectURL )
239         throw ( DAVException );
240     sal_Bool handleException( DAVException & e, int errorCount )
241         throw ( DAVException );
242     void initialize()
243         throw ( DAVException );
244 };
245 
246 } // namespace http_dav_ucp
247 
248 #endif // _DAVRESOURCEACCESS_HXX_
249