1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_UCB_SOURCE_SORTER_SORTRESULT_HXX
21 #define INCLUDED_UCB_SOURCE_SORTER_SORTRESULT_HXX
23 #include <com/sun/star/beans/XPropertySet.hpp>
24 #include <com/sun/star/lang/XComponent.hpp>
25 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
26 #include <com/sun/star/lang/XServiceInfo.hpp>
27 #include <com/sun/star/lang/XTypeProvider.hpp>
28 #include <com/sun/star/sdbc/XCloseable.hpp>
29 #include <com/sun/star/sdbc/XResultSet.hpp>
30 #include <com/sun/star/sdbc/XResultSetMetaData.hpp>
31 #include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
32 #include <com/sun/star/sdbc/XRow.hpp>
33 #include <com/sun/star/ucb/XContentAccess.hpp>
34 #include <com/sun/star/ucb/NumberedSortingInfo.hpp>
35 #include <com/sun/star/ucb/XAnyCompareFactory.hpp>
36 #include <com/sun/star/ucb/ListAction.hpp>
37 #include <cppuhelper/implbase8.hxx>
41 class OInterfaceContainerHelper
;
47 class SRSPropertySetInfo
;
48 class PropertyChangeListeners_Impl
;
53 std::deque
< SortListData
* > maData
;
57 ~SortedEntryList(){ Clear(); }
59 sal_uInt32
Count() const { return (sal_uInt32
) maData
.size(); }
62 void Insert( SortListData
*pEntry
, sal_IntPtr nPos
);
63 SortListData
* Remove( sal_IntPtr nPos
);
64 SortListData
* GetData( sal_IntPtr nPos
);
66 sal_IntPtr
operator [] ( sal_IntPtr nPos
) const;
73 std::deque
< css::ucb::ListAction
* > maData
;
77 ~EventList(){ Clear(); }
79 sal_uInt32
Count() { return (sal_uInt32
) maData
.size(); }
81 void AddEvent( sal_IntPtr nType
, sal_IntPtr nPos
, sal_IntPtr nCount
);
82 void Insert( css::ucb::ListAction
*pAction
) { maData
.push_back( pAction
); }
84 css::ucb::ListAction
* GetAction( sal_IntPtr nIndex
) { return maData
[ nIndex
]; }
91 std::deque
< void* > maData
;
95 ~SimpleList(){ Clear(); }
97 sal_uInt32
Count() { return (sal_uInt32
) maData
.size(); }
98 void Clear() { maData
.clear(); }
100 void Remove( sal_uInt32 nPos
);
101 void Remove( void* pData
);
103 void Append( void* pData
)
104 { maData
.push_back( pData
); }
105 void Insert( void* pData
, sal_uInt32 nPos
);
106 void* GetObject( sal_uInt32 nPos
) const;
107 void Replace( void* pData
, sal_uInt32 nPos
);
112 #define RESULTSET_SERVICE_NAME "com.sun.star.ucb.SortedResultSet"
116 class SortedResultSet
: public cppu::WeakImplHelper8
<
117 css::lang::XServiceInfo
,
118 css::lang::XComponent
,
119 css::ucb::XContentAccess
,
120 css::sdbc::XResultSet
,
122 css::sdbc::XCloseable
,
123 css::sdbc::XResultSetMetaDataSupplier
,
124 css::beans::XPropertySet
>
126 cppu::OInterfaceContainerHelper
*mpDisposeEventListeners
;
127 PropertyChangeListeners_Impl
*mpPropChangeListeners
;
128 PropertyChangeListeners_Impl
*mpVetoChangeListeners
;
130 css::uno::Reference
< css::sdbc::XResultSet
> mxOriginal
;
131 css::uno::Reference
< css::sdbc::XResultSet
> mxOther
;
133 SRSPropertySetInfo
* mpPropSetInfo
;
134 SortInfo
* mpSortInfo
;
136 SortedEntryList maS2O
; // maps the sorted entries to the original ones
137 SimpleList maO2S
; // maps the original Entries to the sorted ones
138 SimpleList maModList
; // keeps track of modified entries
139 sal_IntPtr mnLastSort
; // index of the last sorted entry;
140 sal_IntPtr mnCurEntry
; // index of the current entry
141 sal_IntPtr mnCount
; // total count of the elements
147 sal_IntPtr
FindPos( SortListData
*pEntry
, sal_IntPtr nStart
, sal_IntPtr nEnd
)
148 throw( css::sdbc::SQLException
, css::uno::RuntimeException
);
149 sal_IntPtr
Compare( SortListData
*pOne
,
151 throw( css::sdbc::SQLException
, css::uno::RuntimeException
);
152 void BuildSortInfo( css::uno::Reference
< css::sdbc::XResultSet
> aResult
,
153 const css::uno::Sequence
< css::ucb::NumberedSortingInfo
> &xSortInfo
,
154 const css::uno::Reference
< css::ucb::XAnyCompareFactory
> &xCompFac
);
155 static sal_IntPtr
CompareImpl( css::uno::Reference
< css::sdbc::XResultSet
> xResultOne
,
156 css::uno::Reference
< css::sdbc::XResultSet
> xResultTwo
,
157 sal_IntPtr nIndexOne
, sal_IntPtr nIndexTwo
,
158 SortInfo
* pSortInfo
)
159 throw( css::sdbc::SQLException
, css::uno::RuntimeException
);
160 sal_IntPtr
CompareImpl( css::uno::Reference
< css::sdbc::XResultSet
> xResultOne
,
161 css::uno::Reference
< css::sdbc::XResultSet
> xResultTwo
,
162 sal_IntPtr nIndexOne
, sal_IntPtr nIndexTwo
)
163 throw( css::sdbc::SQLException
, css::uno::RuntimeException
);
164 void PropertyChanged( const css::beans::PropertyChangeEvent
& rEvt
);
167 SortedResultSet( css::uno::Reference
< css::sdbc::XResultSet
> aResult
);
168 virtual ~SortedResultSet();
170 const SortedEntryList
& GetS2OList() const { return maS2O
; }
171 const SimpleList
& GetO2SList() const { return maO2S
; }
172 css::uno::Reference
< css::sdbc::XResultSet
> GetResultSet() const { return mxOriginal
; }
173 SortInfo
* GetSortInfo() const { return mpSortInfo
; }
174 sal_IntPtr
GetCount() const { return mnCount
; }
176 void CopyData( SortedResultSet
* pSource
);
177 void Initialize( const css::uno::Sequence
< css::ucb::NumberedSortingInfo
> &xSortInfo
,
178 const css::uno::Reference
< css::ucb::XAnyCompareFactory
> &xCompFac
);
179 void CheckProperties( sal_IntPtr nOldCount
, bool bWasFinal
);
181 void InsertNew( sal_IntPtr nPos
, sal_IntPtr nCount
);
182 void SetChanged( sal_IntPtr nPos
, sal_IntPtr nCount
);
183 void Remove( sal_IntPtr nPos
, sal_IntPtr nCount
, EventList
*pList
);
184 void Move( sal_IntPtr nPos
, sal_IntPtr nCount
, sal_IntPtr nOffset
);
186 void ResortModified( EventList
* pList
);
187 void ResortNew( EventList
* pList
);
190 virtual OUString SAL_CALL
getImplementationName()
191 throw( css::uno::RuntimeException
,
192 std::exception
) SAL_OVERRIDE
;
193 virtual sal_Bool SAL_CALL
supportsService( const OUString
& ServiceName
)
194 throw( css::uno::RuntimeException
,
195 std::exception
) SAL_OVERRIDE
;
196 virtual css::uno::Sequence
< OUString
> SAL_CALL
getSupportedServiceNames()
197 throw( css::uno::RuntimeException
,
198 std::exception
) SAL_OVERRIDE
;
200 static OUString
getImplementationName_Static();
201 static css::uno::Sequence
< OUString
> getSupportedServiceNames_Static();
204 virtual void SAL_CALL
205 dispose() throw( css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
207 virtual void SAL_CALL
208 addEventListener( const css::uno::Reference
< css::lang::XEventListener
>& Listener
)
209 throw( css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
211 virtual void SAL_CALL
212 removeEventListener( const css::uno::Reference
< css::lang::XEventListener
>& Listener
)
213 throw( css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
216 virtual OUString SAL_CALL
217 queryContentIdentifierString()
218 throw( css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
219 virtual css::uno::Reference
<
220 css::ucb::XContentIdentifier
> SAL_CALL
221 queryContentIdentifier()
222 throw( css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
223 virtual css::uno::Reference
<
224 css::ucb::XContent
> SAL_CALL
226 throw( css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
229 virtual sal_Bool SAL_CALL
231 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
232 virtual sal_Bool SAL_CALL
234 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
235 virtual sal_Bool SAL_CALL
237 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
238 virtual sal_Bool SAL_CALL
240 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
241 virtual sal_Bool SAL_CALL
243 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
244 virtual void SAL_CALL
246 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
247 virtual void SAL_CALL
249 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
250 virtual sal_Bool SAL_CALL
252 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
253 virtual sal_Bool SAL_CALL
255 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
256 virtual sal_Int32 SAL_CALL
258 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
259 virtual sal_Bool SAL_CALL
260 absolute( sal_Int32 row
)
261 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
262 virtual sal_Bool SAL_CALL
263 relative( sal_Int32 rows
)
264 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
265 virtual sal_Bool SAL_CALL
267 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
268 virtual void SAL_CALL
270 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
271 virtual sal_Bool SAL_CALL
273 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
274 virtual sal_Bool SAL_CALL
276 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
277 virtual sal_Bool SAL_CALL
279 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
280 virtual css::uno::Reference
<
281 css::uno::XInterface
> SAL_CALL
283 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
286 virtual sal_Bool SAL_CALL
287 wasNull() throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
289 virtual OUString SAL_CALL
290 getString( sal_Int32 columnIndex
)
291 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
293 virtual sal_Bool SAL_CALL
294 getBoolean( sal_Int32 columnIndex
)
295 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
297 virtual sal_Int8 SAL_CALL
298 getByte( sal_Int32 columnIndex
)
299 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
301 virtual sal_Int16 SAL_CALL
302 getShort( sal_Int32 columnIndex
)
303 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
305 virtual sal_Int32 SAL_CALL
306 getInt( sal_Int32 columnIndex
)
307 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
309 virtual sal_Int64 SAL_CALL
310 getLong( sal_Int32 columnIndex
)
311 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
313 virtual float SAL_CALL
314 getFloat( sal_Int32 columnIndex
)
315 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
317 virtual double SAL_CALL
318 getDouble( sal_Int32 columnIndex
)
319 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
321 virtual css::uno::Sequence
< sal_Int8
> SAL_CALL
322 getBytes( sal_Int32 columnIndex
)
323 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
325 virtual css::util::Date SAL_CALL
326 getDate( sal_Int32 columnIndex
)
327 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
329 virtual css::util::Time SAL_CALL
330 getTime( sal_Int32 columnIndex
)
331 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
333 virtual css::util::DateTime SAL_CALL
334 getTimestamp( sal_Int32 columnIndex
)
335 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
337 virtual css::uno::Reference
<
338 css::io::XInputStream
> SAL_CALL
339 getBinaryStream( sal_Int32 columnIndex
)
340 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
342 virtual css::uno::Reference
<
343 css::io::XInputStream
> SAL_CALL
344 getCharacterStream( sal_Int32 columnIndex
)
345 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
347 virtual css::uno::Any SAL_CALL
348 getObject( sal_Int32 columnIndex
,
349 const css::uno::Reference
<
350 css::container::XNameAccess
>& typeMap
)
351 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
352 virtual css::uno::Reference
<
353 css::sdbc::XRef
> SAL_CALL
354 getRef( sal_Int32 columnIndex
)
355 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
356 virtual css::uno::Reference
<
357 css::sdbc::XBlob
> SAL_CALL
358 getBlob( sal_Int32 columnIndex
)
359 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
360 virtual css::uno::Reference
<
361 css::sdbc::XClob
> SAL_CALL
362 getClob( sal_Int32 columnIndex
)
363 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
364 virtual css::uno::Reference
<
365 css::sdbc::XArray
> SAL_CALL
366 getArray( sal_Int32 columnIndex
)
367 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
370 virtual void SAL_CALL
372 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
374 // XResultSetMetaDataSupplier
375 virtual css::uno::Reference
< css::sdbc::XResultSetMetaData
> SAL_CALL
377 throw( css::sdbc::SQLException
, css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
381 virtual css::uno::Reference
<
382 css::beans::XPropertySetInfo
> SAL_CALL
384 throw( css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
386 virtual void SAL_CALL
387 setPropertyValue( const OUString
& PropertyName
,
388 const css::uno::Any
& Value
)
389 throw( css::beans::UnknownPropertyException
,
390 css::beans::PropertyVetoException
,
391 css::lang::IllegalArgumentException
,
392 css::lang::WrappedTargetException
,
393 css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
395 virtual css::uno::Any SAL_CALL
396 getPropertyValue( const OUString
& PropertyName
)
397 throw( css::beans::UnknownPropertyException
,
398 css::lang::WrappedTargetException
,
399 css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
401 virtual void SAL_CALL
402 addPropertyChangeListener( const OUString
& PropertyName
,
403 const css::uno::Reference
<
404 css::beans::XPropertyChangeListener
>& Listener
)
405 throw( css::beans::UnknownPropertyException
,
406 css::lang::WrappedTargetException
,
407 css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
409 virtual void SAL_CALL
410 removePropertyChangeListener( const OUString
& PropertyName
,
411 const css::uno::Reference
<
412 css::beans::XPropertyChangeListener
>& Listener
)
413 throw( css::beans::UnknownPropertyException
,
414 css::lang::WrappedTargetException
,
415 css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
417 virtual void SAL_CALL
418 addVetoableChangeListener( const OUString
& PropertyName
,
419 const css::uno::Reference
<
420 css::beans::XVetoableChangeListener
>& Listener
)
421 throw( css::beans::UnknownPropertyException
,
422 css::lang::WrappedTargetException
,
423 css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
425 virtual void SAL_CALL
426 removeVetoableChangeListener( const OUString
& PropertyName
,
427 const css::uno::Reference
<
428 css::beans::XVetoableChangeListener
>& aListener
)
429 throw( css::beans::UnknownPropertyException
,
430 css::lang::WrappedTargetException
,
431 css::uno::RuntimeException
, std::exception
) SAL_OVERRIDE
;
436 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */