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 <vector>
11 :
12 : #include <ucbhelper/contentidentifier.hxx>
13 : #include <ucbhelper/providerhelper.hxx>
14 :
15 : #include <com/sun/star/ucb/OpenMode.hpp>
16 :
17 : #include "cmis_datasupplier.hxx"
18 : #include "cmis_content.hxx"
19 : #include "cmis_provider.hxx"
20 :
21 : using namespace com::sun::star;
22 : using namespace std;
23 :
24 : namespace cmis
25 : {
26 :
27 : typedef std::vector< ResultListEntry* > ResultList;
28 :
29 0 : DataSupplier::DataSupplier( ChildrenProvider* pChildrenProvider, sal_Int32 nOpenMode )
30 0 : : m_pChildrenProvider( pChildrenProvider ), mnOpenMode(nOpenMode), mbCountFinal(false)
31 : {
32 0 : }
33 :
34 0 : bool DataSupplier::getData()
35 : {
36 0 : if ( mbCountFinal )
37 0 : return true;
38 :
39 0 : list< uno::Reference< ucb::XContent > > aChildren = m_pChildrenProvider->getChildren( );
40 :
41 : // Loop over the results and filter them
42 0 : for ( list< uno::Reference< ucb::XContent > >::iterator it = aChildren.begin();
43 0 : it != aChildren.end(); ++it )
44 : {
45 0 : OUString sContentType = ( *it )->getContentType( );
46 0 : bool bIsFolder = sContentType != CMIS_FILE_TYPE;
47 0 : if ( ( mnOpenMode == ucb::OpenMode::FOLDERS && bIsFolder ) ||
48 0 : ( mnOpenMode == ucb::OpenMode::DOCUMENTS && !bIsFolder ) ||
49 0 : ( mnOpenMode == ucb::OpenMode::ALL ) )
50 : {
51 0 : maResults.push_back( new ResultListEntry( *it ) );
52 : }
53 0 : }
54 0 : mbCountFinal = true;
55 :
56 0 : return true;
57 : }
58 :
59 0 : DataSupplier::~DataSupplier()
60 : {
61 0 : while ( maResults.size( ) > 0 )
62 : {
63 0 : ResultListEntry* back = maResults.back( );
64 0 : maResults.pop_back( );
65 0 : delete( back );
66 : }
67 0 : }
68 :
69 0 : OUString DataSupplier::queryContentIdentifierString( sal_uInt32 nIndex )
70 : {
71 0 : return queryContentIdentifier( nIndex )->getContentIdentifier( );
72 : }
73 :
74 0 : uno::Reference< ucb::XContentIdentifier > DataSupplier::queryContentIdentifier( sal_uInt32 nIndex )
75 : {
76 0 : return queryContent( nIndex )->getIdentifier( );
77 : }
78 :
79 0 : uno::Reference< ucb::XContent > DataSupplier::queryContent( sal_uInt32 nIndex )
80 : {
81 0 : if ( nIndex > maResults.size() )
82 0 : getData( );
83 :
84 0 : return maResults[ nIndex ]->xContent;
85 : }
86 :
87 0 : bool DataSupplier::getResult( sal_uInt32 nIndex )
88 : {
89 0 : if ( maResults.size() > nIndex ) // Result already present.
90 0 : return true;
91 :
92 0 : if ( getData() && maResults.size() > nIndex )
93 0 : return true;
94 :
95 0 : return false;
96 : }
97 :
98 0 : sal_uInt32 DataSupplier::totalCount()
99 : {
100 0 : getData();
101 0 : return maResults.size();
102 : }
103 :
104 0 : sal_uInt32 DataSupplier::currentCount()
105 : {
106 0 : return maResults.size();
107 : }
108 :
109 0 : bool DataSupplier::isCountFinal()
110 : {
111 0 : return mbCountFinal;
112 : }
113 :
114 0 : uno::Reference< sdbc::XRow > DataSupplier::queryPropertyValues( sal_uInt32 nIndex )
115 : {
116 0 : if ( nIndex < maResults.size() )
117 : {
118 0 : uno::Reference< sdbc::XRow > xRow = maResults[ nIndex ]->xRow;
119 0 : if ( xRow.is() )
120 : {
121 : // Already cached.
122 0 : return xRow;
123 0 : }
124 : }
125 :
126 0 : if ( getResult( nIndex ) )
127 : {
128 0 : uno::Reference< ucb::XContent > xContent( queryContent( nIndex ) );
129 0 : if ( xContent.is() )
130 : {
131 : try
132 : {
133 : uno::Reference< ucb::XCommandProcessor > xCmdProc(
134 0 : xContent, uno::UNO_QUERY_THROW );
135 0 : sal_Int32 nCmdId( xCmdProc->createCommandIdentifier() );
136 0 : ucb::Command aCmd;
137 0 : aCmd.Name = "getPropertyValues";
138 0 : aCmd.Handle = -1;
139 0 : aCmd.Argument <<= getResultSet()->getProperties();
140 0 : uno::Any aResult( xCmdProc->execute(
141 0 : aCmd, nCmdId, getResultSet()->getEnvironment() ) );
142 0 : uno::Reference< sdbc::XRow > xRow;
143 0 : if ( aResult >>= xRow )
144 : {
145 0 : maResults[ nIndex ]->xRow = xRow;
146 0 : return xRow;
147 0 : }
148 : }
149 0 : catch ( uno::Exception const & )
150 : {
151 : }
152 0 : }
153 : }
154 0 : return uno::Reference< sdbc::XRow >();
155 : }
156 :
157 0 : void DataSupplier::releasePropertyValues( sal_uInt32 nIndex )
158 : {
159 0 : if ( nIndex < maResults.size() )
160 0 : maResults[ nIndex ]->xRow = uno::Reference< sdbc::XRow >();
161 0 : }
162 :
163 0 : void DataSupplier::close()
164 : {
165 0 : }
166 :
167 0 : void DataSupplier::validate() throw( ucb::ResultSetException )
168 : {
169 0 : }
170 :
171 0 : }
172 :
173 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|