|
1 /* |
|
2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: |
|
15 * |
|
16 */ |
|
17 |
|
18 #include <fbs.h> |
|
19 #include <QtCore> |
|
20 #include <qpixmap.h> |
|
21 #include <thumbnailmanager.h> |
|
22 #include <thumbnaildata.h> |
|
23 |
|
24 #include "thumbnailmanager_qt.h" |
|
25 #include "thumbnailmanager_p_qt.h" |
|
26 |
|
27 #include <e32base.h> |
|
28 |
|
29 const int ThumbnailMangerPriorityLowest = CActive::EPriorityIdle; |
|
30 const int ThumbnailMangerPriorityHighest = CActive::EPriorityHigh; |
|
31 |
|
32 ThumbnailManagerPrivate::ThumbnailManagerPrivate() : |
|
33 connectionCounterImage( 0 ), |
|
34 connectionCounterPixmap( 0 ), |
|
35 iThumbnailManager( NULL ), |
|
36 byteArray( NULL ) |
|
37 { |
|
38 TRAP_IGNORE( |
|
39 iThumbnailManager = CThumbnailManager::NewL( *this ); |
|
40 iThumbnailManager->SetDisplayModeL( EColor64K ); |
|
41 ); |
|
42 } |
|
43 |
|
44 ThumbnailManagerPrivate::~ThumbnailManagerPrivate() |
|
45 { |
|
46 if( iThumbnailManager ){ |
|
47 delete iThumbnailManager; |
|
48 } |
|
49 if( byteArray ){ |
|
50 delete byteArray; |
|
51 } |
|
52 } |
|
53 |
|
54 ThumbnailManager::QualityPreference ThumbnailManagerPrivate::qualityPreference() const |
|
55 { |
|
56 return static_cast<ThumbnailManager::QualityPreference>( iThumbnailManager->QualityPreference() ); |
|
57 } |
|
58 |
|
59 bool ThumbnailManagerPrivate::setQualityPreference( ThumbnailManager::QualityPreference qualityPreference ) |
|
60 { |
|
61 TRAPD( err, iThumbnailManager->SetQualityPreferenceL( static_cast<CThumbnailManager::TThumbnailQualityPreference>(qualityPreference) )); |
|
62 return ( err == KErrNone ); |
|
63 } |
|
64 |
|
65 QSize ThumbnailManagerPrivate::thumbnailSize() const |
|
66 { |
|
67 TSize tsize( iThumbnailManager->ThumbnailSize() ); |
|
68 QSize qsize( tsize.iWidth, tsize.iHeight); |
|
69 return qsize; |
|
70 } |
|
71 |
|
72 bool ThumbnailManagerPrivate::setThumbnailSize( const QSize& thumbnailSize ) |
|
73 { |
|
74 TRAPD( err, iThumbnailManager->SetThumbnailSizeL( TSize( thumbnailSize.width(), thumbnailSize.height() ) ) ); |
|
75 return ( err == KErrNone ); |
|
76 } |
|
77 |
|
78 bool ThumbnailManagerPrivate::setThumbnailSize( ThumbnailManager::ThumbnailSize thumbnailSize ) |
|
79 { |
|
80 TThumbnailSize size(EUnknownThumbnailSize); |
|
81 switch( thumbnailSize ){ |
|
82 case ThumbnailManager::ThumbnailSmall: |
|
83 size = EListThumbnailSize; |
|
84 break; |
|
85 case ThumbnailManager::ThumbnailMedium: |
|
86 size = EGridThumbnailSize; |
|
87 break; |
|
88 case ThumbnailManager::ThumbnailLarge: |
|
89 size = EFullScreenThumbnailSize; |
|
90 break; |
|
91 default: |
|
92 break; |
|
93 } |
|
94 |
|
95 TRAPD( err, iThumbnailManager->SetThumbnailSizeL( size ) ); |
|
96 return ( err == KErrNone ); |
|
97 } |
|
98 |
|
99 ThumbnailManager::ThumbnailMode ThumbnailManagerPrivate::mode() const |
|
100 { |
|
101 return static_cast<ThumbnailManager::ThumbnailMode>( iThumbnailManager->Flags() ); |
|
102 } |
|
103 |
|
104 bool ThumbnailManagerPrivate::setMode( ThumbnailManager::ThumbnailMode mode ) |
|
105 { |
|
106 TRAPD( err, iThumbnailManager->SetFlagsL( static_cast<CThumbnailManager::TThumbnailFlags>( mode ) ) ); |
|
107 return ( err == KErrNone ); |
|
108 } |
|
109 |
|
110 int ThumbnailManagerPrivate::getThumbnail( const QString& fileName, void* clientData, |
|
111 int priority ) |
|
112 { |
|
113 int result( -1 ); |
|
114 QString symbFileName( fileName ); |
|
115 |
|
116 priority = convertPriority(priority); |
|
117 |
|
118 if( symbFileName.contains( "/" ) ) |
|
119 symbFileName.replace( "/", "\\", Qt::CaseSensitive ); |
|
120 |
|
121 RBuf buf; |
|
122 TRAP_IGNORE( |
|
123 CleanupClosePushL( buf ); |
|
124 buf.CreateL( symbFileName.length() ); |
|
125 buf.Copy( symbFileName.utf16(), symbFileName.length() ); |
|
126 |
|
127 CThumbnailObjectSource* objSrc = CThumbnailObjectSource::NewLC( buf, KNullDesC ); |
|
128 result = iThumbnailManager->GetThumbnailL( *objSrc, clientData, priority ); |
|
129 CleanupStack::PopAndDestroy( 2, &buf ); |
|
130 ); |
|
131 return result; |
|
132 } |
|
133 |
|
134 int ThumbnailManagerPrivate::getThumbnail( unsigned long int aThumbnailId, void* clientData, |
|
135 int priority ) |
|
136 { |
|
137 int result( -1 ); |
|
138 |
|
139 priority = convertPriority(priority); |
|
140 |
|
141 TRAP_IGNORE( result = iThumbnailManager->GetThumbnailL( aThumbnailId, clientData, priority )); |
|
142 return result; |
|
143 } |
|
144 |
|
145 int ThumbnailManagerPrivate::setThumbnail( const QPixmap& source, const QString& fileName, |
|
146 void * clientData, int priority ) |
|
147 { |
|
148 int result( -1 ); |
|
149 RBuf file; |
|
150 _LIT( mime, "image/png" ); |
|
151 |
|
152 priority = convertPriority(priority); |
|
153 |
|
154 if( !byteArray ){ |
|
155 byteArray = new QByteArray(); |
|
156 } |
|
157 QBuffer buffer( byteArray ); |
|
158 buffer.open( QBuffer::ReadWrite ); |
|
159 QDataStream dataStream( &buffer ); |
|
160 |
|
161 dataStream << source; |
|
162 |
|
163 int offset = ( dataStream.version() >= 5 ? 4 : 0 ); |
|
164 |
|
165 TRAP_IGNORE( |
|
166 CleanupClosePushL( file ); |
|
167 file.CreateL( fileName.length() ); |
|
168 file.Copy( fileName.utf16(), fileName.length() ); |
|
169 |
|
170 HBufC* mimetype = HBufC::NewLC( 9 ); |
|
171 mimetype->Des() = mime(); |
|
172 |
|
173 TPtrC8* ptr = new TPtrC8( reinterpret_cast<const TUint8*>( byteArray->data() + offset ), byteArray->count() - offset ); |
|
174 |
|
175 CThumbnailObjectSource* objSrc = CThumbnailObjectSource::NewLC( ptr, *mimetype, file ); |
|
176 result = iThumbnailManager->SetThumbnailL( *objSrc, clientData, priority ); |
|
177 CleanupStack::PopAndDestroy( 3, &file ); |
|
178 ); |
|
179 return result; |
|
180 } |
|
181 |
|
182 int ThumbnailManagerPrivate::setThumbnail( const QImage& source, const QString& fileName, |
|
183 void * clientData, int priority ) |
|
184 { |
|
185 int result( -1 ); |
|
186 RBuf file; |
|
187 _LIT( mime, "image/png" ); |
|
188 |
|
189 priority = convertPriority(priority); |
|
190 |
|
191 if( !byteArray ){ |
|
192 byteArray = new QByteArray(); |
|
193 } |
|
194 QBuffer buffer( byteArray ); |
|
195 buffer.open( QBuffer::ReadWrite ); |
|
196 QDataStream dataStream( &buffer ); |
|
197 |
|
198 dataStream << source; |
|
199 |
|
200 int offset = ( dataStream.version() >= 5 ? 4 : 0 ); |
|
201 |
|
202 TRAP_IGNORE( |
|
203 CleanupClosePushL( file ); |
|
204 file.CreateL( fileName.length() ); |
|
205 file.Copy( fileName.utf16(), fileName.length() ); |
|
206 |
|
207 HBufC* mimetype = HBufC::NewLC( 9 ); |
|
208 mimetype->Des() = mime(); |
|
209 |
|
210 TPtrC8* ptr = new TPtrC8( reinterpret_cast<const TUint8*>( byteArray->data() + offset ), byteArray->count() - offset ); |
|
211 |
|
212 CThumbnailObjectSource* objSrc = CThumbnailObjectSource::NewLC( ptr, *mimetype, file ); |
|
213 result = iThumbnailManager->SetThumbnailL( *objSrc, clientData, priority ); |
|
214 CleanupStack::PopAndDestroy( 3, &file ); |
|
215 ); |
|
216 |
|
217 return result; |
|
218 } |
|
219 |
|
220 int ThumbnailManagerPrivate::setThumbnail( const QString& sourceFileName, const QString& targetFileName, |
|
221 const QString& mimeType, void * clientData, int priority ) |
|
222 { |
|
223 int result( -1 ); |
|
224 QString symbSourceFile( sourceFileName ); |
|
225 QString symbTargetFile( targetFileName ); |
|
226 RBuf sourceFile; |
|
227 RBuf targetFile; |
|
228 RBuf mime; |
|
229 |
|
230 priority = convertPriority(priority); |
|
231 |
|
232 if( symbSourceFile.contains( "/" ) ) |
|
233 symbSourceFile.replace( "/", "\\", Qt::CaseSensitive ); |
|
234 |
|
235 if( symbTargetFile.contains( "/" ) ) |
|
236 symbTargetFile.replace( "/", "\\", Qt::CaseSensitive ); |
|
237 |
|
238 TRAP_IGNORE( |
|
239 CleanupClosePushL( sourceFile ); |
|
240 sourceFile.CreateL( symbSourceFile.length() ); |
|
241 sourceFile.Copy( symbSourceFile.utf16(), symbSourceFile.length() ); |
|
242 |
|
243 CleanupClosePushL( targetFile ); |
|
244 targetFile.CreateL( symbTargetFile.length() ); |
|
245 targetFile.Copy( symbTargetFile.utf16(), symbTargetFile.length() ); |
|
246 |
|
247 CleanupClosePushL( mime ); |
|
248 |
|
249 if (mimeType.length()) |
|
250 { |
|
251 mime.CreateL( mimeType.length() ); |
|
252 mime.Copy( mimeType.utf16(), mimeType.length() ); |
|
253 } |
|
254 else |
|
255 { |
|
256 mime.Assign(KNullDesC().AllocL()); |
|
257 } |
|
258 |
|
259 CThumbnailObjectSource* objSrc = CThumbnailObjectSource::NewLC( sourceFile, targetFile, mime ); |
|
260 result = iThumbnailManager->SetThumbnailL( *objSrc, clientData, priority ); |
|
261 CleanupStack::PopAndDestroy( 4, &sourceFile ); |
|
262 ); |
|
263 |
|
264 return result; |
|
265 } |
|
266 |
|
267 void ThumbnailManagerPrivate::deleteThumbnails( const QString& fileName ) |
|
268 { |
|
269 QString symbFileName( fileName ); |
|
270 |
|
271 if( symbFileName.contains( "/" ) ) |
|
272 symbFileName.replace( "/", "\\", Qt::CaseSensitive ); |
|
273 |
|
274 RBuf buf; |
|
275 TRAP_IGNORE( CleanupClosePushL( buf ); |
|
276 buf.CreateL( symbFileName.length() ); |
|
277 buf.Copy( symbFileName.utf16(), symbFileName.length() ); |
|
278 CThumbnailObjectSource* objSrc = CThumbnailObjectSource::NewL( buf, KNullDesC ); |
|
279 iThumbnailManager->DeleteThumbnails( *objSrc ); |
|
280 CleanupStack::PopAndDestroy( &buf ); |
|
281 delete objSrc; |
|
282 ); |
|
283 } |
|
284 |
|
285 void ThumbnailManagerPrivate::deleteThumbnails( unsigned long int thumbnailId ) |
|
286 { |
|
287 iThumbnailManager->DeleteThumbnails( thumbnailId ); |
|
288 } |
|
289 |
|
290 bool ThumbnailManagerPrivate::cancelRequest( int id ) |
|
291 { |
|
292 return ( iThumbnailManager->CancelRequest( id ) == KErrNone ); |
|
293 } |
|
294 |
|
295 bool ThumbnailManagerPrivate::changePriority( int id, int newPriority ) |
|
296 { |
|
297 newPriority = convertPriority(newPriority); |
|
298 |
|
299 return ( iThumbnailManager->ChangePriority( id, newPriority ) == KErrNone ); |
|
300 } |
|
301 |
|
302 int ThumbnailManagerPrivate::convertPriority(int basePriority) |
|
303 { |
|
304 return qBound(ThumbnailMangerPriorityLowest, basePriority, ThumbnailMangerPriorityHighest); |
|
305 } |
|
306 |
|
307 void ThumbnailManagerPrivate::ThumbnailPreviewReady( MThumbnailData& /*aThumbnail*/, |
|
308 TThumbnailRequestId /*aId*/ ) |
|
309 { |
|
310 } |
|
311 |
|
312 void ThumbnailManagerPrivate::ThumbnailReady( TInt aError, MThumbnailData& aThumbnail, |
|
313 TThumbnailRequestId aId ) |
|
314 { |
|
315 if( byteArray ){ |
|
316 delete byteArray; |
|
317 byteArray = NULL; |
|
318 } |
|
319 |
|
320 if (connectionCounterImage || connectionCounterPixmap) { |
|
321 QPixmap pixmap; |
|
322 |
|
323 if (aError == KErrNone) { |
|
324 pixmap = QPixmap::fromSymbianCFbsBitmap(aThumbnail.Bitmap()); |
|
325 } else { |
|
326 pixmap = QPixmap(); |
|
327 } |
|
328 |
|
329 if (connectionCounterImage) { |
|
330 emit q_ptr->thumbnailReady(pixmap.toImage(), aThumbnail.ClientData(), aId, aError); |
|
331 } |
|
332 |
|
333 if (connectionCounterPixmap) { |
|
334 emit q_ptr->thumbnailReady(pixmap, aThumbnail.ClientData(), aId, aError); |
|
335 } |
|
336 } |
|
337 } |
|
338 |