Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*************************************************************************
3 : *
4 : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : *
6 : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : *
8 : * OpenOffice.org - a multi-platform office productivity suite
9 : *
10 : * This file is part of OpenOffice.org.
11 : *
12 : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : * it under the terms of the GNU Lesser General Public License version 3
14 : * only, as published by the Free Software Foundation.
15 : *
16 : * OpenOffice.org is distributed in the hope that it will be useful,
17 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : * GNU Lesser General Public License version 3 for more details
20 : * (a copy is included in the LICENSE file that accompanied this code).
21 : *
22 : * You should have received a copy of the GNU Lesser General Public License
23 : * version 3 along with OpenOffice.org. If not, see
24 : * <http://www.openoffice.org/license.html>
25 : * for a copy of the LGPLv3 License.
26 : *
27 : ************************************************************************/
28 :
29 :
30 : /**************************************************************************
31 : TODO
32 : **************************************************************************
33 :
34 : *************************************************************************/
35 : #include <comphelper/processfactory.hxx>
36 : #include <ucbhelper/contentidentifier.hxx>
37 : #include "webdavprovider.hxx"
38 : #include "webdavcontent.hxx"
39 :
40 : #include "osl/mutex.hxx"
41 :
42 : using namespace com::sun::star;
43 : using namespace webdav_ucp;
44 :
45 : //=========================================================================
46 : //=========================================================================
47 : //
48 : // ContentProvider Implementation.
49 : //
50 : //=========================================================================
51 : //=========================================================================
52 :
53 0 : ContentProvider::ContentProvider(
54 : const uno::Reference< uno::XComponentContext >& rxContext )
55 : : ::ucbhelper::ContentProviderImplHelper( rxContext ),
56 0 : m_xDAVSessionFactory( new DAVSessionFactory() ),
57 0 : m_pProps( 0 )
58 : {
59 0 : }
60 :
61 : //=========================================================================
62 : // virtual
63 0 : ContentProvider::~ContentProvider()
64 : {
65 0 : delete m_pProps;
66 0 : }
67 :
68 : //=========================================================================
69 : //
70 : // XInterface methods.
71 : //
72 : //=========================================================================
73 :
74 0 : XINTERFACE_IMPL_3( ContentProvider,
75 : lang::XTypeProvider,
76 : lang::XServiceInfo,
77 : ucb::XContentProvider );
78 :
79 : //=========================================================================
80 : //
81 : // XTypeProvider methods.
82 : //
83 : //=========================================================================
84 :
85 0 : XTYPEPROVIDER_IMPL_3( ContentProvider,
86 : lang::XTypeProvider,
87 : lang::XServiceInfo,
88 : ucb::XContentProvider );
89 :
90 : //=========================================================================
91 : //
92 : // XServiceInfo methods.
93 : //
94 : //=========================================================================
95 :
96 0 : XSERVICEINFO_IMPL_1_CTX( ContentProvider,
97 : rtl::OUString( "com.sun.star.comp.WebDAVContentProvider" ),
98 0 : rtl::OUString( WEBDAV_CONTENT_PROVIDER_SERVICE_NAME ) );
99 :
100 : //=========================================================================
101 : //
102 : // Service factory implementation.
103 : //
104 : //=========================================================================
105 :
106 0 : ONE_INSTANCE_SERVICE_FACTORY_IMPL( ContentProvider );
107 :
108 : //=========================================================================
109 : //
110 : // XContentProvider methods.
111 : //
112 : //=========================================================================
113 :
114 : // virtual
115 : uno::Reference< ucb::XContent > SAL_CALL
116 0 : ContentProvider::queryContent(
117 : const uno::Reference<
118 : ucb::XContentIdentifier >& Identifier )
119 : throw( ucb::IllegalIdentifierException,
120 : uno::RuntimeException )
121 : {
122 : // Check URL scheme...
123 :
124 : const rtl::OUString aScheme
125 0 : = Identifier->getContentProviderScheme().toAsciiLowerCase();
126 0 : if ( aScheme != HTTP_URL_SCHEME && aScheme != HTTPS_URL_SCHEME && aScheme != WEBDAV_URL_SCHEME
127 0 : && aScheme != DAV_URL_SCHEME && aScheme != DAVS_URL_SCHEME && aScheme != FTP_URL_SCHEME )
128 0 : throw ucb::IllegalIdentifierException();
129 :
130 : // Normalize URL and create new Id, if nessacary.
131 0 : rtl::OUString aURL = Identifier->getContentIdentifier();
132 :
133 : // At least: <scheme> + "://"
134 0 : if ( aURL.getLength() < ( aScheme.getLength() + 3 ) )
135 0 : throw ucb::IllegalIdentifierException();
136 :
137 0 : if ( ( aURL.getStr()[ aScheme.getLength() ] != sal_Unicode( ':' ) ) ||
138 0 : ( aURL.getStr()[ aScheme.getLength() + 1 ] != sal_Unicode( '/' ) ) ||
139 0 : ( aURL.getStr()[ aScheme.getLength() + 2 ] != sal_Unicode( '/' ) ) )
140 0 : throw ucb::IllegalIdentifierException();
141 :
142 0 : uno::Reference< ucb::XContentIdentifier > xCanonicId;
143 :
144 0 : bool bNewId = false;
145 0 : if ( aScheme == WEBDAV_URL_SCHEME )
146 : {
147 : aURL = aURL.replaceAt( 0,
148 : WEBDAV_URL_SCHEME_LENGTH,
149 0 : rtl::OUString( HTTP_URL_SCHEME ) );
150 0 : bNewId = true;
151 : }
152 0 : else if ( aScheme == DAV_URL_SCHEME )
153 : {
154 : aURL = aURL.replaceAt( 0,
155 : DAV_URL_SCHEME_LENGTH,
156 0 : rtl::OUString( HTTP_URL_SCHEME ) );
157 0 : bNewId = true;
158 : }
159 0 : else if ( aScheme == DAVS_URL_SCHEME )
160 : {
161 : aURL = aURL.replaceAt( 0,
162 : DAVS_URL_SCHEME_LENGTH,
163 0 : rtl::OUString( HTTPS_URL_SCHEME ) );
164 0 : bNewId = true;
165 : }
166 :
167 0 : sal_Int32 nPos = aURL.lastIndexOf( '/' );
168 0 : if ( nPos != aURL.getLength() - 1 )
169 : {
170 : // Find second slash in URL.
171 0 : nPos = aURL.indexOf( '/', aURL.indexOf( '/' ) + 1 );
172 0 : if ( nPos == -1 )
173 0 : throw ucb::IllegalIdentifierException();
174 :
175 0 : nPos = aURL.indexOf( '/', nPos + 1 );
176 0 : if ( nPos == -1 )
177 : {
178 0 : aURL += rtl::OUString("/");
179 0 : bNewId = true;
180 : }
181 : }
182 :
183 0 : if ( bNewId )
184 0 : xCanonicId = new ::ucbhelper::ContentIdentifier( aURL );
185 : else
186 0 : xCanonicId = Identifier;
187 :
188 0 : osl::MutexGuard aGuard( m_aMutex );
189 :
190 : // Check, if a content with given id already exists...
191 : uno::Reference< ucb::XContent > xContent
192 0 : = queryExistingContent( xCanonicId ).get();
193 0 : if ( xContent.is() )
194 : return xContent;
195 :
196 : // Create a new content.
197 :
198 : try
199 : {
200 : xContent = new ::webdav_ucp::Content(
201 0 : m_xContext, this, xCanonicId, m_xDAVSessionFactory );
202 0 : registerNewContent( xContent );
203 : }
204 0 : catch ( ucb::ContentCreationException const & )
205 : {
206 0 : throw ucb::IllegalIdentifierException();
207 : }
208 :
209 0 : if ( !xContent->getIdentifier().is() )
210 0 : throw ucb::IllegalIdentifierException();
211 :
212 0 : return xContent;
213 : }
214 :
215 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|