119 } |
119 } |
120 |
120 |
121 void CCPixSearch::CompletionCallback(void *aCookie, cpix_JobId aJobId) |
121 void CCPixSearch::CompletionCallback(void *aCookie, cpix_JobId aJobId) |
122 { |
122 { |
123 CCPixSearch* object = (CCPixSearch*)aCookie; |
123 CCPixSearch* object = (CCPixSearch*)aCookie; |
124 |
124 { |
|
125 Cpt::SyncRegion |
|
126 sr(hitMutex_); |
125 // Sanity check |
127 // Sanity check |
126 if (object == NULL || |
128 if (object == NULL || |
127 object->iPendingJobId != aJobId) |
129 object->iPendingJobId != aJobId) |
128 return; |
130 return; |
129 |
131 |
|
132 } |
130 // Call the asyncronizers completion code |
133 // Call the asyncronizers completion code |
131 CCPixAsyncronizer* asyncronizer = object->iAsyncronizer; |
134 CCPixAsyncronizer* asyncronizer = object->iAsyncronizer; |
132 asyncronizer->CompletionCallback(); |
135 asyncronizer->CompletionCallback(); |
133 } |
136 } |
134 |
137 |
172 CleanupStack::PopAndDestroy(searchTerms); |
175 CleanupStack::PopAndDestroy(searchTerms); |
173 |
176 |
174 // Commit the search |
177 // Commit the search |
175 if ( iQuery ) |
178 if ( iQuery ) |
176 { |
179 { |
|
180 { |
|
181 Cpt::SyncRegion |
|
182 sr(hitMutex_); |
177 iPendingJobId = cpix_IdxSearcher_asyncSearch(iIdxDb, iQuery, (void*)this, &CompletionCallback); |
183 iPendingJobId = cpix_IdxSearcher_asyncSearch(iIdxDb, iQuery, (void*)this, &CompletionCallback); |
178 SearchServerHelper::CheckCpixErrorL(iIdxDb, KErrDatabaseQueryFailed); |
184 SearchServerHelper::CheckCpixErrorL(iIdxDb, KErrDatabaseQueryFailed); |
179 iPendingTask = EPendingTaskSearch; |
185 iPendingTask = EPendingTaskSearch; |
180 iAsyncronizer->Start(ECPixTaskTypeSearch, aObserver, aMessage); |
186 iAsyncronizer->Start(ECPixTaskTypeSearch, aObserver, aMessage); |
181 |
187 } |
182 OstTraceFunctionExit0( CCPIXSEARCH_SEARCHL_EXIT ); |
188 OstTraceFunctionExit0( CCPIXSEARCH_SEARCHL_EXIT ); |
183 return ETrue; |
189 return ETrue; |
184 } |
190 } |
185 |
191 |
186 // Search was not committed |
192 // Search was not committed |
220 |
226 |
221 iPendingTask = EPendingTaskDocument; |
227 iPendingTask = EPendingTaskDocument; |
222 |
228 |
223 iCurrentCpixDocument = new cpix_Document; |
229 iCurrentCpixDocument = new cpix_Document; |
224 iCurrentCpixDocument->ptr_ = NULL; |
230 iCurrentCpixDocument->ptr_ = NULL; |
|
231 { |
|
232 Cpt::SyncRegion |
|
233 sr(hitMutex_); |
225 iPendingJobId = cpix_Hits_asyncDoc(iHits, aIndex, &iCurrentCpixDocument, (void*)this, &CompletionCallback,1); |
234 iPendingJobId = cpix_Hits_asyncDoc(iHits, aIndex, &iCurrentCpixDocument, (void*)this, &CompletionCallback,1); |
|
235 |
226 if ( cpix_Failed(iHits) ) |
236 if ( cpix_Failed(iHits) ) |
227 { |
237 { |
228 SearchServerHelper::LogErrorL(*(iHits->err_)); |
238 SearchServerHelper::LogErrorL(*(iHits->err_)); |
229 cpix_ClearError(iHits); |
239 cpix_ClearError(iHits); |
230 User::Leave(KErrDocumentAccessFailed); |
240 User::Leave(KErrDocumentAccessFailed); |
231 } |
241 } |
232 iAsyncronizer->Start(ECPixTaskTypeGetDocument, aObserver, aMessage); |
242 iAsyncronizer->Start(ECPixTaskTypeGetDocument, aObserver, aMessage); |
|
243 } |
233 OstTraceFunctionExit0( CCPIXSEARCH_GETDOCUMENTL_EXIT ); |
244 OstTraceFunctionExit0( CCPIXSEARCH_GETDOCUMENTL_EXIT ); |
|
245 |
234 } |
246 } |
235 |
247 |
236 void CCPixSearch::GetBatchDocumentL(TInt aIndex, MCPixAsyncronizerObserver* aObserver, const RMessage2& aMessage, TInt aCount) |
248 void CCPixSearch::GetBatchDocumentL(TInt aIndex, MCPixAsyncronizerObserver* aObserver, const RMessage2& aMessage, TInt aCount) |
237 { |
249 { |
238 PERFORMANCE_LOG_START("CCPixSearch::GetBatchDocumentL"); |
250 PERFORMANCE_LOG_START("CCPixSearch::GetBatchDocumentL"); |
252 ibatchDocuments[i] = new cpix_Document; |
264 ibatchDocuments[i] = new cpix_Document; |
253 ibatchDocuments[i]->ptr_ = NULL; |
265 ibatchDocuments[i]->ptr_ = NULL; |
254 } |
266 } |
255 |
267 |
256 iPendingTask = EPendingTaskDocument; |
268 iPendingTask = EPendingTaskDocument; |
|
269 { |
|
270 Cpt::SyncRegion |
|
271 sr(hitMutex_); |
257 iPendingJobId = cpix_Hits_asyncDoc(iHits, aIndex, ibatchDocuments, (void*)this, &CompletionCallback, aCount); |
272 iPendingJobId = cpix_Hits_asyncDoc(iHits, aIndex, ibatchDocuments, (void*)this, &CompletionCallback, aCount); |
|
273 |
258 if ( cpix_Failed(iHits) ) |
274 if ( cpix_Failed(iHits) ) |
259 { |
275 { |
260 SearchServerHelper::LogErrorL(*(iHits->err_)); |
276 SearchServerHelper::LogErrorL(*(iHits->err_)); |
261 cpix_ClearError(iHits); |
277 cpix_ClearError(iHits); |
262 User::Leave(KErrDocumentAccessFailed); |
278 User::Leave(KErrDocumentAccessFailed); |
263 } |
279 } |
264 iAsyncronizer->Start(ECPixTaskTypeGetBatchDocument, aObserver, aMessage); |
280 iAsyncronizer->Start(ECPixTaskTypeGetBatchDocument, aObserver, aMessage); |
|
281 } |
265 } |
282 } |
266 |
283 |
267 CSearchDocument* CCPixSearch::GetDocumentCompleteL() |
284 CSearchDocument* CCPixSearch::GetDocumentCompleteL() |
268 { |
285 { |
269 OstTraceFunctionEntry0( CCPIXSEARCH_GETDOCUMENTCOMPLETEL_ENTRY ); |
286 OstTraceFunctionEntry0( CCPIXSEARCH_GETDOCUMENTCOMPLETEL_ENTRY ); |
274 |
291 |
275 cpix_Hits_asyncDocResults(iHits, iPendingJobId); |
292 cpix_Hits_asyncDocResults(iHits, iPendingJobId); |
276 SearchServerHelper::CheckCpixErrorL(iHits, KErrDocumentAccessFailed); |
293 SearchServerHelper::CheckCpixErrorL(iHits, KErrDocumentAccessFailed); |
277 |
294 |
278 return ConvertDocumentL( iCurrentCpixDocument ); |
295 return ConvertDocumentL( iCurrentCpixDocument ); |
279 #if 0 // TODO XXX TIM |
|
280 const wchar_t* documentId = cpix_Document_getFieldValue(&iCurrentCpixDocument, LCPIX_DOCUID_FIELD); |
|
281 SearchServerHelper::CheckCpixErrorL(&iCurrentCpixDocument, KErrDatabaseQueryFailed); |
|
282 |
|
283 TPtrC documentIdPtr(KNullDesC); |
|
284 if (documentId) |
|
285 documentIdPtr.Set(reinterpret_cast<const TUint16*>(documentId)); |
|
286 |
|
287 const wchar_t* documentAppClass = cpix_Document_getFieldValue(&iCurrentCpixDocument, LCPIX_APPCLASS_FIELD); |
|
288 SearchServerHelper::CheckCpixErrorL(&iCurrentCpixDocument, KErrDatabaseQueryFailed); |
|
289 |
|
290 TPtrC documentAppClassPtr(KNullDesC); |
|
291 if (documentAppClass) |
|
292 documentAppClassPtr.Set(reinterpret_cast<const TUint16*>(documentAppClass)); |
|
293 |
|
294 const wchar_t* documentExcerpt = cpix_Document_getFieldValue(&iCurrentCpixDocument, LCPIX_EXCERPT_FIELD); |
|
295 SearchServerHelper::CheckCpixErrorL(&iCurrentCpixDocument, KErrDatabaseQueryFailed); |
|
296 |
|
297 TPtrC documentExcerptPtr(KNullDesC); |
|
298 if (documentExcerpt) |
|
299 documentExcerptPtr.Set(reinterpret_cast<const TUint16*>(documentExcerpt)); |
|
300 |
|
301 CSearchDocument* document = CSearchDocument::NewLC(documentIdPtr, documentAppClassPtr, documentExcerptPtr); |
|
302 |
|
303 cpix_DocFieldEnum* docFieldEnum = cpix_Document_fields(&iCurrentCpixDocument); |
|
304 |
|
305 // push to cleanup stack. |
|
306 CleanupStack::PushL( TCleanupItem(CpixDocFieldEnumDestroyer, docFieldEnum) ); |
|
307 |
|
308 SearchServerHelper::CheckCpixErrorL(&iCurrentCpixDocument, KErrDocumentAccessFailed); |
|
309 |
|
310 cpix_Field field; |
|
311 |
|
312 while (cpix_DocFieldEnum_hasMore(docFieldEnum)) |
|
313 { |
|
314 cpix_DocFieldEnum_next(docFieldEnum, &field); |
|
315 SearchServerHelper::CheckCpixErrorL(docFieldEnum, KErrDatabaseQueryFailed); |
|
316 |
|
317 const wchar_t* name = cpix_Field_name(&field); |
|
318 SearchServerHelper::CheckCpixErrorL(&field, KErrDatabaseQueryFailed); |
|
319 |
|
320 TPtrC namePtr( reinterpret_cast<const TUint16*>( name ) ); |
|
321 if ( namePtr == TPtrC( (TUint16*)LCPIX_DOCUID_FIELD ) |
|
322 || namePtr == TPtrC( (TUint16*)LCPIX_APPCLASS_FIELD ) |
|
323 || namePtr == TPtrC( (TUint16*)LCPIX_EXCERPT_FIELD ) ) |
|
324 { |
|
325 continue; // These fields have already been added |
|
326 } |
|
327 |
|
328 const wchar_t* value = cpix_Field_stringValue(&field); |
|
329 SearchServerHelper::CheckCpixErrorL(&field, KErrDatabaseQueryFailed); |
|
330 |
|
331 TPtrC stringvalue( reinterpret_cast<const TUint16*>( value ) ); |
|
332 document->AddFieldL(namePtr, stringvalue); |
|
333 } |
|
334 |
|
335 CleanupStack::PopAndDestroy(docFieldEnum); |
|
336 |
|
337 CleanupStack::Pop(document); |
|
338 |
|
339 OstTraceFunctionExit0( CCPIXSEARCH_GETDOCUMENTCOMPLETEL_EXIT ); |
|
340 return document; |
|
341 #endif // 0 |
|
342 } |
296 } |
343 |
297 |
344 RPointerArray<CSearchDocument> CCPixSearch::GetBatchDocumentCompleteL() |
298 RPointerArray<CSearchDocument> CCPixSearch::GetBatchDocumentCompleteL() |
345 { |
299 { |
346 PERFORMANCE_LOG_START("CCPixSearch::GetBatchDocumentCompleteL"); |
300 PERFORMANCE_LOG_START("CCPixSearch::GetBatchDocumentCompleteL"); |