1 /* |
|
2 * Copyright (c) 2006 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 the License "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: Database where to store scheduled events.* |
|
15 */ |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 // INCLUDE FILES |
|
21 #include "CCseScheduleDB.h" // Header file for this class |
|
22 #include <ipvideo/CCseScheduledProgram.h> // Represent one schedule in database |
|
23 #include <bautils.h> |
|
24 #include "CseDebug.h" // Debug macros |
|
25 #include <babackup.h> |
|
26 |
|
27 // EXTERNAL DATA STRUCTURES |
|
28 // None |
|
29 |
|
30 // EXTERNAL FUNCTION PROTOTYPES |
|
31 // None |
|
32 |
|
33 // CONSTANTS |
|
34 _LIT( KCseCDiskPrefix, "c:" ); |
|
35 _LIT( KCseSqlGetAll, "SELECT * FROM ScheduleEvent"); |
|
36 _LIT( KCseSelectFromDb, "SELECT * FROM " ); |
|
37 _LIT( KCseWhere, " WHERE " ); |
|
38 _LIT( KCseEqual, " = " ); |
|
39 _LIT( KCseOrderBy, " ORDER BY " ); |
|
40 _LIT( KCseAnd, " AND " ); |
|
41 _LIT( KCseLess, " < " ); |
|
42 _LIT( KCseMore, " > " ); |
|
43 |
|
44 static TUint KScheduleNameMaxLength = 255; |
|
45 static TUint KCseDatbaseVersionNumber = 1; |
|
46 |
|
47 // MACROS |
|
48 // None |
|
49 |
|
50 // LOCAL CONSTANTS AND MACROS |
|
51 // None |
|
52 |
|
53 // MODULE DATA STRUCTURES |
|
54 // None |
|
55 |
|
56 // LOCAL FUNCTION PROTOTYPES |
|
57 // None |
|
58 |
|
59 // FORWARD DECLARATIONS |
|
60 // None |
|
61 |
|
62 // ============================ MEMBER FUNCTIONS =============================== |
|
63 // --------------------------------------------------------------------------- |
|
64 // CCseScheduleDB::CCseScheduleDB() |
|
65 // |
|
66 // --------------------------------------------------------------------------- |
|
67 CCseScheduleDB::CCseScheduleDB() : iDbAccess( ECseDbOpen ) |
|
68 { |
|
69 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::CCseScheduleDB"); |
|
70 // Default C++ Constructor |
|
71 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::CCseScheduleDB"); |
|
72 } |
|
73 |
|
74 // --------------------------------------------------------------------------- |
|
75 // CCseScheduleDB::~CCseScheduleDB() |
|
76 // |
|
77 // --------------------------------------------------------------------------- |
|
78 CCseScheduleDB::~CCseScheduleDB() |
|
79 { |
|
80 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::~CCseScheduleDB"); |
|
81 |
|
82 iScheduleDb.Close(); |
|
83 delete iScheduleFileStore; |
|
84 iFsSession.Close(); |
|
85 |
|
86 if( iCompactTimer ) |
|
87 { |
|
88 iCompactTimer->Cancel(); |
|
89 delete iCompactTimer; |
|
90 } |
|
91 delete iBackupWrapper; |
|
92 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::~CCseScheduleDB"); |
|
93 } |
|
94 |
|
95 // --------------------------------------------------------------------------- |
|
96 // CCseScheduleDB::NewL() |
|
97 // |
|
98 // --------------------------------------------------------------------------- |
|
99 CCseScheduleDB* CCseScheduleDB::NewL() |
|
100 { |
|
101 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::NewL"); |
|
102 CCseScheduleDB* self = new ( ELeave ) CCseScheduleDB(); |
|
103 CleanupStack::PushL( self ); |
|
104 self->ConstructL(); |
|
105 CleanupStack::Pop( self ); |
|
106 |
|
107 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::NewL"); |
|
108 |
|
109 return self; |
|
110 } |
|
111 |
|
112 // --------------------------------------------------------------------------- |
|
113 // CCseScheduleDB::ConstructL() |
|
114 // |
|
115 // --------------------------------------------------------------------------- |
|
116 void CCseScheduleDB::ConstructL() |
|
117 { |
|
118 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::ConstructL"); |
|
119 |
|
120 User::LeaveIfError( iFsSession.Connect() ); |
|
121 |
|
122 iCompactTimer = CPeriodic::NewL( CActive::EPriorityStandard ); |
|
123 |
|
124 iBackupWrapper = CBaBackupSessionWrapper::NewL(); |
|
125 |
|
126 TRAPD( err, OpenOrCreateDbL() ); |
|
127 |
|
128 if ( err != KErrNone ) |
|
129 { |
|
130 CSELOGSTRING2_HIGH_LEVEL( "CCseScheduleDB::ConstructL - Opening or creating the database FAILED: %d", err ); |
|
131 |
|
132 if ( err != KErrNoMemory && |
|
133 err != KErrLocked && |
|
134 err != KErrDisMounted && |
|
135 err != KErrDiskFull && |
|
136 err != KErrNotReady ) |
|
137 { |
|
138 // Delete and recreate database file. Cannot recover other way. |
|
139 CSELOGSTRING_HIGH_LEVEL( "CCseScheduleDB::ConstructL - deleting database" ); |
|
140 RemoveDbL(); |
|
141 CSELOGSTRING_HIGH_LEVEL( "CCseScheduleDB::ConstructL - recreating database" ); |
|
142 TRAPD( err, OpenOrCreateDbL() ); |
|
143 if ( err != KErrNone ) |
|
144 { |
|
145 CSELOGSTRING2_HIGH_LEVEL( "CCseScheduleDB::ConstructL couldnt recreate database (%d), leaving", err ); |
|
146 User::Leave( err ); |
|
147 } |
|
148 } |
|
149 else |
|
150 { |
|
151 CSELOGSTRING2_HIGH_LEVEL( "CCseScheduleDB::ConstructL leaving (%d)", err ); |
|
152 User::Leave( err ); |
|
153 } |
|
154 } |
|
155 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::ConstructL"); |
|
156 } |
|
157 |
|
158 // --------------------------------------------------------------------------- |
|
159 // CCseScheduleDB::RemoveDbL() |
|
160 // --------------------------------------------------------------------------- |
|
161 void CCseScheduleDB::RemoveDbL() |
|
162 { |
|
163 delete iBackupWrapper; |
|
164 iBackupWrapper = NULL; |
|
165 iScheduleDb.Close(); |
|
166 delete iScheduleFileStore; |
|
167 iScheduleFileStore = NULL; |
|
168 if ( BaflUtils::FileExists( iFsSession, iDbFile ) ) |
|
169 { |
|
170 TInt err( iFsSession.Delete( iDbFile ) ); |
|
171 CSELOGSTRING2_HIGH_LEVEL("CCseScheduleDB:: deleting database file, err = %d", err); |
|
172 } |
|
173 } |
|
174 |
|
175 |
|
176 // --------------------------------------------------------------------------- |
|
177 // CCseScheduleDB::GetApplicationSchedulesL() |
|
178 // |
|
179 // --------------------------------------------------------------------------- |
|
180 void CCseScheduleDB::GetApplicationSchedulesL( const TInt32 aAppUid, |
|
181 RPointerArray<CCseScheduledProgram>& aArray ) |
|
182 { |
|
183 CSELOGSTRING2_HIGH_LEVEL(">>>CCseScheduleDB::GetApplicationSchedulesL - AppUid: %d", |
|
184 aAppUid); |
|
185 |
|
186 LeaveIfDbLockedL(); |
|
187 ResetCompactTimer(); |
|
188 |
|
189 // Gets program occurence(s) that are going to happen next |
|
190 // from database |
|
191 TBuf<KCseCustomSqlLength> sqlStatement; |
|
192 sqlStatement.Append( KCseSelectFromDb ); |
|
193 sqlStatement.Append( KCseScheduleTable ); |
|
194 sqlStatement.Append( KCseWhere ); |
|
195 sqlStatement.Append( KCseScheduleApplicationUIDCol ); |
|
196 sqlStatement.Append( KCseEqual ); |
|
197 sqlStatement.AppendNum( aAppUid ); |
|
198 sqlStatement.Append( KCseOrderBy ); |
|
199 sqlStatement.Append( KCseScheduleStartTimeCol ); |
|
200 |
|
201 // Order table based on start time |
|
202 RDbView view; |
|
203 CleanupClosePushL( view ); |
|
204 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
205 TDbQuery( sqlStatement ) ) ); |
|
206 User::LeaveIfError( view.EvaluateAll() ); |
|
207 |
|
208 view.FirstL(); |
|
209 |
|
210 CDbColSet* colSetOrder = view.ColSetL(); |
|
211 CleanupStack::PushL( colSetOrder ); |
|
212 |
|
213 // Get the SQL table indexes. |
|
214 TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol ); |
|
215 TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol ); |
|
216 TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol ); |
|
217 TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol ); |
|
218 TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol ); |
|
219 TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol ); |
|
220 TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol ); |
|
221 TDbColNo scheduleTypeIndex = colSetOrder->ColNo( KCseScheduleTypeCol ); |
|
222 TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol ); |
|
223 |
|
224 CleanupStack::PopAndDestroy( colSetOrder ); |
|
225 |
|
226 // Loop through the tables |
|
227 while ( view.AtRow() ) |
|
228 { |
|
229 // Create new CCseSceduledProgram to be added to array |
|
230 CCseScheduledProgram* prog = CCseScheduledProgram::NewL(); |
|
231 CleanupStack::PushL( prog ); |
|
232 |
|
233 // Fill created schedule with DB information |
|
234 view.GetL(); |
|
235 prog->SetDbIdentifier( view.ColUint32( keyIndex ) ); |
|
236 prog->SetName( view.ColDes8( nameIndex ) ); |
|
237 prog->SetStartTime( view.ColTime( startTimeIndex ) ); |
|
238 prog->SetEndTime( view.ColTime( endTimeIndex ) ); |
|
239 prog->SetAppUid( view.ColInt32( applicationUidIdIndex ) ); |
|
240 prog->SetPluginUid( view.ColInt32( plugInUidIndex ) ); |
|
241 prog->SetScheduleType( view.ColInt32( scheduleTypeIndex ) ); |
|
242 prog->SetPluginType( view.ColInt32( pluginTypeIndex ) ); |
|
243 |
|
244 TInt streamLen( 0 ); |
|
245 streamLen = view.ColLength( applicationSpecificIndex ); |
|
246 |
|
247 HBufC8* appDataBuffer = HBufC8::NewL( streamLen ); |
|
248 |
|
249 CleanupStack::PushL( appDataBuffer ); |
|
250 |
|
251 TPtr8 buffPtr( appDataBuffer->Des() ); |
|
252 RDbColReadStream readStream; |
|
253 readStream.OpenLC( view, applicationSpecificIndex ); |
|
254 readStream.ReadL( buffPtr, streamLen ); |
|
255 readStream.Release(); |
|
256 CleanupStack::PopAndDestroy(); // readStream |
|
257 |
|
258 prog->SetApplicationDataL( *appDataBuffer ); |
|
259 |
|
260 CleanupStack::PopAndDestroy( appDataBuffer ); |
|
261 User::LeaveIfError( aArray.Append( prog ) ); |
|
262 CleanupStack::Pop( prog ); |
|
263 view.NextL(); |
|
264 } |
|
265 |
|
266 CleanupStack::PopAndDestroy( &view ); // Closes view |
|
267 |
|
268 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetApplicationSchedulesL"); |
|
269 } |
|
270 |
|
271 // --------------------------------------------------------------------------- |
|
272 // CCseScheduleDB::OpenOrCreateDbL() |
|
273 // |
|
274 // Create a new database. |
|
275 // --------------------------------------------------------------------------- |
|
276 void CCseScheduleDB::OpenOrCreateDbL() |
|
277 { |
|
278 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::OpenOrCreateDbL"); |
|
279 TBuf<KMaxFileName> path; |
|
280 |
|
281 // Get path to CSE's private directory |
|
282 TInt err( iFsSession.PrivatePath( path ) ); |
|
283 if ( err != KErrNone ) |
|
284 { |
|
285 CSELOGSTRING2_HIGH_LEVEL("iFsSession.PrivatePath() failed: %d", err ); |
|
286 User::Leave( err ); |
|
287 } |
|
288 |
|
289 iDbFile.Zero(); |
|
290 iDbFile.Append( KCseCDiskPrefix ); |
|
291 iDbFile.Append( path ); |
|
292 if ( BaflUtils::CheckFolder( iFsSession, iDbFile ) != KErrNone ) |
|
293 { |
|
294 err = iFsSession.CreatePrivatePath( EDriveC ); |
|
295 if ( err != KErrNone ) |
|
296 { |
|
297 CSELOGSTRING2_HIGH_LEVEL( "CreatePrivatePath failed! %d", err ); |
|
298 User::Leave( err ); |
|
299 } |
|
300 } |
|
301 |
|
302 iDbFile.Append( KCseScheduleDBName() ); |
|
303 |
|
304 // If file doesn't exist create it |
|
305 if ( !BaflUtils::FileExists( iFsSession, iDbFile ) ) |
|
306 { |
|
307 CSELOGSTRING_HIGH_LEVEL("CCseScheduleDB::OpenOrCreateDbL Create New"); |
|
308 iScheduleDb.Close(); |
|
309 |
|
310 if( iScheduleFileStore ) |
|
311 { |
|
312 delete iScheduleFileStore; |
|
313 iScheduleFileStore = NULL; |
|
314 } |
|
315 |
|
316 iScheduleFileStore = CPermanentFileStore::ReplaceL( iFsSession, |
|
317 iDbFile, |
|
318 EFileRead|EFileWrite ); |
|
319 // Set file store type |
|
320 iScheduleFileStore->SetTypeL( iScheduleFileStore->Layout() ); |
|
321 // Create stream object |
|
322 TStreamId id = iScheduleDb.CreateL( iScheduleFileStore ); |
|
323 // Keep database id as root of store |
|
324 iScheduleFileStore->SetRootL( id ); |
|
325 // Complete creation by commiting |
|
326 iScheduleFileStore->CommitL(); |
|
327 |
|
328 CreateDatabaseTableL( iScheduleDb ); |
|
329 CreateScheduleTableL( iScheduleDb ); |
|
330 SetDatabaseVersionL( ); |
|
331 } |
|
332 // Or if it exists then just open it. |
|
333 else |
|
334 { |
|
335 iScheduleDb.Close(); |
|
336 delete iScheduleFileStore; |
|
337 iScheduleFileStore = NULL; |
|
338 iScheduleFileStore = CPermanentFileStore::OpenL( iFsSession, iDbFile, |
|
339 EFileRead|EFileWrite ); |
|
340 iScheduleFileStore->SetTypeL( iScheduleFileStore->Layout() ); |
|
341 iScheduleDb.OpenL( iScheduleFileStore, iScheduleFileStore->Root() ); |
|
342 CheckDbVersionL(); |
|
343 User::LeaveIfError( iScheduleDb.Compact() ); |
|
344 } |
|
345 |
|
346 if ( !iBackupWrapper ) |
|
347 { |
|
348 iBackupWrapper = CBaBackupSessionWrapper::NewL(); |
|
349 } |
|
350 |
|
351 iBackupWrapper->RegisterFileL( iDbFile, *this ); |
|
352 |
|
353 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::OpenOrCreateDbL"); |
|
354 } |
|
355 |
|
356 // --------------------------------------------------------------------------- |
|
357 // CCseScheduleDB::CheckDbVersionL |
|
358 // |
|
359 // --------------------------------------------------------------------------- |
|
360 void CCseScheduleDB::CheckDbVersionL( ) |
|
361 { |
|
362 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::CheckDbVersionL"); |
|
363 |
|
364 TInt dbVersion( 0 ); |
|
365 |
|
366 TRAPD( leave, dbVersion = GetDbVersionL() ); |
|
367 |
|
368 if ( dbVersion != KCseDatbaseVersionNumber || leave != KErrNone ) |
|
369 { |
|
370 CSELOGSTRING3_HIGH_LEVEL( |
|
371 "CCseScheduleDB::CheckDbVersionL Not ok, version: %d, error: %d", |
|
372 dbVersion, leave ); |
|
373 |
|
374 // Destroy the old one |
|
375 iScheduleDb.Close(); |
|
376 delete iScheduleFileStore; |
|
377 iScheduleFileStore = NULL; |
|
378 |
|
379 // Create new one |
|
380 iScheduleFileStore = CPermanentFileStore::ReplaceL( iFsSession, |
|
381 iDbFile, |
|
382 EFileRead|EFileWrite ); |
|
383 |
|
384 // Set file store type |
|
385 iScheduleFileStore->SetTypeL( iScheduleFileStore->Layout() ); |
|
386 // Create stream object |
|
387 TStreamId id = iScheduleDb.CreateL( iScheduleFileStore ); |
|
388 // Keep database id as root of store |
|
389 iScheduleFileStore->SetRootL( id ); |
|
390 // Complete creation by commiting |
|
391 iScheduleFileStore->CommitL(); |
|
392 |
|
393 CreateDatabaseTableL( iScheduleDb ); |
|
394 CreateScheduleTableL( iScheduleDb ); |
|
395 SetDatabaseVersionL( ); |
|
396 } |
|
397 |
|
398 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::CheckDbVersionL"); |
|
399 } |
|
400 |
|
401 // --------------------------------------------------------------------------- |
|
402 // CCseScheduleDB::GetDbVersionL |
|
403 // |
|
404 // --------------------------------------------------------------------------- |
|
405 TInt CCseScheduleDB::GetDbVersionL( ) |
|
406 { |
|
407 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetDbVersionL"); |
|
408 LeaveIfDbLockedL(); |
|
409 ResetCompactTimer(); |
|
410 TInt dbVersion(0); |
|
411 |
|
412 TBuf<KCseCustomSqlLength> sqlStatement; |
|
413 sqlStatement.Append( KCseSelectFromDb ); |
|
414 sqlStatement.Append( KCseDatabaseTable ); |
|
415 |
|
416 // Order table based on start time |
|
417 RDbView view; |
|
418 CleanupClosePushL( view ); |
|
419 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
420 TDbQuery( sqlStatement ) ) ); |
|
421 User::LeaveIfError( view.EvaluateAll() ); |
|
422 |
|
423 // Get the next reminder |
|
424 view.FirstL(); |
|
425 |
|
426 CDbColSet* colSetOrder = view.ColSetL(); |
|
427 CleanupStack::PushL( colSetOrder ); |
|
428 |
|
429 TDbColNo versionIndex = colSetOrder->ColNo( KCseDatabaseVersionCol ); |
|
430 |
|
431 CleanupStack::PopAndDestroy( colSetOrder ); |
|
432 |
|
433 if ( view.AtRow() ) |
|
434 { |
|
435 view.GetL(); |
|
436 dbVersion = view.ColInt32( versionIndex ); |
|
437 } |
|
438 CleanupStack::PopAndDestroy( &view ); // Closes view |
|
439 |
|
440 CSELOGSTRING2_HIGH_LEVEL( |
|
441 "<<<CCseScheduleDB::GetDbVersionL, version: %d", |
|
442 dbVersion ); |
|
443 return dbVersion; |
|
444 } |
|
445 |
|
446 // --------------------------------------------------------------------------- |
|
447 // CCseScheduleDB::CreateScheduleTableL |
|
448 // |
|
449 // Creates Schedule table. |
|
450 // --------------------------------------------------------------------------- |
|
451 void CCseScheduleDB::CreateScheduleTableL( RDbStoreDatabase& aDatabase ) const |
|
452 { |
|
453 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::CreateScheduleTableL"); |
|
454 |
|
455 // Create columns for the database. |
|
456 TDbCol keyCol( KCseScheduleDbKeyCol, EDbColUint32 ); |
|
457 keyCol.iAttributes = TDbCol::EAutoIncrement; |
|
458 |
|
459 TDbCol nameCol( KCseScheduleNameCol, EDbColText8, KScheduleNameMaxLength ); |
|
460 TDbCol startTimeCol( KCseScheduleStartTimeCol, EDbColDateTime ); |
|
461 TDbCol endTimeCol( KCseScheduleEndTimeCol, EDbColDateTime ); |
|
462 TDbCol applicationUidCol( KCseScheduleApplicationUIDCol, EDbColInt32 ); |
|
463 TDbCol plugInUidCol( KCseSchedulePlugInUIDCol, EDbColInt32 ); |
|
464 TDbCol typeCol( KCseScheduleTypeCol, EDbColInt32 ); |
|
465 TDbCol applicationSpecificCol( KCseScheduleApplicationSpecificCol, EDbColLongBinary ); |
|
466 TDbCol runCountCol( KCseScheduleRunCountCol, EDbColInt32 ); |
|
467 TDbCol stateCol( KCseScheduleStateCol, EDbColInt32 ); |
|
468 TDbCol pluginTypeCol( KCseSchedulePluginTypeCol, EDbColInt32 ); |
|
469 TDbCol reserved1Col( KCseScheduleReserved1Col, EDbColInt32 ); |
|
470 TDbCol reserved2Col( KCseScheduleReserved2Col, EDbColInt32 ); |
|
471 |
|
472 // Create column set and add defined columns in to the set |
|
473 CDbColSet* scheduleColSet = CDbColSet::NewLC(); |
|
474 scheduleColSet->AddL( keyCol ); |
|
475 scheduleColSet->AddL( nameCol ); |
|
476 scheduleColSet->AddL( startTimeCol ); |
|
477 scheduleColSet->AddL( endTimeCol ); |
|
478 scheduleColSet->AddL( applicationUidCol ); |
|
479 scheduleColSet->AddL( plugInUidCol ); |
|
480 scheduleColSet->AddL( typeCol ); |
|
481 scheduleColSet->AddL( applicationSpecificCol ); |
|
482 scheduleColSet->AddL( runCountCol ); |
|
483 scheduleColSet->AddL( stateCol ); |
|
484 scheduleColSet->AddL( pluginTypeCol ); |
|
485 scheduleColSet->AddL( reserved1Col ); |
|
486 scheduleColSet->AddL( reserved2Col ); |
|
487 |
|
488 // Create new table to the database with created columnset |
|
489 User::LeaveIfError( aDatabase.CreateTable( KCseScheduleTable, |
|
490 *scheduleColSet ) ); |
|
491 |
|
492 CleanupStack::PopAndDestroy( scheduleColSet ); |
|
493 |
|
494 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::CreateScheduleTableL"); |
|
495 } |
|
496 |
|
497 // --------------------------------------------------------------------------- |
|
498 // CCseScheduleDB::CreateDatabaseTableL |
|
499 // |
|
500 // Creates Database table. |
|
501 // --------------------------------------------------------------------------- |
|
502 void CCseScheduleDB::CreateDatabaseTableL( RDbStoreDatabase& aDatabase ) |
|
503 { |
|
504 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::CreateDatabaseTableL"); |
|
505 |
|
506 // Create columns for the database. |
|
507 TDbCol versionCol( KCseDatabaseVersionCol, EDbColInt32 ); |
|
508 TDbCol reserved1Col( KCseDatabaseReserved1Col, EDbColInt32 ); |
|
509 TDbCol reserved2Col( KCseDatabaseReserved2Col, EDbColInt32 ); |
|
510 |
|
511 // Create column set and add defined columns in to the set |
|
512 CDbColSet* databaseColSet = CDbColSet::NewLC(); |
|
513 databaseColSet->AddL( versionCol ); |
|
514 databaseColSet->AddL( reserved1Col ); |
|
515 databaseColSet->AddL( reserved2Col ); |
|
516 |
|
517 // Create new table to the database with created columnset |
|
518 User::LeaveIfError( aDatabase.CreateTable( KCseDatabaseTable, |
|
519 *databaseColSet ) ); |
|
520 |
|
521 CleanupStack::PopAndDestroy( databaseColSet ); |
|
522 |
|
523 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::CreateDatabaseTableL"); |
|
524 } |
|
525 |
|
526 // --------------------------------------------------------------------------- |
|
527 // CCseScheduleDB::SetDatabaseVersionL |
|
528 // |
|
529 // Creates Database table. |
|
530 // --------------------------------------------------------------------------- |
|
531 void CCseScheduleDB::SetDatabaseVersionL( ) |
|
532 { |
|
533 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::SetDatabaseVersionL"); |
|
534 |
|
535 iSqlSchedule.Zero(); |
|
536 iSqlSchedule.Append( KCseSelectFromDb ); |
|
537 iSqlSchedule.Append( KCseDatabaseTable ); |
|
538 |
|
539 RDbView view; |
|
540 CleanupClosePushL( view ); |
|
541 |
|
542 // Prepare DB for update |
|
543 User::LeaveIfError(view.Prepare( iScheduleDb, |
|
544 TDbQuery( iSqlSchedule ), |
|
545 TDbWindow::EUnlimited, |
|
546 RDbView::EInsertOnly )); |
|
547 view.InsertL(); |
|
548 |
|
549 // Create colomn set (row) to be added |
|
550 CDbColSet* databaseColSet = view.ColSetL(); |
|
551 CleanupStack::PushL( databaseColSet ); |
|
552 |
|
553 // Fill row with Schedule information |
|
554 view.SetColL( databaseColSet->ColNo( KCseDatabaseVersionCol ), |
|
555 KCseDatbaseVersionNumber ); |
|
556 CleanupStack::PopAndDestroy( databaseColSet ); |
|
557 view.PutL(); |
|
558 CleanupStack::PopAndDestroy( &view ); // closes view |
|
559 |
|
560 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::SetDatabaseVersionL"); |
|
561 } |
|
562 |
|
563 // --------------------------------------------------------------------------- |
|
564 // CCseScheduleDB::AddScheduleL() |
|
565 // |
|
566 // --------------------------------------------------------------------------- |
|
567 void CCseScheduleDB::AddScheduleL( CCseScheduledProgram& aData ) |
|
568 { |
|
569 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::AddScheduleL"); |
|
570 LeaveIfDbLockedL(); |
|
571 ResetCompactTimer(); |
|
572 |
|
573 iSqlSchedule.Zero(); |
|
574 iSqlSchedule.Append( KCseSqlGetAll ); |
|
575 RDbView view; |
|
576 CleanupClosePushL( view ); |
|
577 |
|
578 // Prepare DB for update |
|
579 User::LeaveIfError(view.Prepare( iScheduleDb, |
|
580 TDbQuery( iSqlSchedule ), |
|
581 TDbWindow::EUnlimited, |
|
582 RDbView::EInsertOnly )); |
|
583 view.InsertL(); |
|
584 |
|
585 // Create colomn set (row) to be added |
|
586 CDbColSet* scheduleColSet = view.ColSetL(); |
|
587 CleanupStack::PushL( scheduleColSet ); |
|
588 |
|
589 // Fill row with Schedule information |
|
590 view.SetColL( scheduleColSet->ColNo( KCseScheduleNameCol ), |
|
591 aData.Name() ); |
|
592 |
|
593 view.SetColL( scheduleColSet->ColNo( KCseScheduleStartTimeCol ), |
|
594 aData.StartTime() ); |
|
595 |
|
596 view.SetColL( scheduleColSet->ColNo( KCseScheduleEndTimeCol ), |
|
597 aData.EndTime() ); |
|
598 |
|
599 view.SetColL( scheduleColSet->ColNo( KCseScheduleApplicationUIDCol ), |
|
600 aData.AppUid() ); |
|
601 |
|
602 view.SetColL( scheduleColSet->ColNo( KCseSchedulePlugInUIDCol ), |
|
603 aData.PluginUid() ); |
|
604 |
|
605 view.SetColL( scheduleColSet->ColNo( KCseScheduleTypeCol ), |
|
606 aData.ScheduleType() ); |
|
607 |
|
608 view.SetColL( scheduleColSet->ColNo( KCseScheduleRunCountCol ), |
|
609 0 ); |
|
610 |
|
611 view.SetColL( scheduleColSet->ColNo( KCseScheduleStateCol ), |
|
612 ECseWaiting ); |
|
613 |
|
614 view.SetColL( scheduleColSet->ColNo( KCseSchedulePluginTypeCol ), |
|
615 aData.PluginType() ); |
|
616 |
|
617 // Description is long one, it needs to be handled by stream |
|
618 RDbColWriteStream write; |
|
619 write.OpenLC( view, scheduleColSet->ColNo( KCseScheduleApplicationSpecificCol ) ); |
|
620 write.WriteL( aData.ApplicationData() ); |
|
621 write.CommitL(); |
|
622 CleanupStack::PopAndDestroy(); // write |
|
623 |
|
624 TDbColNo keyColumnNo = scheduleColSet->ColNo( KCseScheduleDbKeyCol ); |
|
625 CleanupStack::PopAndDestroy( scheduleColSet ); |
|
626 view.PutL(); |
|
627 |
|
628 // Get new program key |
|
629 aData.SetDbIdentifier( view.ColUint32( keyColumnNo ) ); |
|
630 |
|
631 CleanupStack::PopAndDestroy( &view ); // closes view |
|
632 |
|
633 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::AddScheduleL"); |
|
634 } |
|
635 |
|
636 // --------------------------------------------------------------------------- |
|
637 // CCseScheduleDB::RemoveScheduleL() |
|
638 // |
|
639 // --------------------------------------------------------------------------- |
|
640 void CCseScheduleDB::RemoveScheduleL( const TUint32 aDbIdentifier ) |
|
641 { |
|
642 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::RemoveScheduleL"); |
|
643 LeaveIfDbLockedL(); |
|
644 ResetCompactTimer(); |
|
645 |
|
646 // Create SQL string to find given schedule from DB |
|
647 TBuf<KCseCustomSqlLength> sqlStatement; |
|
648 sqlStatement.Append( KCseSelectFromDb ); |
|
649 sqlStatement.Append( KCseScheduleTable ); |
|
650 sqlStatement.Append( KCseWhere ); |
|
651 sqlStatement.Append( KCseScheduleDbKeyCol ); |
|
652 sqlStatement.Append( KCseEqual ); |
|
653 sqlStatement.AppendNum( aDbIdentifier ); |
|
654 |
|
655 User::LeaveIfError( iScheduleDb.Begin() ); |
|
656 |
|
657 // Prepare DB to update |
|
658 RDbView view; |
|
659 CleanupClosePushL( view ); |
|
660 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
661 TDbQuery( sqlStatement ) ) ); |
|
662 User::LeaveIfError( view.EvaluateAll() ); |
|
663 |
|
664 view.FirstL(); |
|
665 |
|
666 TInt count( 0 ); |
|
667 |
|
668 // If schedule found, remove it. |
|
669 while ( view.AtRow() ) |
|
670 { |
|
671 view.DeleteL(); |
|
672 count++; |
|
673 view.NextL(); |
|
674 } |
|
675 |
|
676 CleanupStack::PopAndDestroy( &view ); // closes view |
|
677 User::LeaveIfError( iScheduleDb.Commit() ); |
|
678 |
|
679 CSELOGSTRING3_HIGH_LEVEL("---- %d Items for identifier %d removed from DB", count, aDbIdentifier); |
|
680 if ( count == 0 ) |
|
681 { |
|
682 User::Leave( KErrNotFound ); |
|
683 } |
|
684 |
|
685 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::RemoveScheduleL"); |
|
686 } |
|
687 |
|
688 // --------------------------------------------------------------------------- |
|
689 // CCseScheduleDB::GetNextScheduleTimeL() |
|
690 // |
|
691 // --------------------------------------------------------------------------- |
|
692 TTime CCseScheduleDB::GetNextScheduleTimeL() |
|
693 { |
|
694 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetNextScheduleTimeL"); |
|
695 LeaveIfDbLockedL(); |
|
696 ResetCompactTimer(); |
|
697 |
|
698 // Create SQL satring to get schedule occurence(s) that are |
|
699 // going to happen next from database. |
|
700 TTime nextScheduleTime( 0 ); |
|
701 TBuf<KCseCustomSqlLength> sqlStatement; |
|
702 sqlStatement.Append( KCseSelectFromDb ); |
|
703 sqlStatement.Append( KCseScheduleTable ); |
|
704 sqlStatement.Append( KCseWhere ); |
|
705 sqlStatement.Append( KCseScheduleStateCol ); |
|
706 sqlStatement.Append( KCseEqual ); |
|
707 sqlStatement.AppendNum( ECseWaiting ); |
|
708 sqlStatement.Append( KCseOrderBy ); |
|
709 sqlStatement.Append( KCseScheduleStartTimeCol ); |
|
710 |
|
711 // Order table based on start time |
|
712 RDbView view; |
|
713 CleanupClosePushL( view ); |
|
714 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
715 TDbQuery( sqlStatement ) ) ); |
|
716 User::LeaveIfError( view.EvaluateAll() ); |
|
717 |
|
718 // Get the next schedule |
|
719 view.FirstL(); |
|
720 |
|
721 CDbColSet* colSetOrder = view.ColSetL(); |
|
722 CleanupStack::PushL( colSetOrder ); |
|
723 |
|
724 TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol ); |
|
725 |
|
726 CleanupStack::PopAndDestroy( colSetOrder ); |
|
727 |
|
728 // Schedule found get its start time. |
|
729 if ( view.AtRow() ) |
|
730 { |
|
731 view.GetL(); |
|
732 nextScheduleTime = view.ColTime( startTimeIndex ); |
|
733 } |
|
734 |
|
735 CleanupStack::PopAndDestroy( &view ); // Closes view |
|
736 |
|
737 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetNextScheduleTimeL"); |
|
738 |
|
739 return nextScheduleTime; |
|
740 } |
|
741 |
|
742 |
|
743 |
|
744 // --------------------------------------------------------------------------- |
|
745 // CCseScheduleDB::FillScheduleArrayByTimeL() |
|
746 // |
|
747 // --------------------------------------------------------------------------- |
|
748 void CCseScheduleDB::FillScheduleArrayByTimeL( const TTime& aScheduleTime, |
|
749 RPointerArray<CCseScheduledProgram>& aNextScheduleArray ) |
|
750 { |
|
751 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::FillScheduleArrayByTimeL"); |
|
752 LeaveIfDbLockedL(); |
|
753 ResetCompactTimer(); |
|
754 |
|
755 // Gets program occurence(s) that are going to happen next |
|
756 // from database |
|
757 TBuf<100> startTimeBuf; |
|
758 |
|
759 _LIT( KDateTimeFormat,"# %1%*D/%2%*M/%3%*Y %H:%T:%S.%C#" ); |
|
760 |
|
761 aScheduleTime.FormatL( startTimeBuf, KDateTimeFormat ); |
|
762 |
|
763 // Create SQL string to get all schedules to be happen at given time |
|
764 TBuf<KCseCustomSqlLength> sqlStatement; |
|
765 sqlStatement.Append( KCseSelectFromDb ); |
|
766 sqlStatement.Append( KCseScheduleTable ); |
|
767 sqlStatement.Append( KCseWhere ); |
|
768 sqlStatement.Append( KCseScheduleStartTimeCol ); |
|
769 sqlStatement.Append( KCseEqual ); |
|
770 sqlStatement.Append( startTimeBuf ); |
|
771 |
|
772 // Order table based on start time |
|
773 RDbView view; |
|
774 CleanupClosePushL( view ); |
|
775 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
776 TDbQuery( sqlStatement ) ) ); |
|
777 User::LeaveIfError( view.EvaluateAll() ); |
|
778 |
|
779 // Get the next reminder |
|
780 view.FirstL(); |
|
781 |
|
782 CDbColSet* colSetOrder = view.ColSetL(); |
|
783 CleanupStack::PushL( colSetOrder ); |
|
784 |
|
785 // Get column indexes |
|
786 TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol ); |
|
787 TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol ); |
|
788 TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol ); |
|
789 TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol ); |
|
790 TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol ); |
|
791 TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol ); |
|
792 TDbColNo typeIndex = colSetOrder->ColNo( KCseScheduleTypeCol ); |
|
793 TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol ); |
|
794 TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol ); |
|
795 |
|
796 CleanupStack::PopAndDestroy( colSetOrder ); |
|
797 |
|
798 // Loop through all found schedules. |
|
799 while ( view.AtRow() ) |
|
800 { |
|
801 // Create new schedule to be added to array |
|
802 CCseScheduledProgram* prog = CCseScheduledProgram::NewL(); |
|
803 CleanupStack::PushL( prog ); |
|
804 view.GetL(); |
|
805 |
|
806 // Copy information from DB to schedule. |
|
807 prog->SetDbIdentifier( view.ColUint32( keyIndex ) ); |
|
808 prog->SetName( view.ColDes8( nameIndex ) ); |
|
809 prog->SetStartTime( view.ColTime( startTimeIndex ) ); |
|
810 prog->SetEndTime( view.ColTime( endTimeIndex ) ); |
|
811 prog->SetAppUid( view.ColInt32( applicationUidIdIndex ) ); |
|
812 prog->SetPluginUid( view.ColInt32( plugInUidIndex ) ); |
|
813 prog->SetScheduleType( CCseScheduledProgram::TCseScheduleType( |
|
814 view.ColInt32( typeIndex ) ) ); |
|
815 prog->SetPluginType( CCseScheduledProgram::TCsePluginType( |
|
816 view.ColInt32( pluginTypeIndex ) ) ); |
|
817 TInt streamLen( view.ColLength( applicationSpecificIndex ) ); |
|
818 |
|
819 HBufC8* appDataBuffer = HBufC8::NewL( streamLen ); |
|
820 CleanupStack::PushL( appDataBuffer ); |
|
821 |
|
822 TPtr8 buffPtr( appDataBuffer->Des() ); |
|
823 RDbColReadStream readStream; |
|
824 readStream.OpenLC( view, applicationSpecificIndex ); |
|
825 readStream.ReadL( buffPtr, streamLen ); |
|
826 readStream.Release(); |
|
827 CleanupStack::PopAndDestroy(); // readStream; |
|
828 |
|
829 prog->SetApplicationDataL( *appDataBuffer ); |
|
830 |
|
831 CleanupStack::PopAndDestroy( appDataBuffer ); |
|
832 User::LeaveIfError( aNextScheduleArray.Append( prog ) ); |
|
833 CleanupStack::Pop( prog ); |
|
834 |
|
835 // And next schedule... |
|
836 view.NextL(); |
|
837 } |
|
838 |
|
839 CleanupStack::PopAndDestroy( &view ); // Closes view |
|
840 |
|
841 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::FillScheduleArrayByTimeL"); |
|
842 } |
|
843 |
|
844 |
|
845 // --------------------------------------------------------------------------- |
|
846 // CCseScheduleDB::GetScheduleByDbIdentifierL() |
|
847 // |
|
848 // --------------------------------------------------------------------------- |
|
849 void CCseScheduleDB::GetScheduleByDbIdentifierL( const TUint32 aDbIdentifier, |
|
850 CCseScheduledProgram* aSchedule ) |
|
851 { |
|
852 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetScheduleByDbIdentifierL"); |
|
853 LeaveIfDbLockedL(); |
|
854 ResetCompactTimer(); |
|
855 |
|
856 if ( !aSchedule ) |
|
857 { |
|
858 return; |
|
859 } |
|
860 |
|
861 TBuf<KCseCustomSqlLength> sqlStatement; |
|
862 sqlStatement.Append( KCseSelectFromDb ); |
|
863 sqlStatement.Append( KCseScheduleTable ); |
|
864 sqlStatement.Append( KCseWhere ); |
|
865 sqlStatement.Append( KCseScheduleDbKeyCol ); |
|
866 sqlStatement.Append( KCseEqual ); |
|
867 sqlStatement.AppendNum( aDbIdentifier ); |
|
868 |
|
869 // Order table based on start time |
|
870 RDbView view; |
|
871 CleanupClosePushL( view ); |
|
872 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
873 TDbQuery( sqlStatement ) ) ); |
|
874 User::LeaveIfError( view.EvaluateAll() ); |
|
875 |
|
876 // Get the next reminder |
|
877 view.FirstL(); |
|
878 |
|
879 CDbColSet* colSetOrder = view.ColSetL(); |
|
880 CleanupStack::PushL( colSetOrder ); |
|
881 |
|
882 TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol ); |
|
883 TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol ); |
|
884 TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol ); |
|
885 TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol ); |
|
886 TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol ); |
|
887 TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol ); |
|
888 TDbColNo typeIndex = colSetOrder->ColNo( KCseScheduleTypeCol ); |
|
889 TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol ); |
|
890 TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol ); |
|
891 |
|
892 CleanupStack::PopAndDestroy( colSetOrder ); |
|
893 |
|
894 while ( view.AtRow() ) |
|
895 { |
|
896 view.GetL(); |
|
897 aSchedule->SetDbIdentifier( view.ColUint32( keyIndex ) ); |
|
898 aSchedule->SetName( view.ColDes8( nameIndex ) ); |
|
899 aSchedule->SetStartTime( view.ColTime( startTimeIndex ) ); |
|
900 aSchedule->SetEndTime( view.ColTime( endTimeIndex ) ); |
|
901 aSchedule->SetAppUid( view.ColInt32( applicationUidIdIndex ) ); |
|
902 aSchedule->SetPluginUid( view.ColInt32( plugInUidIndex ) ); |
|
903 |
|
904 aSchedule->SetScheduleType( CCseScheduledProgram::TCseScheduleType( |
|
905 view.ColInt32( typeIndex ) ) ); |
|
906 aSchedule->SetPluginType( CCseScheduledProgram::TCsePluginType( |
|
907 view.ColInt32( pluginTypeIndex ) ) ); |
|
908 |
|
909 TInt streamLen( 0 ); |
|
910 streamLen = view.ColLength( applicationSpecificIndex ); |
|
911 |
|
912 HBufC8* appDataBuffer = HBufC8::NewL( streamLen ); |
|
913 CleanupStack::PushL( appDataBuffer ); |
|
914 |
|
915 TPtr8 buffPtr( appDataBuffer->Des() ); |
|
916 RDbColReadStream readStream; |
|
917 readStream.OpenLC( view, applicationSpecificIndex ); // |->1 |
|
918 readStream.ReadL(buffPtr, streamLen); |
|
919 readStream.Release(); |
|
920 CleanupStack::PopAndDestroy( ); // 1<-| Popping pointer to Col that we dont have here |
|
921 TPtrC8 ptr8( appDataBuffer->Des() ); |
|
922 aSchedule->SetApplicationDataL( *appDataBuffer ); |
|
923 CleanupStack::PopAndDestroy( appDataBuffer ); |
|
924 view.NextL(); |
|
925 } |
|
926 |
|
927 CleanupStack::PopAndDestroy( &view ); // Closes view |
|
928 |
|
929 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetScheduleByDbIdentifierL"); |
|
930 } |
|
931 |
|
932 |
|
933 // --------------------------------------------------------------------------- |
|
934 // CCseScheduleDB::GetOverlappingSchedulesL() |
|
935 // |
|
936 // --------------------------------------------------------------------------- |
|
937 void CCseScheduleDB::GetOverlappingSchedulesL( const TInt32 aType, |
|
938 const TTime& aStartTime, |
|
939 const TTime& aEndTime, |
|
940 RPointerArray<CCseScheduledProgram>& aResultArray |
|
941 ) |
|
942 { |
|
943 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetOverlappingSchedulesL"); |
|
944 LeaveIfDbLockedL(); |
|
945 ResetCompactTimer(); |
|
946 |
|
947 TBuf<100> startTimeBuf; |
|
948 _LIT( KDateTimeFormat,"# %1%*D/%2%*M/%3%*Y %H:%T:%S#" ); |
|
949 aStartTime.FormatL( startTimeBuf, KDateTimeFormat ); |
|
950 TBuf<100> endTimeBuf; |
|
951 aEndTime.FormatL( endTimeBuf, KDateTimeFormat ); |
|
952 |
|
953 // Create SQL string to find all overlapping schedules from database between given |
|
954 // timeframe. |
|
955 TBuf<KCseCustomSqlLength> sqlStatement; |
|
956 sqlStatement.Append( KCseSelectFromDb ); |
|
957 sqlStatement.Append( KCseScheduleTable ); |
|
958 sqlStatement.Append( KCseWhere ); |
|
959 sqlStatement.Append( KCseScheduleTypeCol ); |
|
960 sqlStatement.Append( KCseEqual ); |
|
961 sqlStatement.AppendNum( aType ); |
|
962 sqlStatement.Append( KCseAnd ); |
|
963 sqlStatement.Append( KCseScheduleStartTimeCol ); |
|
964 sqlStatement.Append( KCseLess ); |
|
965 sqlStatement.Append( endTimeBuf ); |
|
966 sqlStatement.Append( KCseAnd ); |
|
967 sqlStatement.Append( KCseScheduleEndTimeCol ); |
|
968 sqlStatement.Append( KCseMore ); |
|
969 sqlStatement.Append( startTimeBuf ); |
|
970 sqlStatement.Append( KCseOrderBy ); |
|
971 sqlStatement.Append( KCseScheduleStartTimeCol ); |
|
972 |
|
973 // Order table |
|
974 RDbView view; |
|
975 CleanupClosePushL( view ); |
|
976 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
977 TDbQuery( sqlStatement ) ) ); |
|
978 User::LeaveIfError( view.EvaluateAll() ); |
|
979 |
|
980 // Move to the first row |
|
981 view.FirstL(); |
|
982 |
|
983 CDbColSet* colSetOrder = view.ColSetL(); |
|
984 CleanupStack::PushL( colSetOrder ); |
|
985 |
|
986 // Get colon indexes. |
|
987 TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol ); |
|
988 TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol ); |
|
989 TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol ); |
|
990 TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol ); |
|
991 TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol ); |
|
992 TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol ); |
|
993 TDbColNo typeIndex = colSetOrder->ColNo( KCseScheduleTypeCol ); |
|
994 TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol ); |
|
995 TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol ); |
|
996 |
|
997 CleanupStack::PopAndDestroy( colSetOrder ); |
|
998 |
|
999 // Loop through all found schedules. |
|
1000 while ( view.AtRow() ) |
|
1001 { |
|
1002 // Create new schedule to be added to array. |
|
1003 CCseScheduledProgram* schedule = CCseScheduledProgram::NewL(); |
|
1004 CleanupStack::PushL( schedule ); |
|
1005 view.GetL(); |
|
1006 |
|
1007 // Set schedule information. |
|
1008 schedule->SetDbIdentifier( view.ColUint32( keyIndex ) ); |
|
1009 schedule->SetName( view.ColDes8( nameIndex ) ); |
|
1010 schedule->SetStartTime( view.ColTime( startTimeIndex ) ); |
|
1011 schedule->SetEndTime( view.ColTime( endTimeIndex ) ); |
|
1012 schedule->SetAppUid( view.ColInt32( applicationUidIdIndex ) ); |
|
1013 schedule->SetPluginUid( view.ColInt32( plugInUidIndex ) ); |
|
1014 |
|
1015 schedule->SetScheduleType( CCseScheduledProgram::TCseScheduleType( |
|
1016 view.ColInt32( typeIndex ) ) ); |
|
1017 schedule->SetPluginType( CCseScheduledProgram::TCsePluginType( |
|
1018 view.ColInt32( pluginTypeIndex ) ) ); |
|
1019 |
|
1020 TInt streamLen( 0 ); |
|
1021 streamLen = view.ColLength( applicationSpecificIndex ); |
|
1022 |
|
1023 HBufC8* appDataBuffer = HBufC8::NewL( streamLen ); |
|
1024 CleanupStack::PushL( appDataBuffer ); |
|
1025 |
|
1026 TPtr8 buffPtr( appDataBuffer->Des() ); |
|
1027 RDbColReadStream readStream; // |->1 |
|
1028 readStream.OpenLC( view, applicationSpecificIndex ); |
|
1029 readStream.ReadL(buffPtr, streamLen); |
|
1030 readStream.Release(); |
|
1031 CleanupStack::PopAndDestroy( ); // 1<-| Popping pointer to Col that we dont have here |
|
1032 TPtrC8 ptr8( appDataBuffer->Des() ); |
|
1033 schedule->SetApplicationDataL( *appDataBuffer ); |
|
1034 CleanupStack::PopAndDestroy( appDataBuffer ); |
|
1035 if ( schedule->StartTime() < aEndTime && schedule->EndTime() > aStartTime ) |
|
1036 { |
|
1037 aResultArray.AppendL( schedule ); |
|
1038 CleanupStack::Pop( schedule ); |
|
1039 } |
|
1040 else |
|
1041 { |
|
1042 CleanupStack::PopAndDestroy( schedule ); |
|
1043 schedule = NULL; |
|
1044 } |
|
1045 |
|
1046 // Next shcedule... |
|
1047 view.NextL(); |
|
1048 } |
|
1049 CleanupStack::PopAndDestroy( &view ); // Closes view |
|
1050 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetOverlappingSchedulesL"); |
|
1051 } |
|
1052 |
|
1053 // --------------------------------------------------------------------------- |
|
1054 // CCseScheduleDB::IncreaseRunCountL() |
|
1055 // |
|
1056 // --------------------------------------------------------------------------- |
|
1057 void CCseScheduleDB::IncreaseRunCountL( const TUint32 aDbIdentifier ) |
|
1058 { |
|
1059 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::IncreaseRunCountL"); |
|
1060 LeaveIfDbLockedL(); |
|
1061 ResetCompactTimer(); |
|
1062 |
|
1063 // Create SQL string to find given schedule |
|
1064 TBuf<KCseCustomSqlLength> sqlStatement; |
|
1065 sqlStatement.Append( KCseSelectFromDb ); |
|
1066 sqlStatement.Append( KCseScheduleTable ); |
|
1067 sqlStatement.Append( KCseWhere ); |
|
1068 sqlStatement.Append( KCseScheduleDbKeyCol ); |
|
1069 sqlStatement.Append( KCseEqual ); |
|
1070 sqlStatement.AppendNum( aDbIdentifier ); |
|
1071 |
|
1072 // Order table based on DB identifier |
|
1073 RDbView readView; |
|
1074 CleanupClosePushL( readView ); |
|
1075 |
|
1076 User::LeaveIfError( readView.Prepare( iScheduleDb, |
|
1077 TDbQuery( sqlStatement ) ) ); |
|
1078 User::LeaveIfError( readView.EvaluateAll() ); |
|
1079 |
|
1080 // Get the next reminder |
|
1081 readView.FirstL(); |
|
1082 |
|
1083 // First we read existint run count |
|
1084 CDbColSet* readColSet = readView.ColSetL(); |
|
1085 CleanupStack::PushL( readColSet ); |
|
1086 TDbColNo runCountCol = readColSet->ColNo( KCseScheduleRunCountCol ); |
|
1087 CleanupStack::PopAndDestroy( readColSet ); |
|
1088 TInt32 runCount( 0 ); |
|
1089 if ( readView.AtRow() ) |
|
1090 { |
|
1091 readView.GetL(); |
|
1092 runCount = readView.ColInt32( runCountCol ); |
|
1093 runCount++; |
|
1094 } |
|
1095 // Close read view |
|
1096 CleanupStack::PopAndDestroy( &readView ); |
|
1097 |
|
1098 // Update run count |
|
1099 if ( runCount > 0 ) |
|
1100 { |
|
1101 // Open write view |
|
1102 RDbView writeView; |
|
1103 CleanupClosePushL( writeView ); |
|
1104 User::LeaveIfError( writeView.Prepare( iScheduleDb, |
|
1105 TDbQuery( sqlStatement ), |
|
1106 TDbWindow::EUnlimited, |
|
1107 RDbView::EUpdatable )); |
|
1108 User::LeaveIfError( writeView.EvaluateAll() ); |
|
1109 |
|
1110 writeView.FirstL(); |
|
1111 CDbColSet* writeColSet = writeView.ColSetL(); |
|
1112 CleanupStack::PushL( writeColSet ); |
|
1113 TDbColNo runCountColNo = writeColSet->ColNo( KCseScheduleRunCountCol ); |
|
1114 CleanupStack::PopAndDestroy( writeColSet ); |
|
1115 |
|
1116 writeView.UpdateL(); |
|
1117 |
|
1118 // If we found (as we should) schedule again we update its value. |
|
1119 if ( writeView.AtRow() ) |
|
1120 { |
|
1121 writeView.SetColL( runCountColNo, runCount ); |
|
1122 } |
|
1123 |
|
1124 writeView.PutL(); |
|
1125 |
|
1126 CleanupStack::PopAndDestroy( &writeView ); |
|
1127 } |
|
1128 |
|
1129 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::IncreaseRunCountL"); |
|
1130 } |
|
1131 |
|
1132 // --------------------------------------------------------------------------- |
|
1133 // CCseScheduleDB::GetRunCountL() |
|
1134 // |
|
1135 // --------------------------------------------------------------------------- |
|
1136 TInt32 CCseScheduleDB::GetRunCountL( const TUint32 aDbIdentifier ) |
|
1137 { |
|
1138 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetRunCountL"); |
|
1139 LeaveIfDbLockedL(); |
|
1140 ResetCompactTimer(); |
|
1141 |
|
1142 TInt32 runCount( 0 ); |
|
1143 |
|
1144 // Create SQL string to find given schedule |
|
1145 TBuf<KCseCustomSqlLength> sqlStatement; |
|
1146 sqlStatement.Append( KCseSelectFromDb ); |
|
1147 sqlStatement.Append( KCseScheduleTable ); |
|
1148 sqlStatement.Append( KCseWhere ); |
|
1149 sqlStatement.Append( KCseScheduleDbKeyCol ); |
|
1150 sqlStatement.Append( KCseEqual ); |
|
1151 sqlStatement.AppendNum( aDbIdentifier ); |
|
1152 |
|
1153 // Order table based on start time |
|
1154 RDbView view; |
|
1155 CleanupClosePushL( view ); |
|
1156 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
1157 TDbQuery( sqlStatement ) ) ); |
|
1158 User::LeaveIfError( view.EvaluateAll() ); |
|
1159 |
|
1160 // Get the next reminder |
|
1161 view.FirstL(); |
|
1162 |
|
1163 CDbColSet* colSetOrder = view.ColSetL(); |
|
1164 CleanupStack::PushL( colSetOrder ); |
|
1165 |
|
1166 TDbColNo runCountCol = colSetOrder->ColNo( KCseScheduleRunCountCol ); |
|
1167 |
|
1168 CleanupStack::PopAndDestroy( colSetOrder ); |
|
1169 |
|
1170 // If we found schedule get its run count. |
|
1171 if ( view.AtRow() ) |
|
1172 { |
|
1173 view.GetL(); |
|
1174 |
|
1175 runCount = view.ColInt32( runCountCol ); |
|
1176 } |
|
1177 |
|
1178 CleanupStack::PopAndDestroy( &view ); // Closes view |
|
1179 |
|
1180 CSELOGSTRING2_HIGH_LEVEL("<<<CCseScheduleDB::GetRunCountL: runCount=%d", runCount); |
|
1181 |
|
1182 return runCount; |
|
1183 } |
|
1184 |
|
1185 // --------------------------------------------------------------------------- |
|
1186 // CCseScheduleDB::SetScheduleStateL() |
|
1187 // |
|
1188 // --------------------------------------------------------------------------- |
|
1189 void CCseScheduleDB::SetScheduleStateL( const TUint32 aDbIdentifier, |
|
1190 const TInt32 aState ) |
|
1191 { |
|
1192 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::SetScheduleStateL"); |
|
1193 LeaveIfDbLockedL(); |
|
1194 ResetCompactTimer(); |
|
1195 |
|
1196 // Create SQL string to find given schedule |
|
1197 TBuf<KCseCustomSqlLength> sqlStatement; |
|
1198 sqlStatement.Append( KCseSelectFromDb ); |
|
1199 sqlStatement.Append( KCseScheduleTable ); |
|
1200 sqlStatement.Append( KCseWhere ); |
|
1201 sqlStatement.Append( KCseScheduleDbKeyCol ); |
|
1202 sqlStatement.Append( KCseEqual ); |
|
1203 sqlStatement.AppendNum( aDbIdentifier ); |
|
1204 |
|
1205 // Open write view |
|
1206 RDbView writeView; |
|
1207 CleanupClosePushL( writeView ); |
|
1208 User::LeaveIfError( writeView.Prepare( iScheduleDb, |
|
1209 TDbQuery( sqlStatement ), |
|
1210 TDbWindow::EUnlimited, |
|
1211 RDbView::EUpdatable )); |
|
1212 User::LeaveIfError( writeView.EvaluateAll() ); |
|
1213 |
|
1214 writeView.FirstL(); |
|
1215 CDbColSet* writeColSet = writeView.ColSetL(); |
|
1216 CleanupStack::PushL( writeColSet ); |
|
1217 TDbColNo stateColNo = writeColSet->ColNo( KCseScheduleStateCol ); |
|
1218 CleanupStack::PopAndDestroy( writeColSet ); |
|
1219 |
|
1220 writeView.UpdateL(); |
|
1221 |
|
1222 // If we found schedule, we change the column value. |
|
1223 if ( writeView.AtRow() ) |
|
1224 { |
|
1225 writeView.SetColL( stateColNo, aState ); |
|
1226 } |
|
1227 |
|
1228 writeView.PutL(); |
|
1229 CleanupStack::PopAndDestroy( &writeView ); |
|
1230 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::SetScheduleStateL"); |
|
1231 } |
|
1232 |
|
1233 // --------------------------------------------------------------------------- |
|
1234 // CCseScheduleDB::GetScheduleStateL() |
|
1235 // |
|
1236 // --------------------------------------------------------------------------- |
|
1237 TInt32 CCseScheduleDB::GetScheduleStateL( const TUint32 aDbIdentifier ) |
|
1238 { |
|
1239 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetScheduleStateL"); |
|
1240 LeaveIfDbLockedL(); |
|
1241 ResetCompactTimer(); |
|
1242 |
|
1243 // Create SQL string to find given schedule |
|
1244 TBuf<KCseCustomSqlLength> sqlStatement; |
|
1245 sqlStatement.Append( KCseSelectFromDb ); |
|
1246 sqlStatement.Append( KCseScheduleTable ); |
|
1247 sqlStatement.Append( KCseWhere ); |
|
1248 sqlStatement.Append( KCseScheduleDbKeyCol ); |
|
1249 sqlStatement.Append( KCseEqual ); |
|
1250 sqlStatement.AppendNum( aDbIdentifier ); |
|
1251 |
|
1252 // Order table based on DB identifier |
|
1253 RDbView readView; |
|
1254 CleanupClosePushL( readView ); |
|
1255 User::LeaveIfError( readView.Prepare( iScheduleDb, |
|
1256 TDbQuery( sqlStatement ) ) ); |
|
1257 User::LeaveIfError( readView.EvaluateAll() ); |
|
1258 |
|
1259 // Get the reminder |
|
1260 readView.FirstL(); |
|
1261 |
|
1262 CDbColSet* readColSet = readView.ColSetL(); |
|
1263 CleanupStack::PushL( readColSet ); |
|
1264 TDbColNo stateCol = readColSet->ColNo( KCseScheduleStateCol ); |
|
1265 CleanupStack::PopAndDestroy( readColSet ); |
|
1266 TInt32 state( KErrNotFound ); |
|
1267 |
|
1268 // If we found schedule, get the schedule state. |
|
1269 if ( readView.AtRow() ) |
|
1270 { |
|
1271 readView.GetL(); |
|
1272 state = readView.ColInt32( stateCol ); |
|
1273 } |
|
1274 // Close read view |
|
1275 CleanupStack::PopAndDestroy( &readView ); |
|
1276 |
|
1277 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetScheduleStateL"); |
|
1278 |
|
1279 return state; |
|
1280 } |
|
1281 |
|
1282 // --------------------------------------------------------------------------- |
|
1283 // CCseScheduleDB::StartupSchedulesL() |
|
1284 // |
|
1285 // --------------------------------------------------------------------------- |
|
1286 void CCseScheduleDB::StartupSchedulesL( RPointerArray<CCseScheduledProgram>& aScheduleArray ) |
|
1287 { |
|
1288 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::StartupSchedulesL"); |
|
1289 LeaveIfDbLockedL(); |
|
1290 ResetCompactTimer(); |
|
1291 |
|
1292 // Create SQL string to find wanted schedules. |
|
1293 // At startup phase we are first interested for |
|
1294 // those schedules that were on run when phone was |
|
1295 // shutdown (eg runcount is bigger than 0). |
|
1296 TBuf<KCseCustomSqlLength> sqlStatement; |
|
1297 sqlStatement.Append( KCseSelectFromDb ); |
|
1298 sqlStatement.Append( KCseScheduleTable ); |
|
1299 sqlStatement.Append( KCseWhere ); |
|
1300 sqlStatement.Append( KCseScheduleRunCountCol ); |
|
1301 sqlStatement.Append( KCseMore ); |
|
1302 sqlStatement.AppendNum( 0 ); |
|
1303 |
|
1304 // Order table |
|
1305 RDbView view; |
|
1306 CleanupClosePushL( view ); |
|
1307 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
1308 TDbQuery( sqlStatement ) ) ); |
|
1309 User::LeaveIfError( view.EvaluateAll() ); |
|
1310 |
|
1311 // Get the first reminder |
|
1312 view.FirstL(); |
|
1313 |
|
1314 CDbColSet* colSetOrder = view.ColSetL(); |
|
1315 CleanupStack::PushL( colSetOrder ); |
|
1316 |
|
1317 // Column indexes |
|
1318 TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol ); |
|
1319 TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol ); |
|
1320 TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol ); |
|
1321 TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol ); |
|
1322 TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol ); |
|
1323 TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol ); |
|
1324 TDbColNo typeIndex = colSetOrder->ColNo( KCseScheduleTypeCol ); |
|
1325 TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol ); |
|
1326 TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol ); |
|
1327 |
|
1328 CleanupStack::PopAndDestroy( colSetOrder ); |
|
1329 |
|
1330 // Loop through the found schedules. |
|
1331 while ( view.AtRow() ) |
|
1332 { |
|
1333 // Create CseScheduledProgram to be added to string. |
|
1334 CCseScheduledProgram* prog = CCseScheduledProgram::NewL(); |
|
1335 CleanupStack::PushL( prog ); |
|
1336 view.GetL(); |
|
1337 |
|
1338 // Set schedule information. |
|
1339 prog->SetDbIdentifier( view.ColUint32( keyIndex ) ); |
|
1340 prog->SetName( view.ColDes8( nameIndex ) ); |
|
1341 prog->SetStartTime( view.ColTime( startTimeIndex ) ); |
|
1342 prog->SetEndTime( view.ColTime( endTimeIndex ) ); |
|
1343 prog->SetAppUid( view.ColInt32( applicationUidIdIndex ) ); |
|
1344 prog->SetPluginUid( view.ColInt32( plugInUidIndex ) ); |
|
1345 |
|
1346 prog->SetScheduleType( CCseScheduledProgram::TCseScheduleType( |
|
1347 view.ColInt32( typeIndex ) ) ); |
|
1348 prog->SetPluginType( CCseScheduledProgram::TCsePluginType( |
|
1349 view.ColInt32( pluginTypeIndex ) ) ); |
|
1350 |
|
1351 TInt streamLen( view.ColLength( applicationSpecificIndex ) ); |
|
1352 |
|
1353 HBufC8* appDataBuffer = HBufC8::NewL( streamLen ); |
|
1354 CleanupStack::PushL( appDataBuffer ); |
|
1355 |
|
1356 TPtr8 buffPtr( appDataBuffer->Des() ); |
|
1357 RDbColReadStream readStream; |
|
1358 readStream.OpenLC( view, applicationSpecificIndex ); // |->1 |
|
1359 readStream.ReadL( buffPtr, streamLen ); |
|
1360 readStream.Release(); |
|
1361 CleanupStack::PopAndDestroy( ); // 1<-| Popping pointer to Col that we dont have here |
|
1362 |
|
1363 prog->SetApplicationDataL( *appDataBuffer ); |
|
1364 |
|
1365 CleanupStack::PopAndDestroy( appDataBuffer ); |
|
1366 User::LeaveIfError( aScheduleArray.Append( prog ) ); |
|
1367 CleanupStack::Pop( prog ); |
|
1368 |
|
1369 // Next shcedule |
|
1370 view.NextL(); |
|
1371 } |
|
1372 |
|
1373 CleanupStack::PopAndDestroy( &view ); // Closes view |
|
1374 |
|
1375 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::StartupSchedulesL"); |
|
1376 } |
|
1377 |
|
1378 // --------------------------------------------------------------------------- |
|
1379 // CCseScheduleDB::ResetCompactTimer() |
|
1380 // |
|
1381 // --------------------------------------------------------------------------- |
|
1382 void CCseScheduleDB::ResetCompactTimer() |
|
1383 { |
|
1384 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::ResetCompactTimer"); |
|
1385 |
|
1386 // If iCompatTimer is not running start it. |
|
1387 if( !iCompactTimer ) |
|
1388 { |
|
1389 TRAPD(err, iCompactTimer = CPeriodic::NewL( CActive::EPriorityStandard )); |
|
1390 |
|
1391 if(err != KErrNone ) |
|
1392 { |
|
1393 CSELOGSTRING2_HIGH_LEVEL("CCseScheduleDB::ResetCompactTimer - Can't create iCompactTimer: %d", err); |
|
1394 } |
|
1395 } |
|
1396 |
|
1397 // If iCompactTimer is running cancel it and start over again. |
|
1398 if( iCompactTimer ) |
|
1399 { |
|
1400 iCompactTimer->Cancel(); |
|
1401 |
|
1402 iCompactTimer->Start( KCseDbCompactTimeout, |
|
1403 KCseDbCompactTimeout, |
|
1404 TCallBack( CompactCallback, this ) ); |
|
1405 } |
|
1406 |
|
1407 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::ResetCompactTimer"); |
|
1408 } |
|
1409 |
|
1410 // --------------------------------------------------------------------------- |
|
1411 // CCseScheduleDB::CompactCallback() |
|
1412 // |
|
1413 // --------------------------------------------------------------------------- |
|
1414 TInt CCseScheduleDB::CompactCallback( TAny* aThis ) |
|
1415 { |
|
1416 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::CompactCallback"); |
|
1417 |
|
1418 // Direct call to class method. |
|
1419 static_cast<CCseScheduleDB*>( aThis )->CompactDb(); |
|
1420 |
|
1421 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::CompactCallback"); |
|
1422 return EFalse; |
|
1423 } |
|
1424 |
|
1425 // --------------------------------------------------------------------------- |
|
1426 // CCseScheduleDB::CompactDb() |
|
1427 // |
|
1428 // --------------------------------------------------------------------------- |
|
1429 void CCseScheduleDB::CompactDb() |
|
1430 { |
|
1431 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::CompactDb"); |
|
1432 // Compact database |
|
1433 |
|
1434 if( iDbAccess != ECseDbLocked ) |
|
1435 { |
|
1436 TInt err( iScheduleDb.Compact() ); |
|
1437 if ( err != KErrNone ) |
|
1438 { |
|
1439 CSELOGSTRING2_HIGH_LEVEL("iScheduleDb.Compact() failed: %d", err); |
|
1440 } |
|
1441 } |
|
1442 |
|
1443 // Cancel timer if it is running |
|
1444 if ( iCompactTimer ) |
|
1445 { |
|
1446 iCompactTimer->Cancel(); |
|
1447 delete iCompactTimer; |
|
1448 iCompactTimer = NULL; |
|
1449 } |
|
1450 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::CompactDb"); |
|
1451 } |
|
1452 |
|
1453 // --------------------------------------------------------------------------- |
|
1454 // CCseScheduleDB::ChangeFileLockL() |
|
1455 // |
|
1456 // --------------------------------------------------------------------------- |
|
1457 // |
|
1458 void CCseScheduleDB::ChangeFileLockL( |
|
1459 const TDesC& /*aFileName*/, |
|
1460 TFileLockFlags aFlags ) |
|
1461 { |
|
1462 CSELOGSTRING_HIGH_LEVEL( ">>>CCseScheduleDB::ChangeFileLockL" ); |
|
1463 |
|
1464 switch ( aFlags ) |
|
1465 { |
|
1466 case MBackupObserver::EReleaseLockReadOnly: |
|
1467 case MBackupObserver::EReleaseLockNoAccess: |
|
1468 { |
|
1469 // Backup and restore starting, close the db |
|
1470 CloseDbFile(); |
|
1471 |
|
1472 // Cancel timer if it is running |
|
1473 if ( iCompactTimer ) |
|
1474 { |
|
1475 iCompactTimer->Cancel(); |
|
1476 delete iCompactTimer; |
|
1477 iCompactTimer = NULL; |
|
1478 } |
|
1479 } |
|
1480 break; |
|
1481 |
|
1482 default: |
|
1483 { |
|
1484 OpenDbFileL(); |
|
1485 } |
|
1486 break; |
|
1487 } |
|
1488 |
|
1489 CSELOGSTRING_HIGH_LEVEL( "<<<CCseScheduleDB::ChangeFileLockL" ); |
|
1490 } |
|
1491 |
|
1492 // --------------------------------------------------------------------------- |
|
1493 // CCseScheduleDB::CloseDbFile() |
|
1494 // |
|
1495 // --------------------------------------------------------------------------- |
|
1496 void CCseScheduleDB::CloseDbFile() |
|
1497 { |
|
1498 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::CloseDbFile"); |
|
1499 |
|
1500 iDbAccess = ECseDbLocked; |
|
1501 iScheduleDb.Close(); |
|
1502 delete iScheduleFileStore; |
|
1503 iScheduleFileStore = NULL; |
|
1504 |
|
1505 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::CloseDbFile"); |
|
1506 } |
|
1507 |
|
1508 // --------------------------------------------------------------------------- |
|
1509 // CCseScheduleDB::OpenDbFileL() |
|
1510 // |
|
1511 // --------------------------------------------------------------------------- |
|
1512 void CCseScheduleDB::OpenDbFileL() |
|
1513 { |
|
1514 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::OpenDbFileL"); |
|
1515 |
|
1516 iScheduleDb.Close(); |
|
1517 if( iScheduleFileStore ) |
|
1518 { |
|
1519 delete iScheduleFileStore; |
|
1520 iScheduleFileStore = NULL; |
|
1521 } |
|
1522 iScheduleFileStore = CPermanentFileStore::OpenL( iFsSession, iDbFile, |
|
1523 EFileRead|EFileWrite ); |
|
1524 iScheduleFileStore->SetTypeL( iScheduleFileStore->Layout() ); |
|
1525 iScheduleDb.OpenL( iScheduleFileStore, iScheduleFileStore->Root() ); |
|
1526 User::LeaveIfError( iScheduleDb.Compact() ); |
|
1527 |
|
1528 iDbAccess = ECseDbOpen; |
|
1529 |
|
1530 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::OpenDbFileL"); |
|
1531 } |
|
1532 |
|
1533 // --------------------------------------------------------------------------- |
|
1534 // CCseScheduleDB::LeaveIfDbLocked() |
|
1535 // |
|
1536 // --------------------------------------------------------------------------- |
|
1537 void CCseScheduleDB::LeaveIfDbLockedL() const |
|
1538 { |
|
1539 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::LeaveIfDbLocked"); |
|
1540 |
|
1541 if(iDbAccess == ECseDbLocked) |
|
1542 { |
|
1543 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::LeaveIfDbLocked - Leave, DB locked!!"); |
|
1544 User::Leave( KErrLocked ); |
|
1545 } |
|
1546 |
|
1547 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::LeaveIfDbLocked"); |
|
1548 } |
|
1549 |
|
1550 // --------------------------------------------------------------------------- |
|
1551 // CCseScheduleDB::GetSchedulesByPluginL() |
|
1552 // |
|
1553 // --------------------------------------------------------------------------- |
|
1554 void CCseScheduleDB::GetSchedulesByPluginL( const TInt32 aPluginUid, |
|
1555 RPointerArray<CCseScheduledProgram>& aArray ) |
|
1556 { |
|
1557 |
|
1558 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetSchedulesByPluginL"); |
|
1559 LeaveIfDbLockedL(); |
|
1560 ResetCompactTimer(); |
|
1561 |
|
1562 // Gets program occurence(s) that are going to happen next |
|
1563 // from database |
|
1564 TBuf<KCseCustomSqlLength> sqlStatement; |
|
1565 sqlStatement.Append( KCseSelectFromDb ); |
|
1566 sqlStatement.Append( KCseScheduleTable ); |
|
1567 sqlStatement.Append( KCseWhere ); |
|
1568 sqlStatement.Append( KCseSchedulePlugInUIDCol ); |
|
1569 sqlStatement.Append( KCseEqual ); |
|
1570 sqlStatement.AppendNum( aPluginUid ); |
|
1571 sqlStatement.Append( KCseOrderBy ); |
|
1572 sqlStatement.Append( KCseScheduleStartTimeCol ); |
|
1573 |
|
1574 // Order table based on start time |
|
1575 RDbView view; |
|
1576 CleanupClosePushL( view ); |
|
1577 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
1578 TDbQuery( sqlStatement ) ) ); |
|
1579 User::LeaveIfError( view.EvaluateAll() ); |
|
1580 |
|
1581 view.FirstL(); |
|
1582 |
|
1583 CDbColSet* colSetOrder = view.ColSetL(); |
|
1584 CleanupStack::PushL( colSetOrder ); |
|
1585 |
|
1586 // Get the SQL table indexes. |
|
1587 TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol ); |
|
1588 TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol ); |
|
1589 TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol ); |
|
1590 TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol ); |
|
1591 TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol ); |
|
1592 TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol ); |
|
1593 TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol ); |
|
1594 TDbColNo scheduleTypeIndex = colSetOrder->ColNo( KCseScheduleTypeCol ); |
|
1595 TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol ); |
|
1596 |
|
1597 CleanupStack::PopAndDestroy( colSetOrder ); |
|
1598 |
|
1599 // Loop through the tables |
|
1600 while ( view.AtRow() ) |
|
1601 { |
|
1602 // Create new CCseSceduledProgram to be added to array |
|
1603 CCseScheduledProgram* prog = CCseScheduledProgram::NewL(); |
|
1604 CleanupStack::PushL( prog ); |
|
1605 |
|
1606 // Fill created schedule with DB information |
|
1607 view.GetL(); |
|
1608 prog->SetDbIdentifier( view.ColUint32( keyIndex ) ); |
|
1609 prog->SetName( view.ColDes8( nameIndex ) ); |
|
1610 prog->SetStartTime( view.ColTime( startTimeIndex ) ); |
|
1611 prog->SetEndTime( view.ColTime( endTimeIndex ) ); |
|
1612 prog->SetAppUid( view.ColInt32( applicationUidIdIndex ) ); |
|
1613 prog->SetPluginUid( view.ColInt32( plugInUidIndex ) ); |
|
1614 prog->SetScheduleType( view.ColInt32( scheduleTypeIndex ) ); |
|
1615 prog->SetPluginType( view.ColInt32( pluginTypeIndex ) ); |
|
1616 |
|
1617 TInt streamLen( 0 ); |
|
1618 streamLen = view.ColLength( applicationSpecificIndex ); |
|
1619 |
|
1620 HBufC8* appDataBuffer = HBufC8::NewL( streamLen ); |
|
1621 |
|
1622 CleanupStack::PushL( appDataBuffer ); |
|
1623 |
|
1624 TPtr8 buffPtr( appDataBuffer->Des() ); |
|
1625 RDbColReadStream readStream; |
|
1626 readStream.OpenLC( view, applicationSpecificIndex ); // |->1 |
|
1627 readStream.ReadL( buffPtr, streamLen ); |
|
1628 readStream.Release(); |
|
1629 CleanupStack::PopAndDestroy( ); // 1<-| Popping pointer to Col that we dont have here |
|
1630 |
|
1631 prog->SetApplicationDataL( *appDataBuffer ); |
|
1632 |
|
1633 CleanupStack::PopAndDestroy( appDataBuffer ); |
|
1634 User::LeaveIfError( aArray.Append( prog ) ); |
|
1635 CleanupStack::Pop( prog ); |
|
1636 view.NextL(); |
|
1637 } |
|
1638 |
|
1639 CleanupStack::PopAndDestroy( &view ); // Closes view |
|
1640 |
|
1641 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetSchedulesByPluginL"); |
|
1642 } |
|
1643 |
|
1644 // --------------------------------------------------------------------------- |
|
1645 // CCseScheduleDB::GetSchedulesByTypeL() |
|
1646 // |
|
1647 // --------------------------------------------------------------------------- |
|
1648 void CCseScheduleDB::GetSchedulesByTypeL( const TInt32 aType, |
|
1649 RPointerArray<CCseScheduledProgram>& aArray ) |
|
1650 { |
|
1651 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetSchedulesByPluginL"); |
|
1652 LeaveIfDbLockedL(); |
|
1653 ResetCompactTimer(); |
|
1654 |
|
1655 // Gets program occurence(s) that are going to happen next |
|
1656 // from database |
|
1657 TBuf<KCseCustomSqlLength> sqlStatement; |
|
1658 sqlStatement.Append( KCseSelectFromDb ); |
|
1659 sqlStatement.Append( KCseScheduleTable ); |
|
1660 sqlStatement.Append( KCseWhere ); |
|
1661 sqlStatement.Append( KCseScheduleTypeCol ); |
|
1662 sqlStatement.Append( KCseEqual ); |
|
1663 sqlStatement.AppendNum( aType ); |
|
1664 sqlStatement.Append( KCseOrderBy ); |
|
1665 sqlStatement.Append( KCseScheduleStartTimeCol ); |
|
1666 |
|
1667 // Order table based on start time |
|
1668 RDbView view; |
|
1669 CleanupClosePushL( view ); |
|
1670 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
1671 TDbQuery( sqlStatement ) ) ); |
|
1672 User::LeaveIfError( view.EvaluateAll() ); |
|
1673 |
|
1674 view.FirstL(); |
|
1675 |
|
1676 CDbColSet* colSetOrder = view.ColSetL(); |
|
1677 CleanupStack::PushL( colSetOrder ); |
|
1678 |
|
1679 // Get the SQL table indexes. |
|
1680 TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol ); |
|
1681 TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol ); |
|
1682 TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol ); |
|
1683 TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol ); |
|
1684 TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol ); |
|
1685 TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol ); |
|
1686 TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol ); |
|
1687 TDbColNo scheduleTypeIndex = colSetOrder->ColNo( KCseScheduleTypeCol ); |
|
1688 TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol ); |
|
1689 |
|
1690 CleanupStack::PopAndDestroy( colSetOrder ); |
|
1691 |
|
1692 // Loop through the tables |
|
1693 while ( view.AtRow() ) |
|
1694 { |
|
1695 // Create new CCseSceduledProgram to be added to array |
|
1696 CCseScheduledProgram* prog = CCseScheduledProgram::NewL(); |
|
1697 CleanupStack::PushL( prog ); |
|
1698 |
|
1699 // Fill created schedule with DB information |
|
1700 view.GetL(); |
|
1701 prog->SetDbIdentifier( view.ColUint32( keyIndex ) ); |
|
1702 prog->SetName( view.ColDes8( nameIndex ) ); |
|
1703 prog->SetStartTime( view.ColTime( startTimeIndex ) ); |
|
1704 prog->SetEndTime( view.ColTime( endTimeIndex ) ); |
|
1705 prog->SetAppUid( view.ColInt32( applicationUidIdIndex ) ); |
|
1706 prog->SetPluginUid( view.ColInt32( plugInUidIndex ) ); |
|
1707 prog->SetScheduleType( view.ColInt32( scheduleTypeIndex ) ); |
|
1708 prog->SetPluginType( view.ColInt32( pluginTypeIndex ) ); |
|
1709 |
|
1710 TInt streamLen( 0 ); |
|
1711 streamLen = view.ColLength( applicationSpecificIndex ); |
|
1712 |
|
1713 HBufC8* appDataBuffer = HBufC8::NewL( streamLen ); |
|
1714 |
|
1715 CleanupStack::PushL( appDataBuffer ); |
|
1716 |
|
1717 TPtr8 buffPtr( appDataBuffer->Des() ); |
|
1718 RDbColReadStream readStream; |
|
1719 readStream.OpenLC( view, applicationSpecificIndex ); // |-> 1 |
|
1720 readStream.ReadL( buffPtr, streamLen ); |
|
1721 readStream.Release(); |
|
1722 CleanupStack::PopAndDestroy( ); // 1 <-| Popping pointer to Col that we dont have here |
|
1723 |
|
1724 prog->SetApplicationDataL( *appDataBuffer ); |
|
1725 |
|
1726 CleanupStack::PopAndDestroy( appDataBuffer ); |
|
1727 User::LeaveIfError( aArray.Append( prog ) ); |
|
1728 CleanupStack::Pop( prog ); |
|
1729 view.NextL(); |
|
1730 } |
|
1731 |
|
1732 CleanupStack::PopAndDestroy( &view ); // Closes view |
|
1733 |
|
1734 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetSchedulesByPluginL"); |
|
1735 } |
|
1736 |
|
1737 // --------------------------------------------------------------------------- |
|
1738 // CCseScheduleDB::GetSchedulesByTimeframeL() |
|
1739 // |
|
1740 // --------------------------------------------------------------------------- |
|
1741 void CCseScheduleDB::GetSchedulesByTimeframeL( const TTime& aBeginning, |
|
1742 const TTime& aEnd, |
|
1743 RPointerArray<CCseScheduledProgram>& aResultArray |
|
1744 ) |
|
1745 { |
|
1746 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetSchedulesByTimeframeL"); |
|
1747 LeaveIfDbLockedL(); |
|
1748 ResetCompactTimer(); |
|
1749 |
|
1750 TBuf<100> startTimeBuf; |
|
1751 _LIT( KDateTimeFormat,"# %1%*D/%2%*M/%3%*Y %H:%T:%S#" ); |
|
1752 aBeginning.FormatL( startTimeBuf, KDateTimeFormat ); |
|
1753 TBuf<100> endTimeBuf; |
|
1754 aEnd.FormatL( endTimeBuf, KDateTimeFormat ); |
|
1755 |
|
1756 // Create SQL string to find all overlapping schedules from database between given |
|
1757 // timeframe. |
|
1758 TBuf<KCseCustomSqlLength> sqlStatement; |
|
1759 sqlStatement.Append( KCseSelectFromDb ); |
|
1760 sqlStatement.Append( KCseScheduleTable ); |
|
1761 sqlStatement.Append( KCseWhere ); |
|
1762 sqlStatement.Append( KCseScheduleStartTimeCol ); |
|
1763 sqlStatement.Append( KCseLess ); |
|
1764 sqlStatement.Append( endTimeBuf ); |
|
1765 sqlStatement.Append( KCseAnd ); |
|
1766 sqlStatement.Append( KCseScheduleEndTimeCol ); |
|
1767 sqlStatement.Append( KCseMore ); |
|
1768 sqlStatement.Append( startTimeBuf ); |
|
1769 sqlStatement.Append( KCseOrderBy ); |
|
1770 sqlStatement.Append( KCseScheduleStartTimeCol ); |
|
1771 |
|
1772 // Order table |
|
1773 RDbView view; |
|
1774 CleanupClosePushL( view ); |
|
1775 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
1776 TDbQuery( sqlStatement ) ) ); |
|
1777 User::LeaveIfError( view.EvaluateAll() ); |
|
1778 |
|
1779 // Move to the first row |
|
1780 view.FirstL(); |
|
1781 |
|
1782 CDbColSet* colSetOrder = view.ColSetL(); |
|
1783 CleanupStack::PushL( colSetOrder ); |
|
1784 |
|
1785 // Get colon indexes. |
|
1786 TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol ); |
|
1787 TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol ); |
|
1788 TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol ); |
|
1789 TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol ); |
|
1790 TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol ); |
|
1791 TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol ); |
|
1792 TDbColNo typeIndex = colSetOrder->ColNo( KCseScheduleTypeCol ); |
|
1793 TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol ); |
|
1794 TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol ); |
|
1795 |
|
1796 CleanupStack::PopAndDestroy( colSetOrder ); |
|
1797 |
|
1798 // Loop through all found schedules. |
|
1799 while ( view.AtRow() ) |
|
1800 { |
|
1801 // Create new schedule to be added to array. |
|
1802 CCseScheduledProgram* schedule = CCseScheduledProgram::NewL(); |
|
1803 CleanupStack::PushL( schedule ); |
|
1804 view.GetL(); |
|
1805 |
|
1806 // Set schedule information. |
|
1807 schedule->SetDbIdentifier( view.ColUint32( keyIndex ) ); |
|
1808 schedule->SetName( view.ColDes8( nameIndex ) ); |
|
1809 schedule->SetStartTime( view.ColTime( startTimeIndex ) ); |
|
1810 schedule->SetEndTime( view.ColTime( endTimeIndex ) ); |
|
1811 schedule->SetAppUid( view.ColInt32( applicationUidIdIndex ) ); |
|
1812 schedule->SetPluginUid( view.ColInt32( plugInUidIndex ) ); |
|
1813 |
|
1814 schedule->SetScheduleType( CCseScheduledProgram::TCseScheduleType( |
|
1815 view.ColInt32( typeIndex ) ) ); |
|
1816 schedule->SetPluginType( CCseScheduledProgram::TCseScheduleType( |
|
1817 view.ColInt32( pluginTypeIndex ) ) ); |
|
1818 |
|
1819 TInt streamLen( 0 ); |
|
1820 streamLen = view.ColLength( applicationSpecificIndex ); |
|
1821 |
|
1822 HBufC8* appDataBuffer = HBufC8::NewL( streamLen ); |
|
1823 CleanupStack::PushL( appDataBuffer ); |
|
1824 |
|
1825 TPtr8 buffPtr( appDataBuffer->Des() ); |
|
1826 RDbColReadStream readStream; |
|
1827 readStream.OpenLC( view, applicationSpecificIndex ); // |-> 1 |
|
1828 readStream.ReadL(buffPtr, streamLen); |
|
1829 readStream.Release(); |
|
1830 CleanupStack::PopAndDestroy( ); // 1 <-| Popping pointer to Col that we dont have here |
|
1831 TPtrC8 ptr8( appDataBuffer->Des() ); |
|
1832 schedule->SetApplicationDataL( *appDataBuffer ); |
|
1833 CleanupStack::PopAndDestroy( appDataBuffer ); |
|
1834 |
|
1835 aResultArray.AppendL( schedule ); |
|
1836 CleanupStack::Pop( schedule ); |
|
1837 |
|
1838 // Next shcedule... |
|
1839 view.NextL(); |
|
1840 } |
|
1841 CleanupStack::PopAndDestroy( &view ); // Closes view |
|
1842 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetSchedulesByTimeframeL"); |
|
1843 } |
|
1844 |
|
1845 // --------------------------------------------------------------------------- |
|
1846 // CCseScheduleDB::GetPluginsL() |
|
1847 // |
|
1848 // --------------------------------------------------------------------------- |
|
1849 void CCseScheduleDB::GetPluginsL( RArray<TInt32>& aPlugins ) |
|
1850 { |
|
1851 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetPluginsL"); |
|
1852 LeaveIfDbLockedL(); |
|
1853 ResetCompactTimer(); |
|
1854 |
|
1855 // Gets program occurence(s) that are going to happen next |
|
1856 // from database |
|
1857 TBuf<KCseCustomSqlLength> sqlStatement; |
|
1858 sqlStatement.Append( KCseSelectFromDb ); |
|
1859 sqlStatement.Append( KCseScheduleTable ); |
|
1860 sqlStatement.Append( KCseOrderBy ); |
|
1861 sqlStatement.Append( KCseSchedulePlugInUIDCol ); |
|
1862 |
|
1863 // Order table based on start time |
|
1864 RDbView view; |
|
1865 CleanupClosePushL( view ); |
|
1866 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
1867 TDbQuery( sqlStatement ) ) ); |
|
1868 User::LeaveIfError( view.EvaluateAll() ); |
|
1869 |
|
1870 view.FirstL(); |
|
1871 |
|
1872 CDbColSet* colSetOrder = view.ColSetL(); |
|
1873 CleanupStack::PushL( colSetOrder ); |
|
1874 |
|
1875 // Get the SQL table indexes. |
|
1876 TDbColNo pluginUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol ); |
|
1877 |
|
1878 CleanupStack::PopAndDestroy( colSetOrder ); |
|
1879 |
|
1880 TInt32 currentPluginUid( 0 ); |
|
1881 TInt32 newPluginUid( 0 ); |
|
1882 |
|
1883 // Loop through the tables |
|
1884 while ( view.AtRow() ) |
|
1885 { |
|
1886 view.GetL(); |
|
1887 |
|
1888 // Get plugin Uid from row |
|
1889 newPluginUid = view.ColInt32( pluginUidIndex ); |
|
1890 |
|
1891 // If it is different that the current plugin uid add it to |
|
1892 // array and set new "current" uid. |
|
1893 if( newPluginUid != currentPluginUid ) |
|
1894 { |
|
1895 // Query results are sorted by plugin uid |
|
1896 // so if uid changes we can add it to array |
|
1897 // without fearing that we will have |
|
1898 // duplicates. |
|
1899 aPlugins.Append( newPluginUid ); |
|
1900 currentPluginUid = newPluginUid; |
|
1901 } |
|
1902 |
|
1903 view.NextL(); |
|
1904 } |
|
1905 |
|
1906 view.Close(); |
|
1907 CleanupStack::PopAndDestroy( &view ); // Closes view |
|
1908 |
|
1909 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetPluginsL"); |
|
1910 } |
|
1911 |
|
1912 // --------------------------------------------------------------------------- |
|
1913 // CCseScheduleDB::GetNextScheduleTimeByPluginL() |
|
1914 // |
|
1915 // --------------------------------------------------------------------------- |
|
1916 TTime CCseScheduleDB::GetNextScheduleTimeByPluginL( TInt32 aPluginUid ) |
|
1917 { |
|
1918 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetNextScheduleTimeByPluginL"); |
|
1919 LeaveIfDbLockedL(); |
|
1920 ResetCompactTimer(); |
|
1921 |
|
1922 // Create SQL satring to get schedule occurence(s) that are |
|
1923 // going to happen next from database. |
|
1924 TTime nextScheduleTime( 0 ); |
|
1925 TBuf<KCseCustomSqlLength> sqlStatement; |
|
1926 sqlStatement.Append( KCseSelectFromDb ); |
|
1927 sqlStatement.Append( KCseScheduleTable ); |
|
1928 sqlStatement.Append( KCseWhere ); |
|
1929 sqlStatement.Append( KCseScheduleStateCol ); |
|
1930 sqlStatement.Append( KCseEqual ); |
|
1931 sqlStatement.AppendNum( ECseWaiting ); |
|
1932 sqlStatement.Append( KCseAnd ); |
|
1933 sqlStatement.Append( KCseSchedulePlugInUIDCol ); |
|
1934 sqlStatement.Append( KCseEqual ); |
|
1935 sqlStatement.AppendNum( aPluginUid ); |
|
1936 sqlStatement.Append( KCseOrderBy ); |
|
1937 sqlStatement.Append( KCseScheduleStartTimeCol ); |
|
1938 |
|
1939 // Order table based on start time |
|
1940 RDbView view; |
|
1941 CleanupClosePushL( view ); |
|
1942 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
1943 TDbQuery( sqlStatement ) ) ); |
|
1944 User::LeaveIfError( view.EvaluateAll() ); |
|
1945 |
|
1946 // Get the next schedule |
|
1947 view.FirstL(); |
|
1948 |
|
1949 CDbColSet* colSetOrder = view.ColSetL(); |
|
1950 CleanupStack::PushL( colSetOrder ); |
|
1951 |
|
1952 TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol ); |
|
1953 |
|
1954 CleanupStack::PopAndDestroy( colSetOrder ); |
|
1955 |
|
1956 // Schedule found get its start time. |
|
1957 if ( view.AtRow() ) |
|
1958 { |
|
1959 view.GetL(); |
|
1960 nextScheduleTime = view.ColTime( startTimeIndex ); |
|
1961 } |
|
1962 |
|
1963 CleanupStack::PopAndDestroy( &view ); // Closes view |
|
1964 |
|
1965 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetNextScheduleTimeByPluginL"); |
|
1966 |
|
1967 return nextScheduleTime; |
|
1968 } |
|
1969 |
|
1970 // --------------------------------------------------------------------------- |
|
1971 // CCseScheduleDB::GetSchedulesByTimeAndPluginL() |
|
1972 // |
|
1973 // --------------------------------------------------------------------------- |
|
1974 void CCseScheduleDB::GetSchedulesByTimeAndPluginL( |
|
1975 const TTime& aScheduleTime, |
|
1976 TInt32 aPluginUid, |
|
1977 RPointerArray<CCseScheduledProgram>& aNextScheduleArray ) |
|
1978 { |
|
1979 CSELOGSTRING_HIGH_LEVEL(">>>CCseScheduleDB::GetSchedulesByTimeAndPluginL"); |
|
1980 LeaveIfDbLockedL(); |
|
1981 ResetCompactTimer(); |
|
1982 |
|
1983 // Gets program occurence(s) that are going to happen next |
|
1984 // from database |
|
1985 TBuf<100> startTimeBuf; |
|
1986 |
|
1987 _LIT( KDateTimeFormat,"# %1%*D/%2%*M/%3%*Y %H:%T:%S.%C#" ); |
|
1988 |
|
1989 aScheduleTime.FormatL( startTimeBuf, KDateTimeFormat ); |
|
1990 |
|
1991 // Create SQL string to get all schedules to be happen at given time |
|
1992 TBuf<KCseCustomSqlLength> sqlStatement; |
|
1993 sqlStatement.Append( KCseSelectFromDb ); |
|
1994 sqlStatement.Append( KCseScheduleTable ); |
|
1995 sqlStatement.Append( KCseWhere ); |
|
1996 sqlStatement.Append( KCseScheduleStartTimeCol ); |
|
1997 sqlStatement.Append( KCseEqual ); |
|
1998 sqlStatement.Append( startTimeBuf ); |
|
1999 sqlStatement.Append( KCseAnd ); |
|
2000 sqlStatement.Append( KCseSchedulePlugInUIDCol ); |
|
2001 sqlStatement.Append( KCseEqual ); |
|
2002 sqlStatement.AppendNum( aPluginUid ); |
|
2003 |
|
2004 // Order table based on start time |
|
2005 RDbView view; |
|
2006 CleanupClosePushL( view ); |
|
2007 User::LeaveIfError( view.Prepare( iScheduleDb, |
|
2008 TDbQuery( sqlStatement ) ) ); |
|
2009 User::LeaveIfError( view.EvaluateAll() ); |
|
2010 |
|
2011 // Get the next reminder |
|
2012 view.FirstL(); |
|
2013 |
|
2014 CDbColSet* colSetOrder = view.ColSetL(); |
|
2015 CleanupStack::PushL( colSetOrder ); |
|
2016 |
|
2017 // Get column indexes |
|
2018 TDbColNo keyIndex = colSetOrder->ColNo( KCseScheduleDbKeyCol ); |
|
2019 TDbColNo nameIndex = colSetOrder->ColNo( KCseScheduleNameCol ); |
|
2020 TDbColNo startTimeIndex = colSetOrder->ColNo( KCseScheduleStartTimeCol ); |
|
2021 TDbColNo endTimeIndex = colSetOrder->ColNo( KCseScheduleEndTimeCol ); |
|
2022 TDbColNo applicationUidIdIndex = colSetOrder->ColNo( KCseScheduleApplicationUIDCol ); |
|
2023 TDbColNo plugInUidIndex = colSetOrder->ColNo( KCseSchedulePlugInUIDCol ); |
|
2024 TDbColNo typeIndex = colSetOrder->ColNo( KCseScheduleTypeCol ); |
|
2025 TDbColNo applicationSpecificIndex = colSetOrder->ColNo( KCseScheduleApplicationSpecificCol ); |
|
2026 TDbColNo pluginTypeIndex = colSetOrder->ColNo( KCseSchedulePluginTypeCol ); |
|
2027 |
|
2028 CleanupStack::PopAndDestroy( colSetOrder ); |
|
2029 |
|
2030 // Loop through all found schedules. |
|
2031 while ( view.AtRow() ) |
|
2032 { |
|
2033 // Create new schedule to be added to array |
|
2034 CCseScheduledProgram* prog = CCseScheduledProgram::NewL(); |
|
2035 CleanupStack::PushL( prog ); |
|
2036 view.GetL(); |
|
2037 |
|
2038 // Copy information from DB to schedule. |
|
2039 prog->SetDbIdentifier( view.ColUint32( keyIndex ) ); |
|
2040 prog->SetName( view.ColDes8( nameIndex ) ); |
|
2041 prog->SetStartTime( view.ColTime( startTimeIndex ) ); |
|
2042 prog->SetEndTime( view.ColTime( endTimeIndex ) ); |
|
2043 prog->SetAppUid( view.ColInt32( applicationUidIdIndex ) ); |
|
2044 prog->SetPluginUid( view.ColInt32( plugInUidIndex ) ); |
|
2045 |
|
2046 prog->SetScheduleType( CCseScheduledProgram::TCseScheduleType( |
|
2047 view.ColInt32( typeIndex ) ) ); |
|
2048 prog->SetPluginType( view.ColInt32( pluginTypeIndex ) ); |
|
2049 TInt streamLen( view.ColLength( applicationSpecificIndex ) ); |
|
2050 |
|
2051 HBufC8* appDataBuffer = HBufC8::NewL( streamLen ); |
|
2052 CleanupStack::PushL( appDataBuffer ); |
|
2053 |
|
2054 TPtr8 buffPtr( appDataBuffer->Des() ); |
|
2055 RDbColReadStream readStream; |
|
2056 readStream.OpenLC( view, applicationSpecificIndex ); // |-> 1 |
|
2057 readStream.ReadL( buffPtr, streamLen ); |
|
2058 readStream.Release(); |
|
2059 CleanupStack::PopAndDestroy(); // 1 <-| |
|
2060 |
|
2061 prog->SetApplicationDataL( *appDataBuffer ); |
|
2062 |
|
2063 CleanupStack::PopAndDestroy( appDataBuffer ); |
|
2064 User::LeaveIfError( aNextScheduleArray.Append( prog ) ); |
|
2065 CleanupStack::Pop( prog ); |
|
2066 |
|
2067 // And next schedule... |
|
2068 view.NextL(); |
|
2069 } |
|
2070 |
|
2071 CleanupStack::PopAndDestroy( &view ); // Closes view |
|
2072 |
|
2073 CSELOGSTRING_HIGH_LEVEL("<<<CCseScheduleDB::GetSchedulesByTimeAndPluginL"); |
|
2074 } |
|
2075 |
|
2076 |
|
2077 // End of file. |
|