Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 :
10 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
11 : #include <com/sun/star/task/InteractionHandler.hpp>
12 : #include <com/sun/star/ucb/XCommandEnvironment.hpp>
13 : #include <com/sun/star/ucb/XContentAccess.hpp>
14 : #include <com/sun/star/sdbc/XResultSet.hpp>
15 : #include <com/sun/star/sdbc/XRow.hpp>
16 :
17 : #include <comphelper/processfactory.hxx>
18 : #include <officecfg/Office/Common.hxx>
19 : #include <rtl/uri.hxx>
20 : #include <ucbhelper/content.hxx>
21 : #include <ucbhelper/commandenvironment.hxx>
22 :
23 : #include <svtools/PlaceEditDialog.hxx>
24 : #include <svtools/ServerDetailsControls.hxx>
25 : #include <config_oauth2.h>
26 :
27 : using namespace std;
28 : using namespace com::sun::star::lang;
29 : using namespace com::sun::star::sdbc;
30 : using namespace com::sun::star::task;
31 : using namespace com::sun::star::ucb;
32 : using namespace com::sun::star::uno;
33 :
34 0 : DetailsContainer::DetailsContainer( VclBuilderContainer* pBuilder, const OString& rFrame )
35 : {
36 0 : pBuilder->get( m_pFrame, rFrame );
37 0 : }
38 :
39 0 : DetailsContainer::~DetailsContainer( )
40 : {
41 0 : }
42 :
43 0 : void DetailsContainer::show( bool bShow )
44 : {
45 0 : m_pFrame->Show( bShow );
46 0 : }
47 :
48 0 : INetURLObject DetailsContainer::getUrl( )
49 : {
50 : // Don't use that class directly: make it smarter by subclassing it.
51 0 : return INetURLObject( );
52 : }
53 :
54 0 : bool DetailsContainer::setUrl( const INetURLObject& )
55 : {
56 : // That class doesn't contain any logic... it defers the dirty work
57 : // to the sub classes.
58 0 : return false;
59 : }
60 :
61 0 : void DetailsContainer::notifyChange( )
62 : {
63 0 : m_aChangeHdl.Call( this );
64 0 : }
65 :
66 0 : IMPL_LINK( DetailsContainer, ValueChangeHdl, void *, EMPTYARG )
67 : {
68 0 : notifyChange( );
69 0 : return 0;
70 : }
71 :
72 0 : HostDetailsContainer::HostDetailsContainer( VclBuilderContainer* pBuilder, sal_uInt16 nPort, const OUString& sScheme ) :
73 : DetailsContainer( pBuilder, "HostDetails" ),
74 : m_nDefaultPort( nPort ),
75 0 : m_sScheme( sScheme )
76 : {
77 0 : pBuilder->get( m_pEDHost, "host" );
78 0 : m_pEDHost->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
79 :
80 0 : pBuilder->get( m_pEDPort, "port" );
81 0 : m_pEDPort->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
82 :
83 0 : pBuilder->get( m_pEDPath, "path" );
84 0 : m_pEDPath->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
85 :
86 0 : show( false );
87 0 : }
88 :
89 0 : void HostDetailsContainer::show( bool bShow )
90 : {
91 0 : DetailsContainer::show( bShow );
92 0 : if ( bShow )
93 0 : m_pEDPort->SetValue( m_nDefaultPort );
94 0 : }
95 :
96 0 : INetURLObject HostDetailsContainer::getUrl( )
97 : {
98 0 : OUString sHost = m_pEDHost->GetText().trim( );
99 0 : sal_Int64 nPort = m_pEDPort->GetValue();
100 0 : OUString sPath = m_pEDPath->GetText().trim( );
101 :
102 0 : OUString sUrl;
103 0 : if ( !sHost.isEmpty( ) )
104 : {
105 0 : sUrl = m_sScheme + "://" + sHost;
106 0 : if ( nPort != m_nDefaultPort )
107 0 : sUrl += ":" + OUString::number( nPort );
108 0 : if ( !sPath.isEmpty( ) )
109 0 : if ( sPath.indexOf( '/' ) != 0 )
110 0 : sUrl += "/";
111 0 : sUrl += sPath;
112 : }
113 :
114 0 : return INetURLObject( sUrl );
115 : }
116 :
117 0 : bool HostDetailsContainer::setUrl( const INetURLObject& rUrl )
118 : {
119 0 : bool bSuccess = verifyScheme( INetURLObject::GetScheme( rUrl.GetProtocol( ) ) );
120 :
121 0 : if ( bSuccess )
122 : {
123 0 : m_pEDHost->SetText( rUrl.GetHost( ) );
124 0 : m_pEDPort->SetValue( rUrl.GetPort( ) );
125 0 : m_pEDPath->SetText( rUrl.GetURLPath() );
126 : }
127 :
128 0 : return bSuccess;
129 : }
130 :
131 0 : bool HostDetailsContainer::verifyScheme( const OUString& sScheme )
132 : {
133 0 : return sScheme.equals( m_sScheme + "://" );
134 : }
135 :
136 0 : DavDetailsContainer::DavDetailsContainer( VclBuilderContainer* pBuilder ) :
137 0 : HostDetailsContainer( pBuilder, 80, "http" )
138 : {
139 0 : pBuilder->get( m_pCBDavs, "webdavs" );
140 0 : m_pCBDavs->SetToggleHdl( LINK( this, DavDetailsContainer, ToggledDavsHdl ) );
141 :
142 0 : show( false );
143 0 : }
144 :
145 0 : void DavDetailsContainer::show( bool bShow )
146 : {
147 0 : HostDetailsContainer::show( bShow );
148 :
149 0 : m_pCBDavs->Show( bShow );
150 :
151 0 : if ( bShow )
152 0 : m_pCBDavs->Check( false );
153 0 : }
154 :
155 0 : bool DavDetailsContainer::verifyScheme( const OUString& rScheme )
156 : {
157 0 : bool bValid = false;
158 0 : if ( rScheme.equals( "http://" ) )
159 : {
160 0 : bValid = true;
161 0 : m_pCBDavs->Check( false );
162 : }
163 0 : else if ( rScheme.equals( "https://" ) )
164 : {
165 0 : bValid = true;
166 0 : m_pCBDavs->Check( true );
167 : }
168 0 : return bValid;
169 : }
170 :
171 0 : IMPL_LINK( DavDetailsContainer, ToggledDavsHdl, CheckBox*, pCheckBox )
172 : {
173 : // Change default port if needed
174 0 : sal_Bool bCheckedDavs = pCheckBox->IsChecked();
175 0 : if ( m_pEDPort->GetValue() == 80 && bCheckedDavs == sal_True)
176 0 : m_pEDPort->SetValue( 443 );
177 0 : else if ( m_pEDPort->GetValue() == 443 && bCheckedDavs == sal_False )
178 0 : m_pEDPort->SetValue( 80 );
179 :
180 0 : OUString sScheme( "http" );
181 0 : if ( bCheckedDavs )
182 0 : sScheme = "https";
183 0 : setScheme( sScheme );
184 :
185 0 : notifyChange( );
186 :
187 0 : return 0;
188 : }
189 :
190 0 : SmbDetailsContainer::SmbDetailsContainer( VclBuilderContainer* pBuilder ) :
191 0 : DetailsContainer( pBuilder, "SmbDetails" )
192 : {
193 0 : pBuilder->get( m_pEDHost, "smbHost" );
194 0 : m_pEDHost->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
195 :
196 0 : pBuilder->get( m_pEDShare, "smbShare" );
197 0 : m_pEDShare->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
198 :
199 0 : pBuilder->get( m_pEDPath, "smbPath" );
200 0 : m_pEDPath->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
201 :
202 0 : show( false );
203 0 : }
204 :
205 0 : INetURLObject SmbDetailsContainer::getUrl( )
206 : {
207 0 : OUString sHost = m_pEDHost->GetText().trim( );
208 0 : OUString sShare = m_pEDShare->GetText().trim( );
209 0 : OUString sPath = m_pEDPath->GetText().trim( );
210 :
211 0 : OUString sUrl;
212 0 : if ( !sHost.isEmpty( ) )
213 : {
214 0 : sUrl = "smb://" + sHost + "/";
215 0 : if ( !sShare.isEmpty( ) )
216 0 : sUrl += sShare;
217 0 : if ( !sPath.isEmpty( ) )
218 0 : if ( sPath.indexOf( '/' ) != 0 )
219 0 : sUrl += "/";
220 0 : sUrl += sPath;
221 : }
222 :
223 0 : return INetURLObject( sUrl );
224 : }
225 :
226 0 : bool SmbDetailsContainer::setUrl( const INetURLObject& rUrl )
227 : {
228 0 : bool bSuccess = rUrl.GetProtocol() == INET_PROT_SMB;
229 :
230 0 : if ( bSuccess )
231 : {
232 0 : OUString sShare = rUrl.getName( 0 );
233 0 : OUString sFullPath = rUrl.GetURLPath( );
234 0 : OUString sPath;
235 0 : if ( sFullPath.getLength( ) > sShare.getLength( ) )
236 : {
237 0 : sal_Int32 nPos = sShare.getLength( );
238 0 : if ( nPos != 0 )
239 0 : ++nPos;
240 0 : sPath = sFullPath.copy( nPos );
241 : }
242 :
243 0 : m_pEDHost->SetText( rUrl.GetHost( ) );
244 0 : m_pEDShare->SetText( sShare );
245 0 : m_pEDPath->SetText( sPath );
246 : }
247 :
248 0 : return bSuccess;
249 : }
250 :
251 0 : CmisDetailsContainer::CmisDetailsContainer( VclBuilderContainer* pBuilder ) :
252 : DetailsContainer( pBuilder, "CmisDetails" ),
253 : m_sUsername( ),
254 : m_xCmdEnv( ),
255 : m_aServerTypesURLs( ),
256 : m_aRepoIds( ),
257 0 : m_sRepoId( )
258 : {
259 0 : Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext();
260 : Reference< XInteractionHandler > xGlobalInteractionHandler(
261 0 : InteractionHandler::createWithParent(xContext, 0), UNO_QUERY );
262 0 : m_xCmdEnv = new ucbhelper::CommandEnvironment( xGlobalInteractionHandler, Reference< XProgressHandler >() );
263 :
264 0 : pBuilder->get( m_pLBServerType, "serverType" );
265 0 : m_pLBServerType->SetSelectHdl( LINK( this, CmisDetailsContainer, SelectServerTypeHdl ) );
266 :
267 0 : pBuilder->get( m_pEDBinding, "binding" );
268 0 : m_pEDBinding->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
269 :
270 0 : pBuilder->get( m_pLBRepository, "repositories" );
271 0 : m_pLBRepository->SetSelectHdl( LINK( this, CmisDetailsContainer, SelectRepoHdl ) );
272 :
273 0 : pBuilder->get( m_pBTRepoRefresh, "repositoriesRefresh" );
274 0 : m_pBTRepoRefresh->SetClickHdl( LINK( this, CmisDetailsContainer, RefreshReposHdl ) );
275 :
276 0 : pBuilder->get( m_pEDPath, "cmisPath" );
277 0 : m_pEDPath->SetModifyHdl( LINK( this, DetailsContainer, ValueChangeHdl ) );
278 :
279 0 : show( false );
280 :
281 : // Load the ServerType entries
282 0 : bool bSkipGDrive = OUString( GDRIVE_CLIENT_ID ).isEmpty() ||
283 0 : OUString( GDRIVE_CLIENT_SECRET ).isEmpty();
284 0 : bool bSkipAlfresco = OUString( ALFRESCO_CLOUD_CLIENT_ID ).isEmpty() ||
285 0 : OUString( ALFRESCO_CLOUD_CLIENT_SECRET ).isEmpty();
286 :
287 0 : Sequence< OUString > aTypesUrlsList( officecfg::Office::Common::Misc::CmisServersUrls::get( xContext ) );
288 0 : Sequence< OUString > aTypesNamesList( officecfg::Office::Common::Misc::CmisServersNames::get( xContext ) );
289 0 : for ( sal_Int32 i = 0; i < aTypesUrlsList.getLength( ) && aTypesNamesList.getLength( ); ++i )
290 : {
291 0 : OUString sUrl = aTypesUrlsList[i];
292 0 : if ( !( sUrl == GDRIVE_BASE_URL && bSkipGDrive ) &&
293 0 : !( sUrl.startsWith( ALFRESCO_CLOUD_BASE_URL ) && bSkipAlfresco ) )
294 : {
295 0 : m_pLBServerType->InsertEntry( aTypesNamesList[i] );
296 0 : m_aServerTypesURLs.push_back( sUrl );
297 : }
298 0 : }
299 0 : }
300 :
301 0 : INetURLObject CmisDetailsContainer::getUrl( )
302 : {
303 0 : OUString sBindingUrl = m_pEDBinding->GetText().trim( );
304 0 : OUString sPath = m_pEDPath->GetText().trim( );
305 :
306 0 : OUString sUrl;
307 0 : if ( !sBindingUrl.isEmpty( ) && !m_sRepoId.isEmpty() )
308 : {
309 : OUString sEncodedBinding = rtl::Uri::encode(
310 0 : sBindingUrl + "#" + m_sRepoId,
311 : rtl_UriCharClassRelSegment,
312 : rtl_UriEncodeKeepEscapes,
313 0 : RTL_TEXTENCODING_UTF8 );
314 0 : sUrl = "vnd.libreoffice.cmis://" + sEncodedBinding;
315 : }
316 0 : sUrl += sPath;
317 :
318 0 : return INetURLObject( sUrl );
319 : }
320 :
321 0 : bool CmisDetailsContainer::setUrl( const INetURLObject& rUrl )
322 : {
323 0 : bool bSuccess = rUrl.GetProtocol() == INET_PROT_CMIS;
324 :
325 0 : if ( bSuccess )
326 : {
327 0 : OUString sBindingUrl;
328 0 : OUString sRepositoryId;
329 :
330 0 : OUString sDecodedHost = rUrl.GetHost( INetURLObject::DECODE_WITH_CHARSET );
331 0 : INetURLObject aHostUrl( sDecodedHost );
332 0 : sBindingUrl = aHostUrl.GetURLNoMark( );
333 0 : sRepositoryId = aHostUrl.GetMark( );
334 :
335 0 : m_pEDBinding->SetText( sBindingUrl );
336 0 : m_pEDPath->SetText( rUrl.GetURLPath() );
337 : }
338 0 : return bSuccess;
339 : }
340 :
341 0 : void CmisDetailsContainer::setUsername( const OUString& rUsername )
342 : {
343 0 : m_sUsername = rUsername;
344 0 : }
345 :
346 0 : void CmisDetailsContainer::selectRepository( )
347 : {
348 : // Get the repo ID and call the Change listener
349 0 : sal_uInt16 nPos = m_pLBRepository->GetSelectEntryPos( );
350 0 : m_sRepoId = m_aRepoIds[nPos];
351 :
352 0 : notifyChange( );
353 0 : }
354 :
355 0 : IMPL_LINK( CmisDetailsContainer, SelectServerTypeHdl, void *, EMPTYARG )
356 : {
357 : // Set a sample URL for the server
358 0 : sal_uInt16 nId = m_pLBServerType->GetSelectEntryPos( );
359 0 : m_pEDBinding->SetText( m_aServerTypesURLs[nId] );
360 0 : return 0;
361 : }
362 :
363 0 : IMPL_LINK( CmisDetailsContainer, RefreshReposHdl, void *, EMPTYARG )
364 : {
365 0 : OUString sBindingUrl = m_pEDBinding->GetText().trim( );
366 :
367 : // Clean the listbox
368 0 : m_pLBRepository->Clear( );
369 0 : m_aRepoIds.clear( );
370 :
371 : // Compute the URL
372 0 : OUString sUrl;
373 0 : if ( !sBindingUrl.isEmpty( ) )
374 : {
375 : OUString sEncodedBinding = rtl::Uri::encode(
376 : sBindingUrl,
377 : rtl_UriCharClassRelSegment,
378 : rtl_UriEncodeKeepEscapes,
379 0 : RTL_TEXTENCODING_UTF8 );
380 0 : sUrl = "vnd.libreoffice.cmis://" + sEncodedBinding;
381 : }
382 :
383 : // Get the Content
384 0 : ::ucbhelper::Content aCnt( sUrl, m_xCmdEnv, comphelper::getProcessComponentContext() );
385 0 : Sequence< OUString > aProps( 1 );
386 0 : aProps[0] = "Title";
387 :
388 : try
389 : {
390 0 : Reference< XResultSet > xResultSet( aCnt.createCursor( aProps ), UNO_QUERY_THROW );
391 0 : Reference< XContentAccess > xAccess( xResultSet, UNO_QUERY_THROW );
392 0 : while ( xResultSet->next() )
393 : {
394 0 : OUString sURL = xAccess->queryContentIdentifierString( );
395 0 : INetURLObject aURL( sURL );
396 0 : OUString sId = aURL.GetURLPath( INetURLObject::DECODE_WITH_CHARSET );
397 0 : sId = sId.copy( 1 );
398 0 : m_aRepoIds.push_back( sId );
399 :
400 0 : Reference< XRow > xRow( xResultSet, UNO_QUERY );
401 0 : OUString sName = xRow->getString( 1 );
402 0 : m_pLBRepository->InsertEntry( sName );
403 0 : }
404 : }
405 0 : catch ( const Exception& )
406 : {
407 : }
408 :
409 : // Auto-select the first one
410 0 : if ( m_pLBRepository->GetEntryCount( ) > 0 )
411 : {
412 0 : m_pLBRepository->SelectEntryPos( 0 );
413 0 : selectRepository( );
414 : }
415 :
416 0 : return 0;
417 : }
418 :
419 0 : IMPL_LINK( CmisDetailsContainer, SelectRepoHdl, void *, EMPTYARG )
420 : {
421 0 : selectRepository( );
422 0 : return 0;
423 3 : }
424 :
425 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|