--- a/browserplugin/cpixnpplugin/group/cpixnpplugin.mmp Fri Jun 11 16:24:16 2010 +0100
+++ b/browserplugin/cpixnpplugin/group/cpixnpplugin.mmp Thu Jul 22 16:34:05 2010 +0100
@@ -38,8 +38,6 @@
APP_LAYER_SYSTEMINCLUDE
SYSTEMINCLUDE /epoc32/include/libc
SYSTEMINCLUDE /epoc32/include/ecom
-SYSTEMINCLUDE /epoc32/include/CPixSearch
-//SYSTEMINCLUDE /epoc32/include/domain/middleware
USERINCLUDE ../inc
USERINCLUDE ../inc/idl
--- a/harvesterplugins/applications/src/applicationsplugin.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/applications/src/applicationsplugin.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -135,10 +135,14 @@
OstTraceExt1( TRACE_NORMAL, CAPPLICATIONSPLUGIN_ADDWIDGETINFOL, "CApplicationsPlugin::AddWidgetInfoL;PATH=%S", &temp );
//GetWidgetPropertyValueL returns CWidgetPropertyValue* which in turn has an operator to convert to TDesC
- aDocument->AddFieldL(KApplicationFieldCaption, *(iWidgetRegistry.GetWidgetPropertyValueL( aUid, EBundleDisplayName )), CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
+ aDocument->AddFieldL(KApplicationFieldCaption, *(iWidgetRegistry.GetWidgetPropertyValueL( aUid, EBundleDisplayName )), CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
- iWidgetRegistry.GetWidgetBundleName( aUid, temp );
- aDocument->AddExcerptL( temp );
+ //For applications, no content to go into exceprt field.
+ //For more info, check the appclass-hierarchy.txt
+ //iWidgetRegistry.GetWidgetBundleName( aUid, temp );
+ //aDocument->AddExcerptL( temp );
+ aDocument->AddExcerptL( KNullDesC );
+
OstTraceExt1( TRACE_NORMAL, DUP1_CAPPLICATIONSPLUGIN_ADDWIDGETINFOL, "CApplicationsPlugin::AddWidgetInfoL;DisplayName=%S", &temp );
CPIXLOGSTRING2("AddApplicationInfo(): DisplayName = %S ", &temp );
}
@@ -150,9 +154,26 @@
TBuf<KMaxFileName> docidString = aAppInfo.iUid.Name(); //This returns stuff in the form "[UID]". So remove the brackets.
docidString = docidString.Mid( KUidStartIndex, KUidEndIndex );
- aDocument->AddFieldL(KApplicationFieldCaption, aAppInfo.iShortCaption, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
- aDocument->AddFieldL(KApplicationFieldAbsolutePath, aAppInfo.iFullName, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
- aDocument->AddExcerptL( aAppInfo.iCaption );
+ //We index the exe name (without extension), only if the title is not present.
+ if( aAppInfo.iShortCaption.Compare(KNullDesC) )
+ {
+ aDocument->AddFieldL(KApplicationFieldCaption, aAppInfo.iShortCaption, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+ }
+ else
+ {
+ //Find the *last* location of '\' and remove the .exe to get just the filename.
+ TInt location = aAppInfo.iFullName.LocateReverse('\\');
+ if( location > 0 )
+ {
+ TInt lengthOfNameWithoutExtention = aAppInfo.iFullName.Length() -location -1; //-1 to increment one past '\'.
+ TPtrC appName = aAppInfo.iFullName.Right( lengthOfNameWithoutExtention );
+ aDocument->AddFieldL(KApplicationFieldAbsolutePath, appName.Left( appName.Length() -4 /*remove ".exe"*/), CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
+ }
+ }
+ //For applications, no content to go into exceprt field, for more info, check the appclass-hierarchy.txt
+ //aDocument->AddExcerptL( aAppInfo.iCaption );
+ aDocument->AddExcerptL( KNullDesC );
+
OstTraceExt2( TRACE_NORMAL, _ADDAPPLICATIONINFOL, "::AddApplicationInfoL;UID=%S;PATH=%S", &docidString, &aAppInfo.iFullName );
OstTraceExt2( TRACE_NORMAL, DUP1__ADDAPPLICATIONINFOL, "::AddApplicationInfoL;Excerpt=%S;Caption=%S", &aAppInfo.iCaption, &aAppInfo.iShortCaption );
@@ -176,6 +197,9 @@
ret = cap().iAppIsHidden;
}
+ //This commented code is left here as the following functionality may need to be
+ //returned if and when this or similar APIs are available for 10.1
+
//Application should not be listed hidden in application shell.
// TBuf<NCentralRepositoryConstants::KMaxUnicodeStringLength> uidResult;
// if( iHiddenApplicationsRepository->Get( KMenuHideApplication, uidResult ) == KErrNone )
--- a/harvesterplugins/applications/traces/OstTraceDefinitions.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/applications/traces/OstTraceDefinitions.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#ifndef __OSTTRACEDEFINITIONS_H__
#define __OSTTRACEDEFINITIONS_H__
// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
--- a/harvesterplugins/bookmarks/src/bookmarksplugin.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/bookmarks/src/bookmarksplugin.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -36,7 +36,7 @@
const TInt KHarvestingDelay = 1000;
/** Number of bookmarks to process in one active scheduler cycle */
const TInt KBookmarksPerRunL = 1;
-_LIT(KExcerptDelimiter, " ");
+//_LIT(KExcerptDelimiter, " ");
/** Bookmark list size for dynamic array*/
const TInt KBookmarkListSize = 100;
@@ -69,7 +69,8 @@
{
if (iAsynchronizer)
iAsynchronizer->CancelCallback();
- iFavoritesNotifier->Cancel();
+ if ( iFavoritesNotifier )
+ iFavoritesNotifier->Cancel();
delete iFavoritesNotifier;
delete iAsynchronizer;
delete iIndexer;
@@ -270,14 +271,16 @@
OstTraceExt1( TRACE_NORMAL, DUP1_CBOOKMARKSPLUGIN_DOINDEXINGL, "CBookmarksPlugin::DoIndexingL();domain=%S", domain );
CPIXLOGSTRING2("CBookmarksPlugin::DoIndexingL(): domain = %S", &domain );
}
+
+ //For bookmarks, only URL should go into exceprt field.
+ //For more info, check the appclass-hierarchy.txt
+
//Add Excerpt as it is must have field. What should be excerpt in bookmarks ?
- HBufC* excerpt = HBufC::NewLC(aItem->Url().Length() + aItem->Name().Length() + 1);
+ HBufC* excerpt = HBufC::NewLC( aItem->Url().Length() + 1 );
TPtr ptr = excerpt->Des();
- ptr.Append(aItem->Name());
- ptr.Append(KExcerptDelimiter);
- ptr.Append(aItem->Url());
- index_item->AddExcerptL(*excerpt);
- CleanupStack::PopAndDestroy(excerpt);
+ ptr.Append( aItem->Url() );
+ index_item->AddExcerptL( *excerpt );
+ CleanupStack::PopAndDestroy( excerpt );
// Send for indexing
TRAPD(err, iIndexer->AddL(*index_item));
--- a/harvesterplugins/bookmarks/traces/OstTraceDefinitions.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/bookmarks/traces/OstTraceDefinitions.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#ifndef __OSTTRACEDEFINITIONS_H__
#define __OSTTRACEDEFINITIONS_H__
// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
--- a/harvesterplugins/calendar/inc/ccalendarplugin.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/calendar/inc/ccalendarplugin.h Thu Jul 22 16:34:05 2010 +0100
@@ -40,7 +40,12 @@
_LIT(KCalendarLocationField, "Location");
_LIT(KCalendarStartTimeField, "StartTime");
_LIT(KCalendarEndTimeField, "EndTime");
+_LIT(KCalenderCompletedField, "CompletedDate");
_LIT(KCalendarAttendeesField, "Attendees");
+_LIT(KCalendarPriorityField, "Priority");
+_LIT(KCalendarPriorityHigh, "High");
+_LIT(KCalendarPriorityMedium, "Normal");
+_LIT(KCalendarPriorityLow, "Low");
class CCalendarPlugin : public CIndexingPlugin, public MDelayedCallbackObserver, public MCalProgressCallBack, public MCalChangeCallBack2
{
--- a/harvesterplugins/calendar/src/ccalendarplugin.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/calendar/src/ccalendarplugin.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -40,9 +40,7 @@
/** The delay between harvesting chunks. */
const TInt KHarvestingDelay = 2000;
-
-_LIT(KCalendarTimeFormat,"%F%/0%Y%M%D%H%T"); // Locale independent YYYYMMDDHHSS
-
+_LIT(KCalendarTimeFormat,"%04d %02d %02d %02d %02d");
// ---------------------------------------------------------------------------
// CMessagePlugin::NewL
// ---------------------------------------------------------------------------
@@ -352,6 +350,7 @@
{
if (!iIndexer)
return;
+
OstTrace1( TRACE_NORMAL, CCALENDARPLUGIN_CREATEENTRYL, "CCalendarPlugin::CreateEntryL();Uid=%d", aLocalUid );
CPIXLOGSTRING2("CCalendarPlugin::CreateEntryL(): Uid = %d.", aLocalUid);
@@ -387,24 +386,58 @@
index_item->AddFieldL(KCalendarSummaryField, entry->SummaryL());
index_item->AddFieldL(KCalendarDescriptionField, entry->DescriptionL());
index_item->AddFieldL(KCalendarLocationField, entry->LocationL());
+
+ TUint priority = entry->PriorityL();
+
+ switch(priority)
+ {
+ case 1:
+ index_item->AddFieldL(KCalendarPriorityField, KCalendarPriorityHigh);
+ break;
+ case 2:
+ index_item->AddFieldL(KCalendarPriorityField, KCalendarPriorityMedium);
+ break;
+ case 3:
+ index_item->AddFieldL(KCalendarPriorityField, KCalendarPriorityLow);
+ break;
+ default:
+ index_item->AddFieldL(KCalendarPriorityField, KNullDesC);
+ break;
+ }
TBuf<30> dateString;
-
- TTime startTime = entry->StartTimeL().TimeUtcL();
- startTime.FormatL(dateString, KCalendarTimeFormat);
+ TDateTime datetime = entry->StartTimeL().TimeUtcL().DateTime();
+ dateString.Format( KCalendarTimeFormat, datetime.Year(),
+ TInt(datetime.Month()+ 1),
+ datetime.Day() + 1,
+ datetime.Hour()+ 1,
+ datetime.Minute());
index_item->AddFieldL(KCalendarStartTimeField, dateString, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
- TTime endTime = entry->EndTimeL().TimeUtcL();
- endTime.FormatL(dateString, KCalendarTimeFormat);
+ TDateTime endTime = entry->EndTimeL().TimeUtcL().DateTime();
+ dateString.Format( KCalendarTimeFormat, endTime.Year(),
+ TInt(endTime.Month()+ 1),
+ endTime.Day() + 1,
+ endTime.Hour()+ 1,
+ endTime.Minute());
index_item->AddFieldL(KCalendarEndTimeField, dateString, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
-
+
+ TTime completedTime = entry->CompletedTimeL().TimeUtcL();
+ if( completedTime != Time::NullTTime() && CCalEntry::ETodo == entry->EntryTypeL())
+ {
+ TDateTime compTime = completedTime.DateTime();
+ dateString.Format( KCalendarTimeFormat, compTime.Year(),
+ TInt(compTime.Month()+ 1),
+ compTime.Day() + 1,
+ compTime.Hour()+ 1,
+ compTime.Minute());
+ index_item->AddFieldL(KCalenderCompletedField, dateString, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
+ }
index_item->AddFieldL(KMimeTypeField, KMimeTypeCalendar, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
- TInt excerptLength = 3 + entry->SummaryL().Length() + entry->DescriptionL().Length() + entry->LocationL().Length();
+ TInt excerptLength = 1 /*single 1-character delimiters*/ + entry->DescriptionL().Length() + entry->LocationL().Length();
HBufC* excerpt = HBufC::NewLC(excerptLength);
TPtr excerptDes = excerpt->Des();
- excerptDes.Copy(entry->SummaryL());
- excerptDes.Append(KExcerptDelimiter);
excerptDes.Append(entry->DescriptionL());
excerptDes.Append(KExcerptDelimiter);
excerptDes.Append(entry->LocationL());
--- a/harvesterplugins/calendar/traces/OstTraceDefinitions.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/calendar/traces/OstTraceDefinitions.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#ifndef __OSTTRACEDEFINITIONS_H__
#define __OSTTRACEDEFINITIONS_H__
// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
--- a/harvesterplugins/contacts/inc/ccontactsplugin.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/contacts/inc/ccontactsplugin.h Thu Jul 22 16:34:05 2010 +0100
@@ -25,6 +25,7 @@
#include <cindexingplugin.h>
#include <common.h>
#include "delayedcallback.h"
+#include "cdocumentfield.h"
class CSearchDocument;
class CContactItemFieldSet;
@@ -53,14 +54,23 @@
_LIT(KContactsSIPIDField, "SIPID");
_LIT(KContactsSpouseField, "Spouse");
_LIT(KContactsChildrenField, "Children");
-_LIT(KContactsClassField, "Class");
+//_LIT(KContactsClassField, "Class");
_LIT(KContactsPrefixField, "Prefix");
_LIT(KContactsAdditionalNameField, "AdditionalName");
_LIT(KContactsFaxField, "Fax");
-_LIT(KContactsGivenNamePronunciationField, "GivenNamePronunciation");
-_LIT(KContactsFamilyNamePronunciationField, "FamilyNamePronunciation");
-_LIT(KContactsCompanyNamePronunciationField, "CompanyNamePronunciation");
-
+_LIT(KContactsDepartmentName, "Departmant");
+_LIT(KContactIMAddress, "IMAddress");
+_LIT(KContactServiceProvider, "ServiceProvider");
+_LIT(KContactAssistant, "Assistant");
+_LIT(KContactAnniversary, "Anniversary");
+_LIT(KContactBirthday, "Birthday");
+_LIT(KDateSeparator, "-");
+const TInt KDateFieldLength = 10;
+const TInt KDayPosition = 8;
+const TInt KMonthPosition = 5;
+const TInt KYearPosition = 0;
+const TInt KDayLength = 2;
+const TInt KYearLength = 4;
class CContactsPlugin : public CIndexingPlugin, public MContactDbObserver, public MDelayedCallbackObserver
{
@@ -93,14 +103,23 @@
/**
* Adds information field (if available)
*/
- void AddFieldL(CSearchDocument& aDocument, CContactItemFieldSet& aFieldSet, TUid aFieldId, const TDesC& aFieldName );
-
+ void AddFieldL(CSearchDocument& aDocument, CContactItemFieldSet& aFieldSet, TUid aFieldId, const TDesC& aFieldName, const TInt aConfig = CDocumentField::EStoreYes | CDocumentField::EIndexTokenized);
+
+ /**
+ * Gets the date from anniversary text field
+ */
+ void GetDateL(const TDesC& aTime, TDes& aDateString);
/**
* Adds to excerpt
*/
void AddToExcerptL(CSearchDocument& aDocument, CContactItemFieldSet& aFieldSet, TUid aFieldId, const TDesC& aFieldName );
/**
+ * Helper function: adds information field to the document and to the excerpt field(if available)
+ */
+ void AddFieldToDocumentAndExcerptL(CSearchDocument& aDocument, CContactItemFieldSet& aFieldSet, TUid aFieldId, const TDesC& aFieldName, const TInt aConfig = CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
+
+ /**
* Creates the actual contact book index item
*/
void CreateContactIndexItemL(TInt aContentId, TCPixActionType aActionType);
@@ -123,6 +142,11 @@
// CPix database
CCPixIndexer* iIndexer;
+//for helping with testing.
+#ifdef HARVESTERPLUGINTESTER_FRIEND
+ friend class CHarvesterPluginTester;
+#endif
+
#ifdef __PERFORMANCE_DATA
TTime iStartTime;
TTime iCompleteTime;
--- a/harvesterplugins/contacts/src/ccontactsplugin.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/contacts/src/ccontactsplugin.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -39,7 +39,8 @@
const TInt KContactsPerRunL = 1;
_LIT(KExcerptDelimiter, " ");
-
+_LIT(KTimeFormat, "%D%N%Y%1 %2 %3"); //Date, Month name and Year format
+
// -----------------------------------------------------------------------------
// CContactsPlugin::NewL()
// -----------------------------------------------------------------------------
@@ -77,16 +78,15 @@
//
CContactsPlugin::~CContactsPlugin()
{
- if (iAsynchronizer)
- iAsynchronizer->CancelCallback();
+ if( iAsynchronizer ) iAsynchronizer->CancelCallback();
delete iAsynchronizer;
iContacts = NULL;
delete iChangeNotifier;
delete iDatabase;
delete iIndexer;
-
- if (iExcerpt)
- delete iExcerpt;
+ //delete NULL is safe - so no need to test nullity of iExceprt (which routinely
+ //keeps getting deleted in the plugin).
+ delete iExcerpt;
}
// -----------------------------------------------------------------------------
@@ -150,6 +150,7 @@
{
case EContactDbObserverEventContactChanged:
case EContactDbObserverEventGroupChanged:
+ case EContactDbObserverEventOwnCardChanged:
OstTrace1( TRACE_NORMAL, DUP3_CCONTACTSPLUGIN_HANDLEDATABASEEVENTL, "CContactsPlugin::HandleDatabaseEventL;Monitored update id=%d", aEvent.iContactId );
CPIXLOGSTRING2("CContactsPlugin::DelayedCallbackL(): Monitored update id=%d.", aEvent.iContactId);
#ifdef __PERFORMANCE_DATA
@@ -163,6 +164,7 @@
case EContactDbObserverEventContactDeleted:
case EContactDbObserverEventGroupDeleted:
+ case EContactDbObserverEventOwnCardDeleted:
OstTrace1( TRACE_NORMAL, CCONTACTSPLUGIN_HANDLEDATABASEEVENTL, "CContactsPlugin::HandleDatabaseEventL();Monitored delete id=%d", aEvent.iContactId );
CPIXLOGSTRING2("CContactsPlugin::DelayedCallbackL(): Monitored delete id=%d.", aEvent.iContactId);
#ifdef __PERFORMANCE_DATA
@@ -249,7 +251,7 @@
// PhoneNumber values), then the FieldNames of non-first values are appended a
// number.
// ---------------------------------------------------------------------------
-void CContactsPlugin::AddFieldL(CSearchDocument& aDocument, CContactItemFieldSet& aFieldSet, TUid aFieldId, const TDesC& aFieldName)
+void CContactsPlugin::AddFieldL(CSearchDocument& aDocument, CContactItemFieldSet& aFieldSet, TUid aFieldId, const TDesC& aFieldName, const TInt aConfig)
{
HBufC* fieldName = HBufC::NewLC(aFieldName.Length() + 3); // +3 so can append variable 'i'.
TPtr fieldNamePtr = fieldName->Des();
@@ -264,13 +266,34 @@
fieldNamePtr.AppendNum(i);
}
CContactItemField& additionalField = aFieldSet[findpos];
- CContactTextField* fieldText = additionalField.TextStorage();
- if (fieldText && fieldText->Text() != KNullDesC)
- aDocument.AddFieldL(fieldNamePtr, fieldText->Text(), CDocumentField::EStoreYes | CDocumentField::EIndexTokenized);
+ if( additionalField.StorageType() == KStorageTypeDateTime)
+ {
+ CContactDateField* fieldDate = additionalField.DateTimeStorage();
+ if (fieldDate)
+ {
+ TBuf<30> dateString;
+ fieldDate->Time().FormatL(dateString, KTimeFormat);
+ aDocument.AddFieldL(fieldNamePtr, dateString, aConfig);
+ }
+ else
+ aDocument.AddFieldL(fieldNamePtr, KNullDesC, aConfig);
+ }
else
- aDocument.AddFieldL(fieldNamePtr, KNullDesC, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized);
-
- findpos = aFieldSet.FindNext(aFieldId, findpos+1);
+ {
+ CContactTextField* fieldText = additionalField.TextStorage();
+ if (fieldText && fieldText->Text() != KNullDesC && aFieldId != KUidContactFieldAnniversary)
+ aDocument.AddFieldL(fieldNamePtr, fieldText->Text(), aConfig);
+ else if (fieldText && aFieldId == KUidContactFieldAnniversary)
+ {
+ TBuf<30> dateString;
+ GetDateL(fieldText->Text(), dateString);
+ aDocument.AddFieldL(fieldNamePtr, dateString, aConfig);
+ }
+ else
+ aDocument.AddFieldL(fieldNamePtr, KNullDesC, aConfig);
+ }
+ findpos = aFieldSet.FindNext(aFieldId, findpos+1);
+
}
CleanupStack::PopAndDestroy(fieldName);
}
@@ -280,7 +303,7 @@
// CContactsPlugin::AddToExcerptL
// Adds more text to excerpt
// ---------------------------------------------------------------------------
-void CContactsPlugin::AddToExcerptL(CSearchDocument& /*aDocument*/, CContactItemFieldSet& aFieldSet, TUid aFieldId, const TDesC& /*aFieldName*/ )
+void CContactsPlugin::AddToExcerptL(CSearchDocument& /*aDocument*/, CContactItemFieldSet& aFieldSet, TUid aFieldId, const TDesC& /*aFieldName*/)
{
// Find field
TInt findpos = aFieldSet.Find( aFieldId );
@@ -300,6 +323,17 @@
}
}
+// ---------------------------------------------------------------------------
+// Helper: Adds the field to the document AND to the exceprt field.
+// This function helps avoid calling two functions explicitly for most fields.
+// This function needs to be a member function as it has to call member functions.
+// Improvement: AddFieldL need to be a member function - can be refactored.
+// ---------------------------------------------------------------------------
+void CContactsPlugin::AddFieldToDocumentAndExcerptL(CSearchDocument& aDocument, CContactItemFieldSet& aFieldSet, TUid aFieldId, const TDesC& aFieldName, const TInt aConfig )
+ {
+ AddFieldL( aDocument, aFieldSet, aFieldId, aFieldName, aConfig );
+ AddToExcerptL( aDocument, aFieldSet, aFieldId, aFieldName );
+ }
// ---------------------------------------------------------------------------
// CContactsPlugin::CreateMessageIndexItemL
@@ -307,6 +341,8 @@
//
void CContactsPlugin::CreateContactIndexItemL(TInt aContentId, TCPixActionType aActionType )
{
+ //indexer is created only when StartPlugin() is called. Don't create contact
+ //if index is not ready.
if (!iIndexer)
return;
@@ -333,52 +369,59 @@
}
else//If the contact item is a regular contact.
{
- CContactItemFieldSet& fieldSet = contact->CardFields();
- AddFieldL( *index_item, fieldSet, KUidContactFieldGivenName, KContactsGivenNameField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldFamilyName, KContactsFamilyNameField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldCompanyName, KContactsCompanyNameField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldPhoneNumber, KContactsPhoneNumberField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldAddress, KContactsAddressField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldNote, KContactsNoteField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldJobTitle, KContactsJobTitleField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldSecondName, KContactsSecondNameField );
-
- AddFieldL( *index_item, fieldSet, KUidContactFieldPrefixName, KContactsPrefixField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldSuffixName, KContactsSuffixField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldAdditionalName, KContactsAdditionalNameField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldEMail, KContactsEMailField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldUrl, KContactsUrlField );
-
- AddFieldL( *index_item, fieldSet, KUidContactFieldPostOffice, KContactsPostOfficeField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldExtendedAddress, KContactsExtendedAddressField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldLocality, KContactsLocalityField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldRegion, KContactsRegionField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldPostcode, KContactsPostcodeField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldCountry, KContactsCountryField );
-
- AddFieldL( *index_item, fieldSet, KUidContactFieldSIPID, KContactsSIPIDField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldSpouse, KContactsSpouseField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldChildren, KContactsChildrenField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldClass, KContactsClassField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldFax, KContactsFaxField );
-
- AddFieldL( *index_item, fieldSet, KUidContactFieldGivenNamePronunciation, KContactsGivenNamePronunciationField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldFamilyNamePronunciation, KContactsFamilyNamePronunciationField );
- AddFieldL( *index_item, fieldSet, KUidContactFieldCompanyNamePronunciation, KContactsCompanyNamePronunciationField );
- //left: Birthday; Anniversary (date kind of type), Picture, Logo..
-
if (iExcerpt)
{
delete iExcerpt;
iExcerpt = NULL;
}
iExcerpt = HBufC::NewL(2);
- AddToExcerptL( *index_item, fieldSet, KUidContactFieldGivenName, KContactsGivenNameField );
- AddToExcerptL( *index_item, fieldSet, KUidContactFieldFamilyName, KContactsFamilyNameField );
- AddToExcerptL( *index_item, fieldSet, KUidContactFieldPhoneNumber, KContactsPhoneNumberField );
- AddToExcerptL( *index_item, fieldSet, KUidContactFieldCompanyName, KContactsCompanyNameField );
- AddToExcerptL( *index_item, fieldSet, KUidContactFieldLocality, KContactsLocalityField );
- AddToExcerptL( *index_item, fieldSet, KUidContactFieldCountry, KContactsCountryField );
+
+ CContactItemFieldSet& fieldSet = contact->CardFields();
+
+ //For contacts, all fields __except__ GivenName and FamilyName should be added to excerpt.
+ //See appclass-hierarchy.txt for details.
+ /* The order of fields in excerpt is as below. The order in this case
+ * is the order of fields shown when you 'Edit' the contact.
+ */
+ AddFieldL( *index_item, fieldSet, KUidContactFieldGivenName, KContactsGivenNameField, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText );
+ AddFieldL( *index_item, fieldSet, KUidContactFieldFamilyName, KContactsFamilyNameField, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField:: EIndexFreeText );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldPhoneNumber, KContactsPhoneNumberField );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldEMail, KContactsEMailField );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldSIPID, KContactsSIPIDField );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldCompanyName, KContactsCompanyNameField, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldJobTitle, KContactsJobTitleField, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldNote, KContactsNoteField );
+
+ /* The following fields are not displayed when 'Edit'-ing the contact.
+ * The order here is arbitrary.
+ */
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldAddress, KContactsAddressField );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldSecondName, KContactsSecondNameField, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldPrefixName, KContactsPrefixField );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldSuffixName, KContactsSuffixField );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldAdditionalName, KContactsAdditionalNameField, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldUrl, KContactsUrlField );
+
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldPostOffice, KContactsPostOfficeField );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldExtendedAddress, KContactsExtendedAddressField );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldLocality, KContactsLocalityField );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldRegion, KContactsRegionField );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldPostcode, KContactsPostcodeField );
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldCountry, KContactsCountryField );
+
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldSpouse, KContactsSpouseField, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldChildren, KContactsChildrenField, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+ //AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldClass, KContactsClassField ); //sync field
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldFax, KContactsFaxField );
+
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldAssistant, KContactAssistant, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldDepartmentName, KContactsDepartmentName, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldIMAddress, KContactIMAddress);
+ AddFieldToDocumentAndExcerptL( *index_item, fieldSet, KUidContactFieldServiceProvider, KContactServiceProvider);
+
+ AddFieldL( *index_item, fieldSet, KUidContactFieldBirthday, KContactBirthday);
+ AddFieldL( *index_item, fieldSet, KUidContactFieldAnniversary, KContactAnniversary);
index_item->AddExcerptL(*iExcerpt);
}
@@ -435,6 +478,31 @@
}
// ---------------------------------------------------------------------------
+// CContactsPlugin::GetDateL
+// ---------------------------------------------------------------------------
+//
+void CContactsPlugin::GetDateL(const TDesC& aTime, TDes& aDateString)
+ {
+ TTime time;
+ //aTime is of the form yyyy-mm-dd.
+ //aDateString is of the form dd Month(spelled out) Year.
+ //example: i/p: 2010-10-10; o/p: 10 October 2010.
+ if( aTime.Length() >= KDateFieldLength)
+ {
+ aDateString.Copy(aTime.Mid( KDayPosition, KDayLength ));
+ aDateString.Append(KDateSeparator);
+ aDateString.Append(aTime.Mid( KMonthPosition, KDayLength ));
+ aDateString.Append(KDateSeparator);
+ aDateString.Append(aTime.Mid( KYearPosition, KYearLength ));
+ TInt err = time.Parse(aDateString);
+ if ( err >= KErrNone)
+ {
+ time.FormatL(aDateString, KTimeFormat);
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
// CContactsPlugin::UpdatePerformaceDataL
// ---------------------------------------------------------------------------
//
--- a/harvesterplugins/contacts/traces/OstTraceDefinitions.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/contacts/traces/OstTraceDefinitions.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#ifndef __OSTTRACEDEFINITIONS_H__
#define __OSTTRACEDEFINITIONS_H__
// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
--- a/harvesterplugins/file/fastfindfileserverplugin/traces/OstTraceDefinitions.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/file/fastfindfileserverplugin/traces/OstTraceDefinitions.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#ifndef __OSTTRACEDEFINITIONS_H__
#define __OSTTRACEDEFINITIONS_H__
// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
--- a/harvesterplugins/file/src/cfileplugin.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/file/src/cfileplugin.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -116,7 +116,7 @@
_S("awb"),_S("mid"), _S("midi"), _S("spmid"), _S("rng"), _S("mxmf"), _S("wav"),
_S("au"), _S("nrt"), _S("mka"),_S("jp2"), _S("j2k"), _S("jpx"),
_S("rm"), _S("rmvb"),_S("ota"), _S("wbmp"), _S("wmf"),_S("otb"),
- _S("rv"), _S("mkv"), _S("ra"),_S("tif"), _S("tiff")};
+ _S("rv"), _S("mkv"), _S("asf"),_S("ra"),_S("tif"), _S("tiff")};
const TInt count = sizeof( KMediaExt ) / sizeof( TText* );
@@ -630,7 +630,8 @@
if (pos > 0)
{
fileFoldername.Copy(aFilePath.Mid(pos+1));
- index_item->AddFieldL(KNameField, fileFoldername);
+ index_item->AddFieldL(KNameField, fileFoldername,
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText );
}
//check for the extension, for folders names store the extension field as NULL
@@ -640,7 +641,7 @@
if( file.ExtPresent())
{
TPtrC extension = file.Ext();
- index_item->AddFieldL(KExtensionField, extension);
+ index_item->AddFieldL(KExtensionField, extension, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
}
index_item->AddFieldL(KMimeTypeField, KMimeTypeFile, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
}
@@ -650,8 +651,9 @@
index_item->AddFieldL(KMimeTypeField, KMimeTypeFolder, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
}
+ //Only content to be added to exceprt field. See appclass-hierarchy.txt
//Add excerpt field
- index_item->AddExcerptL(aFilePath);
+ //index_item->AddExcerptL(aFilePath);
CleanupStack::Pop(index_item);
return index_item;
--- a/harvesterplugins/file/traces/OstTraceDefinitions.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/file/traces/OstTraceDefinitions.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#ifndef __OSTTRACEDEFINITIONS_H__
#define __OSTTRACEDEFINITIONS_H__
// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
--- a/harvesterplugins/group/bld.inf Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/group/bld.inf Thu Jul 22 16:34:05 2010 +0100
@@ -18,7 +18,7 @@
#include "../messaging/group/bld.inf"
#include "../file/group/bld.inf"
#include "../calendar/group/bld.inf"
-#include "../bookmarks/group/bld.inf"
+//#include "../bookmarks/group/bld.inf"
#include "../applications/group/bld.inf"
#include "../notes/group/bld.inf"
#include "../media/group/bld.inf"
--- a/harvesterplugins/inc/s60performance.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/inc/s60performance.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,20 +1,17 @@
/*
-* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+* ==============================================================================
+* Name : s60performance.h
+* Part of : SearchServer
+* Interface :
+* Description :
+* Version :
*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
+* Copyright (c) 2008 Nokia Corporation.
+* This material, including documentation and any related
+* computer programs, is protected by copyright controlled by
+* Nokia Corporation.
+* ==============================================================================
*/
-
// Uncomment to get harvester plugin performance logs
//MACRO __PERFORMANCE_DATA
--- a/harvesterplugins/media/audio/src/cpixmediaaudiodoc.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/media/audio/src/cpixmediaaudiodoc.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -24,11 +24,13 @@
#include <mdeobjectdef.h>
#include "harvesterserverlogger.h"
#include "OstTraceDefinitions.h"
+#include "csearchdocument.h"
#ifdef OST_TRACE_COMPILER_IN_USE
#include "cpixmediaaudiodocTraces.h"
#endif
-
+_LIT( KFormatDateTime, "%04d %02d %02d %02d %02d"); // yyyy mm dd hh mm
+_LIT( KExcerptFormat, "%04d/%02d/%02d %02d:%02d");
// -----------------------------------------------------------------------------
// CCPIXDocFetcher::NewL()
// -----------------------------------------------------------------------------
@@ -92,53 +94,251 @@
CPIXLOGSTRING("START CCPIXMediaAudioDoc::GetCpixDocumentL");
//Get basic document
CSearchDocument* index_item = CCPIXDocFetcher::GetCpixDocumentL(aObject,aAppClass,aObjectDef);
- //URI and Excerpt is done add additional properties here
+ //Reset Excerpt and append
+ ResetExcerpt();
+ TInt slashpos = GetUri().LocateReverse('\\');
+ TPtrC name = GetUri().Mid( (slashpos+1) );
+ AddToFieldExcerptL(name); //Add name to excerpt field
+ //additional properties here
CMdEProperty* property(NULL);
+ CMdEPropertyDef& artistPropDef1 = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KArtistProperty );
+ if(aObject.Property( artistPropDef1, property ) != KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KArtistProperty,
+ textProperty->Value(),
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+ AddToFieldExcerptL(textProperty->Value());//Add artist to excerpt
+ }
CMdEPropertyDef& albumPropDef = aObjectDef.GetPropertyDefL(MdeConstants::Audio::KAlbumProperty );
if(aObject.Property( albumPropDef, property )!= KErrNotFound)
{
//Add field to document
- CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property);
AddFiledtoDocumentL(*index_item,
MdeConstants::Audio::KAlbumProperty,
- textProperty->Value());
+ textProperty->Value(),
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+ AddToFieldExcerptL(textProperty->Value());//Add Album to excerpt
}
+
CMdEPropertyDef& artistPropDef = aObjectDef.GetPropertyDefL(MdeConstants::Audio::KAlbumArtistProperty );
if(aObject.Property( artistPropDef, property ) != KErrNotFound)
- {
- //Add field to document
- CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
- AddFiledtoDocumentL(*index_item,
- MdeConstants::Audio::KAlbumArtistProperty,
- textProperty->Value());
- }
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::Audio::KAlbumArtistProperty,
+ textProperty->Value(),
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+ AddToFieldExcerptL(textProperty->Value());//Add Albumartist to excerpt
+ }
+ //orginal artist property
CMdEPropertyDef& origartistPropDef = aObjectDef.GetPropertyDefL(MdeConstants::Audio::KOriginalArtistProperty );
if(aObject.Property( origartistPropDef, property ) != KErrNotFound)
{
//Add field to document
- CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
AddFiledtoDocumentL(*index_item,
MdeConstants::Audio::KOriginalArtistProperty,
- textProperty->Value());
- }
+ textProperty->Value(),
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+ AddToFieldExcerptL(textProperty->Value());//Add Original to excerpt
+ }
+ //Get composer property
CMdEPropertyDef& composerPropDef = aObjectDef.GetPropertyDefL(MdeConstants::Audio::KComposerProperty );
if(aObject.Property( composerPropDef, property ) != KErrNotFound)
{
//Add field to document
- CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
AddFiledtoDocumentL(*index_item,
MdeConstants::Audio::KComposerProperty,
- textProperty->Value());
+ textProperty->Value(),
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+ AddToFieldExcerptL(textProperty->Value());//Add composer to excerpt
}
- CMdEPropertyDef& artistPropDef1 = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KArtistProperty );
- if(aObject.Property( artistPropDef1, property ) != KErrNotFound)
+ //Get author property
+ CMdEPropertyDef& authorPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KAuthorProperty );
+ if(aObject.Property( authorPropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KAuthorProperty,
+ textProperty->Value(),
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+ AddToFieldExcerptL(textProperty->Value());
+ }
+ //Get comment property
+ CMdEPropertyDef& commentPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KCommentProperty );
+ if(aObject.Property( commentPropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KCommentProperty,
+ textProperty->Value());
+ AddToFieldExcerptL(textProperty->Value());
+ }
+
+ //Get description property
+ CMdEPropertyDef& descriprionPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KDescriptionProperty );
+ if(aObject.Property( descriprionPropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KDescriptionProperty,
+ textProperty->Value());
+ AddToFieldExcerptL(textProperty->Value());
+ }
+ //Copyright property
+ CMdEPropertyDef& copyrightPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KCopyrightProperty );
+ if(aObject.Property( copyrightPropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KCopyrightProperty,
+ textProperty->Value());
+ AddToFieldExcerptL(textProperty->Value());
+ }
+ //Get genre property
+ CMdEPropertyDef& genrePropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KGenreProperty );
+ if(aObject.Property( genrePropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KGenreProperty,
+ textProperty->Value());
+ AddToFieldExcerptL(textProperty->Value());
+ }
+
+ //Size property
+ CMdEPropertyDef& sizePropDef = aObjectDef.GetPropertyDefL(MdeConstants::Object::KSizeProperty);
+ if(aObject.Property( sizePropDef, property )!= KErrNotFound)
+ {
+ //Add field to document
+ if( property->Def().PropertyType() == EPropertyUint32 )
+ {
+ CMdEUint32Property& sizeProperty = static_cast < CMdEUint32Property& > (*property );
+ TBuf<32> buf;
+ buf.Format(_L("%u"), sizeProperty.Value());
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::Object::KSizeProperty,
+ buf,
+ CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
+ AddToFieldExcerptL(buf);
+ }
+ }
+
+ //Get legal property
+ CMdEPropertyDef& legalPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KLegalProperty );
+ if(aObject.Property( legalPropDef, property ) != KErrNotFound)
{
//Add field to document
- CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
AddFiledtoDocumentL(*index_item,
- MdeConstants::MediaObject::KArtistProperty,
- textProperty->Value());
- }
+ MdeConstants::MediaObject::KLegalProperty,
+ textProperty->Value());
+ AddToFieldExcerptL(textProperty->Value());
+ }
+ //Get track property
+ CMdEPropertyDef& trackPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KTrackProperty );
+ if(aObject.Property( trackPropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ if( property->Def().PropertyType() == EPropertyUint16 )
+ {
+ CMdEUint16Property& trackProperty = static_cast < CMdEUint16Property& > (*property );
+ TBuf<32> buf;
+ buf.Format(_L("%d"), trackProperty.Value());
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KTrackProperty,
+ buf);
+ }
+ }
+ // Capturedate property
+ CMdEPropertyDef& captureDatePropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KCaptureDateProperty);
+ if(aObject.Property( captureDatePropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ if(EPropertyTime == property->Def().PropertyType())
+ {
+ CMdETimeProperty& timeProperty = static_cast < CMdETimeProperty& > (*property);
+ TDateTime time = timeProperty.Value().DateTime();
+ TBuf<32> buf;
+ buf.Format( KFormatDateTime, time.Year(),
+ time.Month() + 1,
+ time.Day() + 1,
+ time.Hour(),
+ time.Minute());
+
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KCaptureDateProperty,
+ buf,
+ CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
+
+ //Format for excerpt field
+ buf.Format( KExcerptFormat, time.Year(),
+ time.Month() + 1,
+ time.Day() + 1,
+ time.Hour(),
+ time.Minute());
+ AddToFieldExcerptL(buf);
+ }
+ }
+ //Get LastModifiedDate property
+ CMdEPropertyDef& dateTimePropDef = aObjectDef.GetPropertyDefL(MdeConstants::Object::KLastModifiedDateProperty);
+ if(aObject.Property( dateTimePropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ if(EPropertyTime == property->Def().PropertyType())
+ {
+ CMdETimeProperty& timeProperty = static_cast < CMdETimeProperty& > (*property);
+ TDateTime time = timeProperty.Value().DateTime();
+ TBuf<32> buf;
+ buf.Format( KFormatDateTime, time.Year(),
+ time.Month() + 1,
+ time.Day() + 1,
+ time.Hour(),
+ time.Minute());
+
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::Object::KLastModifiedDateProperty,
+ buf,
+ CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
+ //Format for excerpt field
+ buf.Format( KExcerptFormat, time.Year(),
+ time.Month() + 1,
+ time.Day() + 1,
+ time.Hour(),
+ time.Minute());
+ AddToFieldExcerptL(buf);
+ }
+ }
+ //Get duration property
+ CMdEPropertyDef& durationPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KDurationProperty );
+ if(aObject.Property( durationPropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ if( property->Def().PropertyType() == EPropertyReal32 )
+ {
+ CMdEReal32Property& durationProperty = static_cast < CMdEReal32Property& > (*property );
+ TBuf<32> buf;
+ buf.Format(_L("%f"), durationProperty.Value());
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KDurationProperty,
+ buf );
+ }
+ }
+ if( iExcerpt )
+ {
+ index_item->AddExcerptL(*iExcerpt);
+ }
CPIXLOGSTRING("END CCPIXMediaAudioDoc::GetCpixDocumentL");
OstTraceFunctionExit0( CCPIXMEDIAAUDIODOC_GETCPIXDOCUMENTL_EXIT );
return index_item;
--- a/harvesterplugins/media/audio/traces/OstTraceDefinitions.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/media/audio/traces/OstTraceDefinitions.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#ifndef __OSTTRACEDEFINITIONS_H__
#define __OSTTRACEDEFINITIONS_H__
// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
--- a/harvesterplugins/media/image/src/cpixmediaimagedoc.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/media/image/src/cpixmediaimagedoc.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -24,13 +24,14 @@
#include <mdeobjectdef.h>
#include "harvesterserverlogger.h"
#include "OstTraceDefinitions.h"
+#include "csearchdocument.h"
#ifdef OST_TRACE_COMPILER_IN_USE
#include "cpixmediaimagedocTraces.h"
#endif
-_LIT( KFormatDateTime, "%04d-%02d-%02dT%02d:%02d:%02dZ"); // yyyy-mm-ddThh:mm:ssZ
-
+_LIT( KFormatDateTime, "%04d %02d %02d %02d %02d"); // yyyy mm dd hh mm
+_LIT( KExcerptFormat, "%04d/%02d/%02d %02d:%02d"); //yyyy/mm/dd hh:mm
// -----------------------------------------------------------------------------
// CCPIXDocFetcher::NewL()
// -----------------------------------------------------------------------------
@@ -94,19 +95,124 @@
//Get basic document
CPIXLOGSTRING("START CCPIXMediaImageDoc::GetCpixDocumentL");
CSearchDocument* index_item = CCPIXDocFetcher::GetCpixDocumentL(aObject,aAppClass,aObjectDef);
- //URI and Excerpt is done add additional properties here
+ ResetExcerpt(); //Reset excerpt initially
+ //URI and Excerpt is done add additional properties here
CMdEProperty* property(NULL);
+
+ CMdEPropertyDef& titlePropDef = aObjectDef.GetPropertyDefL(MdeConstants::Object::KTitleProperty );
+ if(aObject.Property( titlePropDef, property ) != KErrNotFound)
+ {
+ //Add field to document excerpt.
+ CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
+ AddToFieldExcerptL(textProperty->Value());
+ }
+
//Get user comment field
CMdEPropertyDef& commentPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KCommentProperty );
if(aObject.Property( commentPropDef, property )!= KErrNotFound)
{
//Add field to document
- CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
AddFiledtoDocumentL(*index_item,
MdeConstants::MediaObject::KCommentProperty,
textProperty->Value());
+ AddToFieldExcerptL(textProperty->Value());
}
- CMdEPropertyDef& dateTimePropDef = aObjectDef.GetPropertyDefL(MdeConstants::Image::KDateTimeOriginalProperty);
+
+ //Get user description field
+ CMdEPropertyDef& descriptionPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KDescriptionProperty );
+ if(aObject.Property( descriptionPropDef, property )!= KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KDescriptionProperty,
+ textProperty->Value());
+ AddToFieldExcerptL(textProperty->Value());
+ }
+
+ //Get user copyright field
+ CMdEPropertyDef& copyRightPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KCopyrightProperty );
+ if(aObject.Property( copyRightPropDef, property )!= KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KCopyrightProperty,
+ textProperty->Value());
+ AddToFieldExcerptL(textProperty->Value());
+ }
+
+ //Get user genre field
+ CMdEPropertyDef& genrePropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KGenreProperty );
+ if(aObject.Property( genrePropDef, property )!= KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KGenreProperty,
+ textProperty->Value());
+ AddToFieldExcerptL(textProperty->Value());
+ }
+
+ //Get legal property field
+ CMdEPropertyDef& legalPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KLegalProperty );
+ if(aObject.Property( legalPropDef, property )!= KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KLegalProperty,
+ textProperty->Value());
+ AddToFieldExcerptL(textProperty->Value());
+ }
+ //Size property
+ CMdEPropertyDef& sizePropDef = aObjectDef.GetPropertyDefL(MdeConstants::Object::KSizeProperty);
+ if(aObject.Property( sizePropDef, property )!= KErrNotFound)
+ {
+ //Add field to document
+ if( property->Def().PropertyType() == EPropertyUint32 )
+ {
+ CMdEUint32Property& sizeProperty = static_cast < CMdEUint32Property& > (*property );
+ TBuf<32> buf;
+ buf.Format(_L("%u"), sizeProperty.Value());
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::Object::KSizeProperty,
+ buf,
+ CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
+ AddToFieldExcerptL(buf);
+ }
+ }
+ //Get DateTimeOrginal property
+ CMdEPropertyDef& dateTimeOrgPropDef = aObjectDef.GetPropertyDefL(MdeConstants::Image::KDateTimeOriginalProperty);
+ if(aObject.Property( dateTimeOrgPropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ if(EPropertyTime == property->Def().PropertyType())
+ {
+ CMdETimeProperty& timeProperty = static_cast < CMdETimeProperty& > (*property);
+ TDateTime time = timeProperty.Value().DateTime();
+ TBuf<32> buf;
+ buf.Format( KFormatDateTime, time.Year(),
+ time.Month() + 1,
+ time.Day() + 1,
+ time.Hour(),
+ time.Minute());
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::Image::KDateTimeOriginalProperty,
+ buf,
+ CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
+ //Format for excerpt field
+ buf.Format( KExcerptFormat, time.Year(),
+ time.Month() + 1,
+ time.Day() + 1,
+ time.Hour(),
+ time.Minute());
+ AddToFieldExcerptL(buf);
+ }
+ }
+ //Get LastModifiedDate property
+ CMdEPropertyDef& dateTimePropDef = aObjectDef.GetPropertyDefL(MdeConstants::Object::KLastModifiedDateProperty);
if(aObject.Property( dateTimePropDef, property ) != KErrNotFound)
{
//Add field to document
@@ -115,18 +221,30 @@
CMdETimeProperty& timeProperty = static_cast < CMdETimeProperty& > (*property);
TDateTime time = timeProperty.Value().DateTime();
TBuf<32> buf;
- buf.Format( KFormatDateTime, time.Year(),
- time.Month() + 1,
- time.Day() + 1,
- time.Hour(),
- time.Minute(),
- time.Second() );
+ buf.Format( KFormatDateTime, time.Year(),
+ time.Month() + 1,
+ time.Day() + 1,
+ time.Hour(),
+ time.Minute());
+
AddFiledtoDocumentL(*index_item,
- MdeConstants::Image::KDateTimeOriginalProperty,
+ MdeConstants::Object::KLastModifiedDateProperty,
buf,
CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
+ //Format for excerpt field
+ buf.Format( KExcerptFormat, time.Year(),
+ time.Month() + 1,
+ time.Day() + 1,
+ time.Hour(),
+ time.Minute());
+ AddToFieldExcerptL(buf);
}
}
+ if( iExcerpt )
+ {
+ index_item->AddExcerptL(*iExcerpt);
+ }
+
//Latitude error currently
/* TODO- Bhuvi Location is a seperate object for each image object if any such relation
* exist it has to be searched from Relation table and from there we have to open
--- a/harvesterplugins/media/image/traces/OstTraceDefinitions.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/media/image/traces/OstTraceDefinitions.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#ifndef __OSTTRACEDEFINITIONS_H__
#define __OSTTRACEDEFINITIONS_H__
// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
--- a/harvesterplugins/media/mediautils/inc/cpixdocfetcher.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/media/mediautils/inc/cpixdocfetcher.h Thu Jul 22 16:34:05 2010 +0100
@@ -94,6 +94,12 @@
* @param aExtension reference of descriptor buffer to be filled with file extension
*/
void GetExtension(const TDesC& aUri, TDes& aExtension);
+
+ /*
+ * Add the value to excerpt field
+ * @param TDesC& aExcerptValue excerpt value
+ */
+ void AddToFieldExcerptL(const TDesC& aExcerptValue);
protected:
/*
* second phase constructor ConstructL
@@ -103,6 +109,13 @@
* Default constructor
*/
CCPIXDocFetcher(); //Default constructor
+ /*
+ * reset the excerpt
+ */
+ void ResetExcerpt();
+
+ // Excerpt field
+ HBufC* iExcerpt;
private:
/*
* Convert URI to Absolute URI
--- a/harvesterplugins/media/mediautils/src/cpixdocfetcher.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/media/mediautils/src/cpixdocfetcher.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -27,6 +27,7 @@
#define CPIX_MIMETYPE_FIELD L"_mimetype"
#define LCPIX_MIMETYPE_FIELD L"_mimetype"
+const TInt KInitialExcerptLength = 5;
const TInt KStartPosition = 2; //Start position of absolute path
const TInt KDrivePosition = 0; //Drive position in object Uri
const TInt KMaxMediaLength = 14;
@@ -36,6 +37,7 @@
_LIT(KNameField, "Name");
_LIT(KMediaIdField, "MediaId");
_LIT(KExtensionField, "Extension");
+_LIT(KExcerptDelimiter, " ");
// -----------------------------------------------------------------------------
// CCPIXDocFetcher::NewL()
@@ -67,6 +69,7 @@
CCPIXDocFetcher::~CCPIXDocFetcher()
{
iFs.Close();
+ delete iExcerpt;
}
// -----------------------------------------------------------------------------
@@ -77,6 +80,7 @@
{
//Heap variables if any
User::LeaveIfError(iFs.Connect());
+ iExcerpt = NULL;
}
// -----------------------------------------------------------------------------
@@ -89,6 +93,19 @@
}
// -----------------------------------------------------------------------------
+// CCPIXDocFetcher::ResetExcerpt()
+// -----------------------------------------------------------------------------
+//
+void CCPIXDocFetcher::ResetExcerpt()
+ {
+ if(iExcerpt)
+ {
+ delete iExcerpt;
+ iExcerpt = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
// CCPIXDocFetcher::GetCpixDocumentL()
// -----------------------------------------------------------------------------
//
@@ -109,7 +126,8 @@
//Uri is our Document ID
AddFiledtoDocumentL(*index_item,
KNameField, //URI as Name field
- name);
+ name,
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
//Store media ID for client to generate path and launch corresponding Item
TBuf<KMaxMediaLength> mediaBuf;
@@ -126,42 +144,53 @@
//Get the media file extension and store
TBuf<KMaxExtLength> extension;
GetExtension(aObject.Uri(),extension);
- AddFiledtoDocumentL( *index_item, KExtensionField, extension );
+ AddFiledtoDocumentL( *index_item, KExtensionField, extension,
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
CMdEProperty* property(NULL);
CMdEPropertyDef& titlePropDef = aObjectDef.GetPropertyDefL(MdeConstants::Object::KTitleProperty );
+ /*Requirement Excerpt should have all item specific field in priority order so has to be handled
+ *at plugin specific document handler
+ */
if(aObject.Property( titlePropDef, property ) != KErrNotFound)
{
//Add field to document
- CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
if(textProperty->Value() != KNullDesC)
{
AddFiledtoDocumentL(*index_item,
MdeConstants::Object::KTitleProperty,
- textProperty->Value());
- index_item->AddExcerptL(textProperty->Value());
- }
- else
- {
- index_item->AddExcerptL(aObject.Uri());
+ textProperty->Value(),
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
}
}
- else
- {
- //No property title
- index_item->AddExcerptL(aObject.Uri());
- }
+
//Item type as MIME type
CMdEPropertyDef& mimeTypePropDef = aObjectDef.GetPropertyDefL(MdeConstants::Object::KItemTypeProperty);
if(aObject.Property( mimeTypePropDef, property )!= KErrNotFound)
{
//Add field to document
- CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
AddFiledtoDocumentL(*index_item,
_L(CPIX_MIMETYPE_FIELD),
textProperty->Value(),
CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
}
+ //Get ratings field
+ CMdEPropertyDef& ratingsPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KRatingProperty );
+ if(aObject.Property( ratingsPropDef, property )!= KErrNotFound)
+ {
+ //Add field to document
+ if( property->Def().PropertyType() == EPropertyInt32 )
+ {
+ CMdEInt32Property& ratingProperty = static_cast < CMdEInt32Property& > (*property );
+ TBuf<32> buf;
+ buf.Format(_L("%d"), ratingProperty.Value());
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KRatingProperty,
+ buf );
+ }
+ }
CleanupStack::Pop(index_item);//pop up
}
CPIXLOGSTRING("END CCPIXDocFetcher::GetCpixDocumentL");
@@ -214,6 +243,30 @@
}
// -----------------------------------------------------------------------------
+// CCPIXDocFetcher::AddToFieldExcerptL()
+// -----------------------------------------------------------------------------
+//
+void CCPIXDocFetcher::AddToFieldExcerptL(const TDesC& aExcerptValue)
+ {
+ if(!iExcerpt)
+ {
+ iExcerpt = HBufC::NewL(KInitialExcerptLength);
+ }
+ if(aExcerptValue.Compare(KNullDesC) != 0)//value is not Null
+ {
+ TInt currentSize = iExcerpt->Size();
+ TInt newSize = currentSize + aExcerptValue.Size() + 1;
+ if(newSize > currentSize) //New size is bigger so we have to reallocate
+ {
+ iExcerpt = iExcerpt->ReAllocL(newSize);
+ }
+ TPtr ptr = iExcerpt->Des();
+ ptr.Append(aExcerptValue);
+ ptr.Append(KExcerptDelimiter);
+ }
+ }
+
+// -----------------------------------------------------------------------------
// CCPIXDocFetcher::SetAbsoluteURI()
// -----------------------------------------------------------------------------
//
--- a/harvesterplugins/media/video/src/cpixmediavideodoc.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/media/video/src/cpixmediavideodoc.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -24,11 +24,13 @@
#include <mdeobjectdef.h>
#include "harvesterserverlogger.h"
#include "OstTraceDefinitions.h"
+#include "csearchdocument.h"
#ifdef OST_TRACE_COMPILER_IN_USE
#include "cpixmediavideodocTraces.h"
#endif
-
+_LIT( KFormatDateTime, "%04d %02d %02d %02d %02d"); // yyyy mm dd hh mm
+_LIT( KExcerptFormat, "%04d/%02d/%02d %02d:%02d"); //yyyy/mm/dd hh:mm
// -----------------------------------------------------------------------------
// CCPIXDocFetcher::NewL()
// -----------------------------------------------------------------------------
@@ -92,54 +94,233 @@
//Get basic document
CPIXLOGSTRING("CCPIXMediaVideoDoc::GetCpixDocumentL()");
CSearchDocument* index_item = CCPIXDocFetcher::GetCpixDocumentL(aObject,aAppClass,aObjectDef);
+ ResetExcerpt(); //Reset excerpt initially
+ TInt slashpos = GetUri().LocateReverse('\\');
+ TPtrC name = GetUri().Mid( (slashpos+1) );
+
+ CMdEProperty* property(NULL);
+ //Add Name field to document excerpt, ONLY if title field is not empty.
+ CMdEPropertyDef& titlePropDef = aObjectDef.GetPropertyDefL(MdeConstants::Object::KTitleProperty );
+ if(aObject.Property( titlePropDef, property ) != KErrNotFound)
+ {
+ CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
+ if( textProperty->Value().Compare(KNullDesC) > 0 )AddToFieldExcerptL(name); //Add name to excerpt field
+ }
+
//URI and Excerpt is done add additional properties here
- CMdEProperty* property(NULL);
+ CMdEPropertyDef& descriptionPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KDescriptionProperty );
+ if(aObject.Property( descriptionPropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KDescriptionProperty,
+ textProperty->Value());
+ AddToFieldExcerptL(textProperty->Value());
+ }
CMdEPropertyDef& artistPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KArtistProperty );
if(aObject.Property( artistPropDef, property )!= KErrNotFound)
{
//Add field to document
- CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
AddFiledtoDocumentL(*index_item,
MdeConstants::MediaObject::KArtistProperty,
- textProperty->Value());
+ textProperty->Value(),
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+ AddToFieldExcerptL(textProperty->Value());
}
CMdEPropertyDef& authorPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KAuthorProperty );
if(aObject.Property( authorPropDef, property ) != KErrNotFound)
{
- //Add field to document
- CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
- AddFiledtoDocumentL(*index_item,
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
MdeConstants::MediaObject::KAuthorProperty,
- textProperty->Value());
+ textProperty->Value(),
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+ AddToFieldExcerptL(textProperty->Value());
+ }
+
+ CMdEPropertyDef& commentPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KCommentProperty );
+ if(aObject.Property( commentPropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KCommentProperty,
+ textProperty->Value());
+ AddToFieldExcerptL(textProperty->Value());
}
+
+ //Get description property
+ CMdEPropertyDef& descriprionPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KDescriptionProperty );
+ if(aObject.Property( descriprionPropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KDescriptionProperty,
+ textProperty->Value());
+ AddToFieldExcerptL(textProperty->Value());
+ }
+
CMdEPropertyDef& copyrightPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KCopyrightProperty );
if(aObject.Property( copyrightPropDef, property ) != KErrNotFound)
{
- //Add field to document
- CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
- AddFiledtoDocumentL(*index_item,
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
MdeConstants::MediaObject::KCopyrightProperty,
textProperty->Value());
- }
- CMdEPropertyDef& descriptionPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KDescriptionProperty );
- if(aObject.Property( descriptionPropDef, property ) != KErrNotFound)
+ AddToFieldExcerptL(textProperty->Value());
+ }
+ //Get genre property
+ CMdEPropertyDef& genrePropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KGenreProperty );
+ if(aObject.Property( genrePropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KGenreProperty,
+ textProperty->Value());
+ AddToFieldExcerptL(textProperty->Value());
+ }
+ //Size property
+ CMdEPropertyDef& sizePropDef = aObjectDef.GetPropertyDefL(MdeConstants::Object::KSizeProperty);
+ if(aObject.Property( sizePropDef, property )!= KErrNotFound)
+ {
+ //Add field to document
+ if( property->Def().PropertyType() == EPropertyUint32 )
+ {
+ CMdEUint32Property& sizeProperty = static_cast < CMdEUint32Property& > (*property );
+ TBuf<32> buf;
+ buf.Format(_L("%u"), sizeProperty.Value());
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::Object::KSizeProperty,
+ buf,
+ CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
+ AddToFieldExcerptL(buf);
+ }
+ }
+ //Get resolution property
+ CMdEPropertyDef& resolutionPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KResolutionUnitProperty );
+ if(aObject.Property( resolutionPropDef, property ) != KErrNotFound)
{
- //Add field to document
- CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
- AddFiledtoDocumentL(*index_item,
- MdeConstants::MediaObject::KDescriptionProperty,
- textProperty->Value());
+ //Add field to document
+ if( property->Def().PropertyType() == EPropertyUint16 )
+ {
+ CMdEUint16Property& resolutionProperty = static_cast < CMdEUint16Property& > (*property );
+ TBuf<32> buf;
+ buf.Format(_L("%d"), resolutionProperty.Value());
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KResolutionUnitProperty,
+ buf,
+ CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
+ }
+ }
+ //Get legal property
+ CMdEPropertyDef& legalPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KLegalProperty );
+ if(aObject.Property( legalPropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ CMdETextProperty* textProperty = static_cast< CMdETextProperty* > (property );
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KLegalProperty,
+ textProperty->Value());
+ }
+ //Get track property
+ CMdEPropertyDef& trackPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KTrackProperty );
+ if(aObject.Property( trackPropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ if( property->Def().PropertyType() == EPropertyUint16 )
+ {
+ CMdEUint16Property& trackProperty = static_cast < CMdEUint16Property& > (*property );
+ TBuf<32> buf;
+ buf.Format(_L("%d"), trackProperty.Value());
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KTrackProperty,
+ buf);
+ }
}
- CMdEPropertyDef& commentPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KCommentProperty );
- if(aObject.Property( commentPropDef, property ) != KErrNotFound)
+ // Capturedate property
+ CMdEPropertyDef& captureDatePropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KCaptureDateProperty);
+ if(aObject.Property( captureDatePropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ if(EPropertyTime == property->Def().PropertyType())
+ {
+ CMdETimeProperty& timeProperty = static_cast < CMdETimeProperty& > (*property);
+ TDateTime time = timeProperty.Value().DateTime();
+ TBuf<32> buf;
+ buf.Format( KFormatDateTime, time.Year(),
+ time.Month() + 1,
+ time.Day() + 1,
+ time.Hour(),
+ time.Minute());
+
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KCaptureDateProperty,
+ buf,
+ CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
+ //Format for excerpt field
+ buf.Format( KExcerptFormat, time.Year(),
+ time.Month() + 1,
+ time.Day() + 1,
+ time.Hour(),
+ time.Minute());
+ AddToFieldExcerptL(buf);
+ }
+ }
+ //Get LastModifiedDate property
+ CMdEPropertyDef& dateTimePropDef = aObjectDef.GetPropertyDefL(MdeConstants::Object::KLastModifiedDateProperty);
+ if(aObject.Property( dateTimePropDef, property ) != KErrNotFound)
+ {
+ //Add field to document
+ if(EPropertyTime == property->Def().PropertyType())
+ {
+ CMdETimeProperty& timeProperty = static_cast < CMdETimeProperty& > (*property);
+ TDateTime time = timeProperty.Value().DateTime();
+ TBuf<32> buf;
+ buf.Format( KFormatDateTime, time.Year(),
+ time.Month() + 1,
+ time.Day() + 1,
+ time.Hour(),
+ time.Minute());
+
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::Object::KLastModifiedDateProperty,
+ buf,
+ CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
+ //Format for excerpt field
+ buf.Format( KExcerptFormat, time.Year(),
+ time.Month() + 1,
+ time.Day() + 1,
+ time.Hour(),
+ time.Minute());
+ AddToFieldExcerptL(buf);
+ }
+ }
+ //Get duration property
+ CMdEPropertyDef& durationPropDef = aObjectDef.GetPropertyDefL(MdeConstants::MediaObject::KDurationProperty );
+ if(aObject.Property( durationPropDef, property ) != KErrNotFound)
{
- //Add field to document
- CMdETextProperty* textProperty = ( CMdETextProperty* ) property;
- AddFiledtoDocumentL(*index_item,
- MdeConstants::MediaObject::KCommentProperty,
- textProperty->Value());
+ //Add field to document
+ if( property->Def().PropertyType() == EPropertyReal32 )
+ {
+ CMdEReal32Property& durationProperty = static_cast < CMdEReal32Property& > (*property );
+ TBuf<32> buf;
+ buf.Format(_L("%f"), durationProperty.Value());
+ AddFiledtoDocumentL(*index_item,
+ MdeConstants::MediaObject::KDurationProperty,
+ buf,
+ CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
+ }
}
+ if( iExcerpt )
+ {
+ index_item->AddExcerptL(*iExcerpt);
+ }
OstTraceFunctionExit0( CCPIXMEDIAVIDEODOC_GETCPIXDOCUMENTL_EXIT );
return index_item;
}
-
--- a/harvesterplugins/media/video/traces/OstTraceDefinitions.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/media/video/traces/OstTraceDefinitions.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#ifndef __OSTTRACEDEFINITIONS_H__
#define __OSTTRACEDEFINITIONS_H__
// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
--- a/harvesterplugins/messaging/email/qtemailfetcher/bwins/qtemailfetcheru.def Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/email/qtemailfetcher/bwins/qtemailfetcheru.def Thu Jul 22 16:34:05 2010 +0100
@@ -2,24 +2,25 @@
?processMessages@QEmailFetcher@@QAEXH@Z @ 1 NONAME ; void QEmailFetcher::processMessages(int)
?tr@QEmailFetcher@@SA?AVQString@@PBD0@Z @ 2 NONAME ; class QString QEmailFetcher::tr(char const *, char const *)
?StartHarvesting@QEmailFetcher@@QAEXXZ @ 3 NONAME ; void QEmailFetcher::StartHarvesting(void)
- ?getStaticMetaObject@QEmailFetcher@@SAABUQMetaObject@@XZ @ 4 NONAME ; struct QMetaObject const & QEmailFetcher::getStaticMetaObject(void)
- ??1QEmailFetcher@@UAE@XZ @ 5 NONAME ; QEmailFetcher::~QEmailFetcher(void)
- ?processNextMailbox@QEmailFetcher@@AAEXXZ @ 6 NONAME ; void QEmailFetcher::processNextMailbox(void)
- ?trUtf8@QEmailFetcher@@SA?AVQString@@PBD0H@Z @ 7 NONAME ; class QString QEmailFetcher::trUtf8(char const *, char const *, int)
- ??_EQEmailFetcher@@UAE@I@Z @ 8 NONAME ; QEmailFetcher::~QEmailFetcher(unsigned int)
- ?NotifyHarvestingComplete@QEmailFetcher@@AAEXXZ @ 9 NONAME ; void QEmailFetcher::NotifyHarvestingComplete(void)
- ?handleMessageEvent@QEmailFetcher@@QAEXW4MessageEvent@@_K1V?$QList@_K@@@Z @ 10 NONAME ; void QEmailFetcher::handleMessageEvent(enum MessageEvent, unsigned long long, unsigned long long, class QList<unsigned long long>)
- ?initialize@QEmailFetcher@@CAXPAV1@@Z @ 11 NONAME ; void QEmailFetcher::initialize(class QEmailFetcher *)
- ?trUtf8@QEmailFetcher@@SA?AVQString@@PBD0@Z @ 12 NONAME ; class QString QEmailFetcher::trUtf8(char const *, char const *)
- ?qt_metacall@QEmailFetcher@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 13 NONAME ; int QEmailFetcher::qt_metacall(enum QMetaObject::Call, int, void * *)
- ?tr@QEmailFetcher@@SA?AVQString@@PBD0H@Z @ 14 NONAME ; class QString QEmailFetcher::tr(char const *, char const *, int)
- ?staticMetaObject@QEmailFetcher@@2UQMetaObject@@B @ 15 NONAME ; struct QMetaObject const QEmailFetcher::staticMetaObject
- ?handleMailboxesListed@QEmailFetcher@@QAEXH@Z @ 16 NONAME ; void QEmailFetcher::handleMailboxesListed(int)
- ?emailServiceIntialized@QEmailFetcher@@QAEX_N@Z @ 17 NONAME ; void QEmailFetcher::emailServiceIntialized(bool)
- ?processNextFolder@QEmailFetcher@@AAEXXZ @ 18 NONAME ; void QEmailFetcher::processNextFolder(void)
- ?qt_metacast@QEmailFetcher@@UAEPAXPBD@Z @ 19 NONAME ; void * QEmailFetcher::qt_metacast(char const *)
- ?newInstance@QEmailFetcher@@SAPAV1@AAVMEmailItemObserver@@@Z @ 20 NONAME ; class QEmailFetcher * QEmailFetcher::newInstance(class MEmailItemObserver &)
- ?handleMailFoldersListed@QEmailFetcher@@QAEXH@Z @ 21 NONAME ; void QEmailFetcher::handleMailFoldersListed(int)
- ??0QEmailFetcher@@AAE@AAVMEmailItemObserver@@@Z @ 22 NONAME ; QEmailFetcher::QEmailFetcher(class MEmailItemObserver &)
+ ?initialize@QEmailFetcher@@AAEXXZ @ 4 NONAME ; void QEmailFetcher::initialize(void)
+ ?getStaticMetaObject@QEmailFetcher@@SAABUQMetaObject@@XZ @ 5 NONAME ; struct QMetaObject const & QEmailFetcher::getStaticMetaObject(void)
+ ??1QEmailFetcher@@UAE@XZ @ 6 NONAME ; QEmailFetcher::~QEmailFetcher(void)
+ ?getSearchDocumentL@QEmailFetcher@@AAEPAVCSearchDocument@@ABVNmApiMessageEnvelope@EmailClientApi@@_K1@Z @ 7 NONAME ; class CSearchDocument * QEmailFetcher::getSearchDocumentL(class EmailClientApi::NmApiMessageEnvelope const &, unsigned long long, unsigned long long)
+ ?processNextMailbox@QEmailFetcher@@AAEXXZ @ 8 NONAME ; void QEmailFetcher::processNextMailbox(void)
+ ?trUtf8@QEmailFetcher@@SA?AVQString@@PBD0H@Z @ 9 NONAME ; class QString QEmailFetcher::trUtf8(char const *, char const *, int)
+ ??_EQEmailFetcher@@UAE@I@Z @ 10 NONAME ; QEmailFetcher::~QEmailFetcher(unsigned int)
+ ?NotifyHarvestingComplete@QEmailFetcher@@AAEXXZ @ 11 NONAME ; void QEmailFetcher::NotifyHarvestingComplete(void)
+ ?handleMessageEvent@QEmailFetcher@@QAEXW4NmApiMessageEvent@EmailClientApi@@_K1V?$QList@_K@@@Z @ 12 NONAME ; void QEmailFetcher::handleMessageEvent(enum EmailClientApi::NmApiMessageEvent, unsigned long long, unsigned long long, class QList<unsigned long long>)
+ ?trUtf8@QEmailFetcher@@SA?AVQString@@PBD0@Z @ 13 NONAME ; class QString QEmailFetcher::trUtf8(char const *, char const *)
+ ?qt_metacall@QEmailFetcher@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 14 NONAME ; int QEmailFetcher::qt_metacall(enum QMetaObject::Call, int, void * *)
+ ?tr@QEmailFetcher@@SA?AVQString@@PBD0H@Z @ 15 NONAME ; class QString QEmailFetcher::tr(char const *, char const *, int)
+ ?staticMetaObject@QEmailFetcher@@2UQMetaObject@@B @ 16 NONAME ; struct QMetaObject const QEmailFetcher::staticMetaObject
+ ?handleMailboxesListed@QEmailFetcher@@QAEXH@Z @ 17 NONAME ; void QEmailFetcher::handleMailboxesListed(int)
+ ?emailServiceIntialized@QEmailFetcher@@QAEX_N@Z @ 18 NONAME ; void QEmailFetcher::emailServiceIntialized(bool)
+ ?processNextFolder@QEmailFetcher@@AAEXXZ @ 19 NONAME ; void QEmailFetcher::processNextFolder(void)
+ ?qt_metacast@QEmailFetcher@@UAEPAXPBD@Z @ 20 NONAME ; void * QEmailFetcher::qt_metacast(char const *)
+ ?newInstance@QEmailFetcher@@SAPAV1@AAVMEmailItemObserver@@@Z @ 21 NONAME ; class QEmailFetcher * QEmailFetcher::newInstance(class MEmailItemObserver &)
+ ?handleMailFoldersListed@QEmailFetcher@@QAEXH@Z @ 22 NONAME ; void QEmailFetcher::handleMailFoldersListed(int)
?metaObject@QEmailFetcher@@UBEPBUQMetaObject@@XZ @ 23 NONAME ; struct QMetaObject const * QEmailFetcher::metaObject(void) const
+ ??0QEmailFetcher@@AAE@AAVMEmailItemObserver@@@Z @ 24 NONAME ; QEmailFetcher::QEmailFetcher(class MEmailItemObserver &)
--- a/harvesterplugins/messaging/email/qtemailfetcher/eabi/qtemailfetcheru.def Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/email/qtemailfetcher/eabi/qtemailfetcheru.def Thu Jul 22 16:34:05 2010 +0100
@@ -1,5 +1,5 @@
EXPORTS
- _ZN13QEmailFetcher10initializeEPS_ @ 1 NONAME
+ _ZN13QEmailFetcher10initializeEv @ 1 NONAME
_ZN13QEmailFetcher11newInstanceER18MEmailItemObserver @ 2 NONAME
_ZN13QEmailFetcher11qt_metacallEN11QMetaObject4CallEiPPv @ 3 NONAME
_ZN13QEmailFetcher11qt_metacastEPKc @ 4 NONAME
@@ -7,19 +7,20 @@
_ZN13QEmailFetcher15processMessagesEi @ 6 NONAME
_ZN13QEmailFetcher16staticMetaObjectE @ 7 NONAME DATA 16
_ZN13QEmailFetcher17processNextFolderEv @ 8 NONAME
- _ZN13QEmailFetcher18handleMessageEventE12MessageEventyy5QListIyE @ 9 NONAME
- _ZN13QEmailFetcher18processNextMailboxEv @ 10 NONAME
- _ZN13QEmailFetcher19getStaticMetaObjectEv @ 11 NONAME
- _ZN13QEmailFetcher21handleMailboxesListedEi @ 12 NONAME
- _ZN13QEmailFetcher22emailServiceIntializedEb @ 13 NONAME
- _ZN13QEmailFetcher23handleMailFoldersListedEi @ 14 NONAME
- _ZN13QEmailFetcher24NotifyHarvestingCompleteEv @ 15 NONAME
- _ZN13QEmailFetcherC1ER18MEmailItemObserver @ 16 NONAME
- _ZN13QEmailFetcherC2ER18MEmailItemObserver @ 17 NONAME
- _ZN13QEmailFetcherD0Ev @ 18 NONAME
- _ZN13QEmailFetcherD1Ev @ 19 NONAME
- _ZN13QEmailFetcherD2Ev @ 20 NONAME
- _ZNK13QEmailFetcher10metaObjectEv @ 21 NONAME
- _ZTI13QEmailFetcher @ 22 NONAME
- _ZTV13QEmailFetcher @ 23 NONAME
+ _ZN13QEmailFetcher18getSearchDocumentLERKN14EmailClientApi20NmApiMessageEnvelopeEyy @ 9 NONAME
+ _ZN13QEmailFetcher18handleMessageEventEN14EmailClientApi17NmApiMessageEventEyy5QListIyE @ 10 NONAME
+ _ZN13QEmailFetcher18processNextMailboxEv @ 11 NONAME
+ _ZN13QEmailFetcher19getStaticMetaObjectEv @ 12 NONAME
+ _ZN13QEmailFetcher21handleMailboxesListedEi @ 13 NONAME
+ _ZN13QEmailFetcher22emailServiceIntializedEb @ 14 NONAME
+ _ZN13QEmailFetcher23handleMailFoldersListedEi @ 15 NONAME
+ _ZN13QEmailFetcher24NotifyHarvestingCompleteEv @ 16 NONAME
+ _ZN13QEmailFetcherC1ER18MEmailItemObserver @ 17 NONAME
+ _ZN13QEmailFetcherC2ER18MEmailItemObserver @ 18 NONAME
+ _ZN13QEmailFetcherD0Ev @ 19 NONAME
+ _ZN13QEmailFetcherD1Ev @ 20 NONAME
+ _ZN13QEmailFetcherD2Ev @ 21 NONAME
+ _ZNK13QEmailFetcher10metaObjectEv @ 22 NONAME
+ _ZTI13QEmailFetcher @ 23 NONAME
+ _ZTV13QEmailFetcher @ 24 NONAME
--- a/harvesterplugins/messaging/email/qtemailfetcher/qtemailfetcher.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/email/qtemailfetcher/qtemailfetcher.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -17,18 +17,30 @@
#include "qtemailfetcher.h"
#include <csearchdocument.h>
-#include <cpixmaindefs.h>
-//#include <QThread> //If we happen to use QThread::yieldCurrentThread()
+#include <nmapiemailaddress.h>
+#include <nmapimessagebody.h>
+#include <nmapimailbox.h>
+#include <QTimer>
+#include <QDebug>
+#include <qdatetime.h>
//Symbian specific details; picked up from cemailplugin.cpp.
//Refactor it to cpixmaindefs.h
_LIT(KMsgBaseAppClassGeneric, "root msg email");
_LIT(KMsgSubject, "Subject");
+_LIT(KMsgSender, "Sender");
_LIT(KMsgRecipients, "Recipients");
_LIT(KMsgBody, "Body");
+_LIT(KMailBoxId, "MailBoxId");
+_LIT(KFolderId, "FolderId");
+_LIT(KHasAttachment, "HasAttachment");
+_LIT(KMailBoxName, "MailBoxName");
+//_LIT(KFolderName, "FolderName");
_LIT(KMimeTypeField, CPIX_MIMETYPE_FIELD);
_LIT(KMimeTypeMsg, "Messages");
+_LIT(KAttachment, "Attachment");
+_LIT(KSentTime, "SentTime");
//------------------------------------------------------------------------------
QEmailFetcher::QEmailFetcher( MEmailItemObserver& aObserver )
@@ -41,28 +53,36 @@
iCurrentMailboxIndex( 0 ),
iCurrentFolderIndex( 0 )
{
+ qDebug() << "QEmailFetcher::QEmailFetcher";
}
//------------------------------------------------------------------------------
QEmailFetcher::~QEmailFetcher()
{
+ if ( iEmailEventNotifier )
+ iEmailEventNotifier->cancel();
+ iMailBoxes.clear();
+ iFolders.clear();
delete iEmailEventNotifier;
delete iEmailService;
- delete iMailBoxListings;
+ delete iEnvelopeListing;
delete iMailFolderList;
+ delete iMailBoxListings;
}
//------------------------------------------------------------------------------
QEmailFetcher* QEmailFetcher::newInstance( MEmailItemObserver& aObserver ){
QEmailFetcher* emailFetcher = NULL;
-
+ qDebug() << "QEmailFetcher::newInstance :START";
//Leak free init.
try{
- QEmailFetcher* emailFetcher = new QEmailFetcher( aObserver );
- emailFetcher->iEmailService = new NmEmailService( emailFetcher );
- emailFetcher->iEmailEventNotifier = new NmEventNotifier( emailFetcher );
- emailFetcher->iMailBoxListings = new NmMailboxListing( emailFetcher );
+ emailFetcher = new QEmailFetcher( aObserver );
+ emailFetcher->iEmailService = new NmApiEmailService( emailFetcher );
+ emailFetcher->iEmailEventNotifier = new NmApiEventNotifier( emailFetcher );
+ emailFetcher->iMailBoxListings = new NmApiMailboxListing( emailFetcher );
+ emailFetcher->initialize( ); //Do the rest of the init.
}catch(...){ //cleanup.
+ qDebug() << "QEmailFetcher::newInstance ( Catch Block)";
delete emailFetcher;
delete emailFetcher->iEmailService;
delete emailFetcher->iEmailEventNotifier;
@@ -71,33 +91,42 @@
emailFetcher->iEmailEventNotifier = NULL;
emailFetcher->iMailBoxListings = NULL;
throw; //rethrow the exception to caller.
- }
- initialize( emailFetcher ); //Do the rest of the init.
+ }
+ qDebug() << "QEmailFetcher::newInstance :END";
return emailFetcher; //returns only if not null.
}
//------------------------------------------------------------------------------
-void QEmailFetcher::initialize( QEmailFetcher* aThis ){
- //The use of 'aThis' is because the current function is static.
- connect( aThis->iEmailService, SIGNAL(initialized(bool)),
- aThis, SLOT(emailServiceIntialized(bool)) );
- aThis->iEmailService->initialise();
- aThis->connect( aThis->iEmailEventNotifier,
- SIGNAL(messageEvent(MessageEvent, quint64, quint64, QList<quint64>)),
- aThis,
- SLOT(handleMessageEvent(MessageEvent, quint64, quint64, QList<quint64>)) );
+void QEmailFetcher::initialize( ){
+ qDebug() << "QEmailFetcher::initialize :START";
+ connect( iEmailService, SIGNAL(initialized(bool)),
+ this, SLOT(emailServiceIntialized(bool)) );
+ iEmailService->initialise();
+ //Monitor for Message changes
+ connect( iEmailEventNotifier,
+ SIGNAL(messageEvent(EmailClientApi::NmApiMessageEvent, quint64, quint64, QList<quint64>)),
+ this,
+ SLOT(handleMessageEvent(EmailClientApi::NmApiMessageEvent, quint64, quint64, QList<quint64>)) );
+ //Start the monitoring
+ iEmailEventNotifier->start();
+ qDebug() << "QEmailFetcher::Started monitoring for Email message event";
+ qDebug() << "QEmailFetcher::initialize :END";
}
//------------------------------------------------------------------------------
void QEmailFetcher::emailServiceIntialized(bool aAllOk){
+ qDebug() << "QEmailFetcher::emailServiceIntialized :START aAllOk = " << aAllOk;
if( aAllOk ){
- connect( iMailBoxListings, SIGNAL(mailboxesListed(int)), this, SLOT(handleMailboxesListed(int)) );
+ connect( iMailBoxListings, SIGNAL(mailboxesListed(qint32)), this, SLOT(handleMailboxesListed(qint32)) );
}
+ qDebug() << "QEmailFetcher::emailServiceIntialized :END";
}
//------------------------------------------------------------------------------
void QEmailFetcher::StartHarvesting(){
- iMailBoxListings->start();
+ qDebug() << "QEmailFetcher::StartHarvesting :START";
+ bool ret = iMailBoxListings->start();
+ qDebug() << "QEmailFetcher::StartHarvesting :END return = " << ret;
}
//------------------------------------------------------------------------------
@@ -114,75 +143,129 @@
}
//------------------------------------------------------------------------------
-// TODO Remove this code if qt_QString2TPtrC works.
-// TODO If this function is used, remember to release memory.
-// Ownership with caller.
-//HBufC* qt_QString2HBufC(const QString& aString)
-//{
-// HBufC *buffer;
-//#ifdef QT_NO_UNICODE
-// TPtrC8 ptr(reinterpret_cast<const TUint8*>(aString.toLocal8Bit().constData()));
-//#else
-// TPtrC16 ptr(qt_QString2TPtrC(aString));
-//#endif
-// buffer = q_check_ptr(HBufC::New(ptr.Length()));
-// buffer->Des().Copy(ptr);
-// return buffer;
-//}
+CSearchDocument* getPartialSearchDocument( quint64 aEnvelopeId ) {
+ qDebug() << "getPartialSearchDocument :START";
+ CSearchDocument* doc = 0;
+ QT_TRAP_THROWING(
+ //Use qt_Qstring2TPtrC since we are working with <b>const</b> EmailMessageEnvelope.
+ doc = CSearchDocument::NewL( qt_QString2TPtrC( QString().setNum( aEnvelopeId ) ),
+ KMsgBaseAppClassGeneric );
+ );
+ qDebug() << "getPartialSearchDocument :END";
+ return doc;
+ }
+} //anonymous namespace
+//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-//Private free function creates CSearchDocument from EMailMessageEnvelope.
-CSearchDocument* getSearchDocument( const NmMessageEnvelope& aEnvelope ){
- QList<NmEmailAddress> toList;
+CSearchDocument* QEmailFetcher::getSearchDocumentL( const NmApiMessageEnvelope& aEnvelope ,quint64 aMailboxId, quint64 aFolderId ){
+ QList<NmApiEmailAddress> toList;
+ qDebug() << "QEmailFetcher::getSearchDocumentL :START";
+ //We need ALL the recipients in a SINGLE field.
+
//Need to cast away const-ness since the get method is unfortunately not const.
- const_cast<NmMessageEnvelope&>(aEnvelope).getToRecipients( toList );
-
- //We need ALL the recipients in a SINGLE field.
+ const_cast<NmApiMessageEnvelope&>(aEnvelope).getToRecipients( toList );
QString recipients = "";
for( int i=0; i<toList.length(); i++ )
- recipients += toList.at( i ).displayName() + " "; //or should we get address?
-
- NmMessageBody body;
+ {
+ qDebug() << "QEmailFetcher::To receipient displayname :"<< toList.at( i ).displayName() << "Address : "<<toList.at( i ).address();
+ recipients += toList.at( i ).displayName() + " ";
+ recipients += toList.at( i ).address() + " ";
+ }
+ // Get CC receipents
+ const_cast<NmApiMessageEnvelope&>(aEnvelope).getCcRecipients( toList );
+ for( int i=0; i<toList.length(); i++ )
+ {
+ qDebug() << "QEmailFetcher::CC receipient displayname :"<< toList.at( i ).displayName() << "Address : "<<toList.at( i ).address();
+ recipients += toList.at( i ).displayName() + " ";
+ recipients += toList.at( i ).address() + " ";
+ }
+
+ NmApiMessageBody body;
//Cast away const-ness since the get method is unfortunately not const.
//Returns void. Cannot check for success/failure.
- const_cast<NmMessageEnvelope&>(aEnvelope).getPlainTextBody( body );
+ const_cast<NmApiMessageEnvelope&>(aEnvelope).getPlainTextBody( body );
QString msgBody = body.content();
-
+ qDebug() << "QEmailFetcher::Body of mail using paintextAPI:"<< aEnvelope.plainText() ;
CSearchDocument* doc = 0;
QT_TRAP_THROWING(
//Use qt_Qstring2TPtrC since we are working with <b>const</b> EmailMessageEnvelope.
doc = CSearchDocument::NewL( qt_QString2TPtrC( QString().setNum( aEnvelope.id() ) ),
KMsgBaseAppClassGeneric );
- doc->AddFieldL( KMimeTypeField, KMimeTypeMsg, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
- doc->AddFieldL( KMsgSubject, qt_QString2TPtrC( aEnvelope.subject() ), CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
- doc->AddFieldL( KMsgRecipients, qt_QString2TPtrC( recipients ), CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
- doc->AddFieldL( KMsgBody, qt_QString2TPtrC( msgBody ), CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
- //TODO: What should go in here?
- doc->AddExcerptL( KNullDesC );
+ //Add the sender details
+ doc->AddFieldL( KMsgSender, qt_QString2TPtrC( const_cast<NmApiMessageEnvelope&>(aEnvelope).sender() ),
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
+ //Add the Mimetype
+ doc->AddFieldL( KMimeTypeField, KMimeTypeMsg, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized );
+ //Add the Subject field
+ doc->AddFieldL( KMsgSubject, qt_QString2TPtrC( aEnvelope.subject() ),
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
+ //Add the recipients list (Includes To and CC fields)
+ doc->AddFieldL( KMsgRecipients, qt_QString2TPtrC( recipients ),
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText );
+ //Add the email body
+ doc->AddFieldL( KMsgBody, qt_QString2TPtrC( msgBody ),
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
+ //Add the mailboxid
+ doc->AddFieldL( KMailBoxId, qt_QString2TPtrC( QString().setNum( aMailboxId ) ),
+ CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized | CDocumentField::EAggregateNo );
+ //Add the folder Id
+ doc->AddFieldL( KFolderId, qt_QString2TPtrC( QString().setNum( aFolderId ) ),
+ CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized | CDocumentField::EAggregateNo );
+ //Add the attachment field. This field will be added only if there is any attachment.Details of the attachment
+ //are not added due to lack of email application support.
+ if ( aEnvelope.hasAttachments() )
+ doc->AddFieldL( KHasAttachment, KAttachment, CDocumentField::EStoreYes | CDocumentField::EIndexTokenized);
+ //Add mailbox name
+ NmApiMailbox aMailBox;
+ iEmailService->getMailbox( aMailboxId, aMailBox );
+ doc->AddFieldL( KMailBoxName, qt_QString2TPtrC(aMailBox.name()) ,
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText );
+
+ // Sent date time KSentTime
+ QDateTime time = aEnvelope.sentTime();
+ doc->AddFieldL( KSentTime, qt_QString2TPtrC(time.toString ()) ,
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized );
+ //TODO : Foldername is not harvested as there is no API exposed from email application to get the foldername based on folderID.
+ //This feature will be implemented as soon as we get supporting API's from Email team
+
+ //Adding subject and body to the excerpt.
+ QString excerpt ;
+ excerpt = aEnvelope.subject();
+ excerpt += msgBody ;
+ doc->AddExcerptL( qt_QString2TPtrC(excerpt) );
);
+ qDebug() << "QEmailFetcher::getSearchDocumentL :END";
return doc;
}
-} //anonymous namespace
+
//------------------------------------------------------------------------------
-//Just to avoid duplication of the following two lines.
void QEmailFetcher::NotifyHarvestingComplete(){
+ qDebug() << "QEmailFetcher::NotifyHarvestingComplete :START";
iCurrentMailboxIndex = iCurrentFolderIndex = 0;
+ //Free the iMailBoxes and iFolders
+ iMailBoxes.clear();
+ iFolders.clear();
QT_TRAP_THROWING( iEmailObserver.HarvestingCompleted() );
+ qDebug() << "QEmailFetcher::NotifyHarvestingComplete :END";
return;
}
//------------------------------------------------------------------------------
-void QEmailFetcher::handleMailboxesListed(int aCount){
+void QEmailFetcher::handleMailboxesListed(qint32 aCount){
+ qDebug() << "QEmailFetcher::handleMailboxesListed :START";
iCurrentMailboxIndex = 0;
- if( aCount == NmMailboxListing::MailboxListingFailed ) {
+ if( aCount == NmApiMailboxListing::MailboxListingFailed ) {
NotifyHarvestingComplete();
+ qDebug() << "QEmailFetcher::handleMailboxesListed :MailboxListingFailed";
return;
}
if( aCount>0 && iMailBoxListings->getMailboxes( iMailBoxes ) ){
//Already set to NULL in constructor, so safe to call delete first time.
+ qDebug() << "QEmailFetcher::handleMailboxesListed :processNextMailbox";
processNextMailbox();
}else{
+ qDebug() << "QEmailFetcher::handleMailboxesListed :Harvesting Completed";
NotifyHarvestingComplete();
return;
}
@@ -204,30 +287,38 @@
//Recommendation: Use option 4.
void QEmailFetcher::processNextMailbox(){
+ qDebug() << "QEmailFetcher::processNextMailbox :START";
//No more mailboxes, notify completion.
if( iCurrentMailboxIndex >= iMailBoxes.count() ) {
NotifyHarvestingComplete();
+ qDebug() << "QEmailFetcher::processNextMailbox :END (harvesting completed)";
return;
}
-
//More mailboxes available.
delete iMailFolderList; iMailFolderList = NULL;
- iMailFolderList = new NmFolderListing( this, iMailBoxes.at( iCurrentMailboxIndex++ ).id() );
- connect( iMailFolderList, SIGNAL(foldersListed()), this, SLOT(handleMailFoldersListed()) );
- const int waitForSeconds = 30; //TODO Move this constant out of here if needed elsewhere
- QTimer::singleShot( waitForSeconds, iMailFolderList, SLOT( start()) );
+ iMailFolderList = new NmApiFolderListing( this, iMailBoxes.at( iCurrentMailboxIndex++ ).id() );
+ connect( iMailFolderList, SIGNAL(foldersListed( qint32 )), this, SLOT(handleMailFoldersListed( qint32)) );
+ iMailFolderList->start();
+
+// const int waitForSeconds = 30; //TODO Move this constant out of here if needed elsewhere
+// QTimer::singleShot( waitForSeconds, iMailFolderList, SLOT( start()) );
+ qDebug() << "QEmailFetcher::processNextMailbox :END (goto next mailbox)";
}
//------------------------------------------------------------------------------
void QEmailFetcher::handleMailFoldersListed(int aCount){
- iCurrentFolderIndex = 0;
- if( aCount == NmFolderListing::FolderListingFailed ){
+ qDebug() << "QEmailFetcher::handleMailFoldersListed :START";
+ iCurrentFolderIndex = 0;
+ if( aCount == NmApiFolderListing::FolderListingFailed ){
+ qDebug() << "QEmailFetcher::handleMailFoldersListed :FolderListingFailed";
processNextMailbox();
return;//Don't proceed futher.
}
if( aCount && iMailFolderList->getFolders( iFolders ) ){
+ qDebug() << "QEmailFetcher::handleMailFoldersListed :processNextFolder";
processNextFolder();
}else{
+ qDebug() << "QEmailFetcher::handleMailFoldersListed :processNextMailbox";
processNextMailbox();
return;
}
@@ -235,64 +326,71 @@
//------------------------------------------------------------------------------
void QEmailFetcher::processNextFolder(){
+ qDebug() << "QEmailFetcher::processNextFolder :START";
//No more folders in current mailbox.
if( iCurrentFolderIndex >= iFolders.count() ) {
+ qDebug() << "QEmailFetcher::processNextFolder :processNextMailbox";
processNextMailbox();
return;//Don't proceed futher.
}
-
//More folders to process.
//Already set to NULL in constructor, so safe to call delete first time.
delete iEnvelopeListing; iEnvelopeListing = NULL;
- iEnvelopeListing= new NmEnvelopeListing(
+ iEnvelopeListing= new NmApiEnvelopeListing(
this,
iFolders.at( iCurrentFolderIndex++ ).id(),
iMailBoxes.at( iCurrentMailboxIndex-1 ).id() ); //we have already incremented iMailboxIndex.
- connect(iEnvelopeListing, SIGNAL(envelopesListed(int)),this,SLOT(processMessages(int)));
+ connect(iEnvelopeListing, SIGNAL(envelopesListed(qint32)),this,SLOT(processMessages(qint32)));
iEnvelopeListing->start();
+ qDebug() << "QEmailFetcher::processNextFolder :processNextFolder";
}
//------------------------------------------------------------------------------
-void QEmailFetcher::processMessages(int aCount){
- if( aCount == NmEnvelopeListing::EnvelopeListingFailed ) {
+void QEmailFetcher::processMessages(qint32 aCount){
+ qDebug() << "QEmailFetcher::processMessages :START";
+ if( aCount == NmApiEnvelopeListing::EnvelopeListingFailed ) {
+ qDebug() << "QEmailFetcher::processMessages :EnvelopeListingFailed";
processNextFolder();
return;//Don't proceed futher.
}
- QList<NmMessageEnvelope> envelopes;
+ QList<NmApiMessageEnvelope> envelopes;
if ( aCount > 0 && iEnvelopeListing->getEnvelopes(envelopes) ) {
for( int i=0; i<envelopes.count(); i++ ) {
- const NmMessageEnvelope &envelope = envelopes.at( i );
+ const NmApiMessageEnvelope &envelope = envelopes.at( i );
//Create document and call back observer.
- QT_TRAP_THROWING( iEmailObserver.HandleDocumentL( getSearchDocument( envelope ), ECPixAddAction ) );
+ QT_TRAP_THROWING( iEmailObserver.HandleDocumentL( getSearchDocumentL( envelope, iFolders.at( iCurrentFolderIndex -1 ).id(),
+ iMailBoxes.at( iCurrentMailboxIndex-1 ).id() ), ECPixAddAction ) );
}
}
+ qDebug() << "QEmailFetcher::processMessages :END";
}
//------------------------------------------------------------------------------
-void QEmailFetcher::handleMessageEvent( const MessageEvent aEvent, quint64 aMailboxId, quint64 aFolderId, QList<quint64> aMessageList){
- NmMessageEnvelope envelope;
+void QEmailFetcher::handleMessageEvent( EmailClientApi::NmApiMessageEvent aEvent, quint64 aMailboxId, quint64 aFolderId, QList<quint64> aMessageList){
+ NmApiMessageEnvelope envelope;
+ qDebug() << "QEmailFetcher::handleMessageEvent :START";
const int messageCount = aMessageList.count();
if( messageCount>0 ){
if( aEvent == MessageCreated || aEvent == MessageChanged ){
+ qDebug() << "QEmailFetcher::handleMessageEvent :MessageCreated || MessageChanged";
for( int i=0; i<messageCount; i++ ){
if( iEmailService->getEnvelope( aMailboxId, aFolderId, aMessageList.at( i ), envelope ) ){
+ qDebug() << "QEmailFetcher::handleMessageEvent :HandleDocumentL";
QT_TRAP_THROWING(
- iEmailObserver.HandleDocumentL( getSearchDocument( envelope ),
+ iEmailObserver.HandleDocumentL( getSearchDocumentL( envelope, aMailboxId, aFolderId ),
//Doing this simply avoids *duplicate* code for update action.
aEvent == MessageCreated ? ECPixAddAction : ECPixUpdateAction ) );
}
}
}
else if( aEvent == MessageDeleted ) {
- //TODO We can do better. For delete, we dont have to create full document. Just the ID should be enough.
- //We can have another function called getPartialSearchDocument so deletes will be faster.
+ qDebug() << "QEmailFetcher::handleMessageEvent :MessageDeleted";
for( int i=0; i<messageCount; i++ ){
- if( iEmailService->getEnvelope( aMailboxId, aFolderId, aMessageList.at( i ), envelope ) ){
+ qDebug() << "QEmailFetcher::handleMessageEvent :MessageDeleted : HandleDocumentL";
QT_TRAP_THROWING(
- iEmailObserver.HandleDocumentL( getSearchDocument( envelope ), ECPixRemoveAction ) );
+ iEmailObserver.HandleDocumentL( getPartialSearchDocument( aMessageList.at( i ) ), ECPixRemoveAction ) );
}
}
}
- }
}
--- a/harvesterplugins/messaging/email/qtemailfetcher/qtemailfetcher.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/email/qtemailfetcher/qtemailfetcher.h Thu Jul 22 16:34:05 2010 +0100
@@ -32,6 +32,7 @@
#include <nmapimessageenvelope.h>
#include <nmapifolderlisting.h>
#include <QObject>
+#include <nmapifolder.h>
#include "memailitemobserver.h"
using namespace EmailClientApi;
@@ -56,34 +57,33 @@
private:
QEmailFetcher(MEmailItemObserver& aObserver );
- static void initialize(QEmailFetcher* aThis); //helper (2nd phase constructor).
+ void initialize(); //helper (2nd phase constructor).
void processNextMailbox();
void processNextFolder();
void processNextEnvelope();
void NotifyHarvestingComplete();
-
+ CSearchDocument* getSearchDocumentL( const NmApiMessageEnvelope& aEnvelope ,quint64 aMailboxId, quint64 aFolderId );
public slots: //public since they need to be called by *other* objects.
void emailServiceIntialized( bool );
- void handleMailboxesListed( int );
- void handleMailFoldersListed( int );
- void processMessages( int );
+ void handleMailboxesListed( qint32 );
+ void handleMailFoldersListed( qint32 );
+ void processMessages( qint32 );
//Connect to messageEvent signal
- void handleMessageEvent( MessageEvent aEvent, quint64 mailboxId, quint64 folderId, QList<quint64> messageList );
+ void handleMessageEvent( EmailClientApi::NmApiMessageEvent aEvent, quint64 mailboxId, quint64 folderId, QList<quint64> messageList );
private:
MEmailItemObserver& iEmailObserver; //The parent/creator. Not owned.
- NmEventNotifier* iEmailEventNotifier; //owned; triggers handleMessageEvent.
- NmEmailService* iEmailService; //owned.
- NmMailboxListing* iMailBoxListings; //owned.
- NmFolderListing* iMailFolderList; //owned.
- NmEnvelopeListing* iEnvelopeListing; //owned.
- NmMessageEnvelope* iMessageListing; //owned.
+ NmApiEventNotifier* iEmailEventNotifier; //owned; triggers handleMessageEvent.
+ NmApiEmailService* iEmailService; //owned.
+ NmApiMailboxListing* iMailBoxListings; //owned.
+ NmApiFolderListing* iMailFolderList; //owned.
+ NmApiEnvelopeListing* iEnvelopeListing; //owned.
//These are needed to asynchronously process *all* mailboxes/folders.
int iCurrentMailboxIndex;
int iCurrentFolderIndex;
- QList<NmMailbox> iMailBoxes;
- QList<NmFolder> iFolders;
+ QList<NmApiMailbox> iMailBoxes;
+ QList<NmApiFolder> iFolders;
};
#endif //_QEMAILFETCHER_H
--- a/harvesterplugins/messaging/email/qtemailfetcher/qtemailfetcher.pro Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/email/qtemailfetcher/qtemailfetcher.pro Thu Jul 22 16:34:05 2010 +0100
@@ -31,7 +31,7 @@
TARGET.VID = VID_DEFAULT
TARGET.CAPABILITY = CAP_GENERAL_DLL -DRM
VERSION = 1.0.0
-
+ INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
INCLUDEPATH += ../inc
HEADERS += ../inc/memailitemobserver.h
--- a/harvesterplugins/messaging/email/src/cemailplugin.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/email/src/cemailplugin.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -74,8 +74,10 @@
//
CEmailPlugin* CEmailPlugin::NewL()
{
+ CPIXLOGSTRING("CEmailPlugin::NewL : Start");
CEmailPlugin* instance = CEmailPlugin::NewLC();
CleanupStack::Pop(instance);
+ CPIXLOGSTRING("CEmailPlugin::NewL : End");
return instance;
}
@@ -85,9 +87,11 @@
//
CEmailPlugin* CEmailPlugin::NewLC()
{
- CEmailPlugin* instance = new (ELeave)CEmailPlugin();
+ CPIXLOGSTRING("CEmailPlugin::NewLC : Start");
+ CEmailPlugin* instance = new (ELeave)CEmailPlugin();
CleanupStack::PushL(instance);
instance->ConstructL();
+ CPIXLOGSTRING("CEmailPlugin::NewLC : End");
return instance;
}
@@ -135,11 +139,13 @@
//
void CEmailPlugin::StartPluginL()
{
+ CPIXLOGSTRING("CEmailPlugin::StartPluginL : Start");
CPIXLOGSTRING2("currentDrive used is : %d", iCurrentDrive );
MountL(TDriveNumber(iCurrentDrive)); //Mount current drive
//create instance of QEmailFetcher
QT_TRYCATCH_LEAVING(iQEmailFetcher = QEmailFetcher::newInstance(*this));
// Define this base application class, use default location
+ CPIXLOGSTRING("CEmailPlugin::StartPluginL : End");
}
// ---------------------------------------------------------------------------
--- a/harvesterplugins/messaging/group/bld.inf Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/group/bld.inf Thu Jul 22 16:34:05 2010 +0100
@@ -16,4 +16,5 @@
*/
PRJ_MMPFILES
-#include "../smsmms/group/bld.inf"
\ No newline at end of file
+#include "../smsmms/group/bld.inf"
+#include "../email/group/bld.inf"
\ No newline at end of file
--- a/harvesterplugins/messaging/smsmms/inc/cmessagedatahandler.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/smsmms/inc/cmessagedatahandler.h Thu Jul 22 16:34:05 2010 +0100
@@ -35,7 +35,7 @@
class CMessageDataHandler : public CActive
{
-public:
+public:
/**
* Construction
* @return Harvester image plugin
@@ -163,6 +163,9 @@
CPop3ClientMtm* iPop3Mtm; // client for opening pop3
CImap4ClientMtm* iImap4Mtm; // client for opening imap4
RFs iFs;
+#ifdef HARVESTERPLUGINTESTER_FRIEND
+ friend class CHarvesterPluginTester;
+#endif
};
#endif // CMESSAGEDATAHANDLER_H
--- a/harvesterplugins/messaging/smsmms/inc/cmessageharvester.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/smsmms/inc/cmessageharvester.h Thu Jul 22 16:34:05 2010 +0100
@@ -128,7 +128,11 @@
// UID of current folder searched
TMsvId iCurrentFolder;
// Current folder message items
- CMsvEntrySelection* iChildren;
+ CMsvEntrySelection* iChildren;
+
+#ifdef HARVESTERPLUGINTESTER_FRIEND
+ friend class CHarvesterPluginTester;
+#endif
};
#endif // CMESSAGEHARVESTER_H
--- a/harvesterplugins/messaging/smsmms/inc/cmessagemonitor.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/smsmms/inc/cmessagemonitor.h Thu Jul 22 16:34:05 2010 +0100
@@ -114,7 +114,6 @@
TCPixActionType iAction;
TMsvId iFolderId;
};
-
private:
// Queue of documents to be indexed
RArray<TMessageRecord> iMessages;
@@ -127,6 +126,9 @@
CMsvSession& iMsvSession;
CMessagePlugin& iMessagePlugin;
+#ifdef HARVESTERPLUGINTESTER_FRIEND
+ friend class CHarvesterPluginTester;
+#endif
};
#endif // CMESSAGEMONITOR_H
--- a/harvesterplugins/messaging/smsmms/inc/cmessageplugin.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/smsmms/inc/cmessageplugin.h Thu Jul 22 16:34:05 2010 +0100
@@ -141,6 +141,10 @@
TInt iCurrentDrive;
// CPix indexer
CCPixIndexer* iIndexer[EDriveZ+1]; // EDriveZ enum value is 25, so add 1.
+
+#ifdef HARVESTERPLUGINTESTER_FRIEND
+ friend class CHarvesterPluginTester;
+#endif
#ifdef __PERFORMANCE_DATA
TTime iStartTime;
--- a/harvesterplugins/messaging/smsmms/src/cmessagedatahandler.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/smsmms/src/cmessagedatahandler.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -12,7 +12,7 @@
* Contributors:
*
* Description: Harvester message plugin
- *
+*
*/
@@ -42,7 +42,7 @@
/** Number of symbols from MsgBody taken to excerpt */
-const TInt KMsgBodyExcerptSymbols = 90;
+const TInt KMsgBodyExcerptSymbols = 160;
// For Ucs2 detection
const TInt KUtf8BomLength = 3;
@@ -66,7 +66,8 @@
_LIT(KFolderField, FOLDER_FIELD);
_LIT(KBodyField, BODY_FIELD);
_LIT(KSubjectField, SUBJECT_FIELD);
-
+_LIT(KAttachmentField, ATTACHMENT_FIELD);
+_LIT(KValueAttachment, "Attachment");
// ============================ MEMBER FUNCTIONS ===============================
// ---------------------------------------------------------------------------
@@ -197,16 +198,7 @@
if (iMessagePlugin.GetIndexer())
{
TRAPD(err, iMessagePlugin.GetIndexer()->DeleteL(docid_str));
- if (err == KErrNone)
- {
- OstTrace0( TRACE_NORMAL, DUP1_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL(): Document deleted." );
- CPIXLOGSTRING("CMessageDataHandler::CreateMessageIndexItemL(): Document deleted.");
- }
- else
- {
- OstTrace1( TRACE_NORMAL, DUP2_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL;Error in deleting the doc=%d", err );
- CPIXLOGSTRING2("CMessageDataHandler::CreateMessageIndexItemL(): Error %d in deleting the document.", err);
- }
+ OstTrace1( TRACE_NORMAL, DUP7_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL():DeleteL;err=%d", err );
}
return;
}
@@ -223,52 +215,17 @@
case EMsgTypeSms:
{
TRAPD(err, index_item = CreateSmsDocumentL(aMsvId, aFolderId));
- if (err == KErrNone)
- {
- OstTrace0( TRACE_NORMAL, DUP3_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL(): SMS document created." );
- CPIXLOGSTRING("CMessageDataHandler::CreateMessageIndexItemL(): SMS document created.");
- }
- else
- {
- OstTrace1( TRACE_NORMAL, DUP4_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL;Error in creating the sms doc=%d", err );
- CPIXLOGSTRING2("CMessageDataHandler::CreateMessageIndexItemL(): Error %d in creating SMS document.", err);
- }
+ OstTrace1( TRACE_NORMAL, DUP1_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL(): SMS document creation;err=%d", err );
break;
}
case EMsgTypeMms:
{
TRAPD(err, index_item = CreateMmsDocumentL(aMsvId, aFolderId));
- if (err == KErrNone)
- {
- OstTrace0( TRACE_NORMAL, DUP5_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL(): MMS document created." );
- CPIXLOGSTRING("CMessageDataHandler::CreateMessageIndexItemL(): MMS document created.");
- }
- else
- {
- OstTrace1( TRACE_NORMAL, DUP6_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL;Error in creating the mms doc=%d", err );
- CPIXLOGSTRING2("CMessageDataHandler::CreateMessageIndexItemL(): Error %d in creating MMS document.", err);
- }
- break;
- }
- case EMsgTypeEmailPop3:
- case EMsgTypeEmailImap4:
- case EMsgTypeEmailSmtp:
- {
- TRAPD(err, index_item = CreateEmailDocumentL(aMsvId, aFolderId));
- if (err == KErrNone)
- {
- OstTrace0( TRACE_NORMAL, DUP7_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL(): E-mail document created." );
- CPIXLOGSTRING("CMessageDataHandler::CreateMessageIndexItemL(): E-mail document created.");
- }
- else
- {
- OstTrace1( TRACE_NORMAL, DUP8_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL;Error in ccreating the email doc=%d", err );
- CPIXLOGSTRING2("CMessageDataHandler::CreateMessageIndexItemL(): Error %d in creating e-mail document.", err);
- }
+ OstTrace1( TRACE_NORMAL, DUP2_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL(): MMS document created;err=%d", err );
break;
}
case EMsgTypeInvalid:
- // For EMsgTypeDraft there is no way to tell if it was a SMS, MMS or email,
+ // For EMsgTypeDraft there is no way to tell if it was a SMS, MMS ,
// so don't create index_item.
case EMsgTypeDraft:
default:
@@ -301,30 +258,12 @@
if (aActionType == ECPixAddAction)
{
TRAPD(err, iMessagePlugin.GetIndexer()->AddL(*index_item));
- if (err == KErrNone)
- {
- OstTrace0( TRACE_NORMAL, DUP10_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL(): Added." );
- CPIXLOGSTRING("CMessageDataHandler::CreateMessageIndexItemL(): Added.");
- }
- else
- {
- OstTrace1( TRACE_NORMAL, DUP11_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL;Error in Adding=%d", err );
- CPIXLOGSTRING2("CMessageDataHandler::CreateMessageIndexItemL(): Error %d in adding.", err);
- }
+ OstTrace1( TRACE_NORMAL, DUP3_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL(): Added;err=%d", err );
}
else if (aActionType == ECPixUpdateAction)
{
TRAPD(err, iMessagePlugin.GetIndexer()->UpdateL(*index_item));
- if (err == KErrNone)
- {
- OstTrace0( TRACE_NORMAL, DUP12_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL(): Updated." );
- CPIXLOGSTRING("CMessageDataHandler::CreateMessageIndexItemL(): Updated.");
- }
- else
- {
- OstTrace1( TRACE_NORMAL, DUP13_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL;Error in Updating=%d", err );
- CPIXLOGSTRING2("CMessageDataHandler::CreateMessageIndexItemL(): Error %d in updating.", err);
- }
+ OstTrace1( TRACE_NORMAL, DUP4_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML, "CMessageDataHandler::CreateMessageIndexItemL(): Updated;err=%d", err );
}
}
else
@@ -358,7 +297,8 @@
TMsvId service = 0;
iMsvSession.GetEntry(aMsvId, service, entry);
HBufC *fromNameOrNumberBuf = entry.iDetails.AllocLC();
- index_item->AddFieldL(KFromField, *fromNameOrNumberBuf);
+ index_item->AddFieldL(KFromField, *fromNameOrNumberBuf,
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
// Add the recipients as content items
TBuf<64> to_field;
@@ -370,7 +310,8 @@
to_field = KToField;
if (i>0)
to_field.AppendNum(i);
- index_item->AddFieldL(to_field, recipientArray.MdcaPoint(i));
+ index_item->AddFieldL(to_field, recipientArray.MdcaPoint(i),
+ CDocumentField::EStoreYes | CDocumentField::EIndexTokenized | CDocumentField::EIndexFreeText);
}
// Add the body text as a content item
@@ -436,6 +377,11 @@
CMsvStore* msvStore = iMmsMtm->Entry().ReadStoreL();
CleanupStack::PushL( msvStore );
MMsvAttachmentManager& attManager = msvStore->AttachmentManagerL();
+ //Add attachment value field
+ TInt count = attManager.AttachmentCount();
+ if (count > 0)
+ index_item->AddFieldL(KAttachmentField, KValueAttachment);
+
for ( TInt i = 0; i < attManager.AttachmentCount(); i++ )
{
CMsvAttachment* attInfo = attManager.GetAttachmentInfoL(i);
@@ -532,159 +478,75 @@
CleanupStack::Pop(index_item);
return index_item;
}
-
-// ---------------------------------------------------------------------------
-// CMessageDataHandler::CreateEmailDocumentL
-// ---------------------------------------------------------------------------
-//
-CSearchDocument* CMessageDataHandler::CreateEmailDocumentL(const TMsvId& aMsvId, const TMsvId& aFolderId)
- {
- // creating CSearchDocument object with unique ID for this application
- TBuf<KMaxDocId> docid_str;
- docid_str.AppendNum(aMsvId);
- CSearchDocument* index_item = CSearchDocument::NewLC(docid_str, _L(EMAILAPPCLASS));
-
- // Open the message entry
- CMsvEntry* message_entry = CMsvEntry::NewL(iMsvSession, aMsvId, TMsvSelectionOrdering());
- CleanupStack::PushL(message_entry);
-
- // Get body
- CParaFormatLayer* paraFormatLayer = CParaFormatLayer::NewL();
- CleanupStack::PushL(paraFormatLayer);
- CCharFormatLayer* charFormatLayer = CCharFormatLayer::NewL();
- CleanupStack::PushL(charFormatLayer);
- CRichText* richtext = CRichText::NewL(paraFormatLayer, charFormatLayer);
- CleanupStack::PushL(richtext);
- CImEmailMessage* message_body = CImEmailMessage::NewLC(*message_entry);
- message_body->GetBodyTextL(aMsvId, CImEmailMessage::EThisMessageOnly, *richtext, *paraFormatLayer, *charFormatLayer);
-
- // Read the message header
- CMsvStore* message_store = message_entry->ReadStoreL();
- CleanupStack::PushL(message_store);
- CImHeader* header = CImHeader::NewLC();
- header->RestoreL(*message_store);
-
- // Add from field
- index_item->AddFieldL(KFromField, header->From());
-
- // Add the ToRecipients as content items
- TBuf<64> to_field;
- for (TInt i = 0; i < header->ToRecipients().MdcaCount(); i++)
- {
- to_field = KToField;
- if (i>0)
- to_field.AppendNum(i);
- index_item->AddFieldL(to_field, header->ToRecipients().MdcaPoint(i));
- }
-
- // Add the CcRecipients as content items
- TBuf<64> cc_field;
- for (TInt i = 0; i < header->CcRecipients().MdcaCount(); i++)
- {
- cc_field = KCcField;
- if (i>0)
- cc_field.AppendNum(i);
- index_item->AddFieldL(cc_field, header->CcRecipients().MdcaPoint(i));
- }
-
- // Add the BccRecipients as content items
- TBuf<64> bcc_field;
- for (TInt i = 0; i < header->BccRecipients().MdcaCount(); i++)
- {
- bcc_field = KBccField;
- if (i>0)
- bcc_field.AppendNum(i);
- index_item->AddFieldL(bcc_field, header->BccRecipients().MdcaPoint(i));
- }
-
- const TInt richTxtLen = (richtext->DocumentLength() < KMaxDocumentSize) ? richtext->DocumentLength() : KMaxDocumentSize;
- HBufC* body_text = richtext->Read(0).Left(richTxtLen).AllocLC();
-
- // Add subject
- TPtrC subject(header->Subject());
- index_item->AddFieldL(KSubjectField, subject);
-
- // Add message body
- index_item->AddFieldL(KBodyField, *body_text);
-
- // Add excerpt
- HBufC* excerpt = CreateExcerptLC(header->From(), header->ToRecipients(), subject, *body_text, aFolderId);
- index_item->AddExcerptL(*excerpt);
- CleanupStack::PopAndDestroy(excerpt);
-
- // Cleanup everything last item message entry
- CleanupStack::PopAndDestroy(8, message_entry);
-
- // Pop the item
- CleanupStack::Pop(index_item);
- return index_item;
- }
-
// ---------------------------------------------------------------------------
// CMessageDataHandler::CreateExcerptLC
// ---------------------------------------------------------------------------
//
HBufC* CMessageDataHandler::CreateExcerptLC(const TDesC& aFromAddress,
const CDesCArray& aRecipientArray,
- const TDesC& aSubject,
+ const TDesC& /*aSubject*/,
const TDesC& aBodyText,
const TMsvId& aFolderId)
{
+ //Note:Only From/To (as appropriate): and Body: fields to be added to excerpt for now.
+ //See appclass-hierarchy.txt for details.
+
_LIT(KEllipsis, "...");
_LIT(KSpace, " ");
TInt excerptLength = KMsgBodyExcerptSymbols + KEllipsis().Length();
- TMsvEntry entry;
- TMsvId service = 0;
- iMsvSession.GetEntry(aFolderId, service, entry);
- HBufC *folder_str = entry.iDetails.AllocLC();
-
- excerptLength += folder_str->Length();
- excerptLength += KSpace().Length();
+ //Not removing commented out code as this may come back into use in near future.
+// TMsvEntry entry;
+// TMsvId service = 0;
+// iMsvSession.GetEntry(aFolderId, service, entry);
+// HBufC *folder_str = entry.iDetails.AllocLC();
+//
+// excerptLength += folder_str->Length();
+// excerptLength += KSpace().Length();
- if ((aFromAddress.Length() > 0) && (aFolderId == KMsvGlobalInBoxIndexEntryIdValue))
- {
- excerptLength += aFromAddress.Length();
- excerptLength += KSpace().Length();
- }
- if ((aRecipientArray.MdcaCount() > 0) && (aFolderId != KMsvGlobalInBoxIndexEntryIdValue))
- {
- excerptLength += aRecipientArray.MdcaPoint(0).Length();
- excerptLength += KSpace().Length();
- }
- if (aSubject.Length() > 0)
- {
- excerptLength += aSubject.Length();
- excerptLength += KSpace().Length();
- }
+ if( aFolderId == KMsvGlobalInBoxIndexEntryIdValue && aFromAddress.Length() > 0 )
+ {
+ excerptLength += aFromAddress.Length();
+ excerptLength += KSpace().Length();
+ }
+ else if( aFolderId != KMsvGlobalInBoxIndexEntryIdValue && aRecipientArray.MdcaCount() > 0 )
+ {
+ excerptLength += aRecipientArray.MdcaPoint(0).Length();
+ excerptLength += KSpace().Length();
+ }
HBufC* excerpt = HBufC::NewL(excerptLength);
TPtr excerptPtr = excerpt->Des();
- excerptPtr.Copy(*folder_str);
- excerptPtr.Append(KSpace);
+ //Not removing commented out code as this may come back into use in near future.
+// excerptPtr.Copy(*folder_str);
+// excerptPtr.Append(KSpace);
- if ((aFromAddress.Length() > 0) && (aFolderId == KMsvGlobalInBoxIndexEntryIdValue))
- {
- excerptPtr.Append(aFromAddress);
- excerptPtr.Append(KSpace);
- }
- if ((aRecipientArray.MdcaCount() > 0) && (aFolderId != KMsvGlobalInBoxIndexEntryIdValue))
- {
- excerptPtr.Append(aRecipientArray.MdcaPoint(0));
- excerptPtr.Append(KSpace);
- }
- if (aSubject.Length() > 0)
- {
- excerptPtr.Append(aSubject);
- excerptPtr.Append(KSpace);
- }
+ //For inbox items, From: is present while for sent items To: is present.
+ if ((aFromAddress.Length() > 0) && (aFolderId == KMsvGlobalInBoxIndexEntryIdValue))
+ {
+ excerptPtr.Append(aFromAddress);
+ excerptPtr.Append(KSpace);
+ }
+ else if ((aRecipientArray.MdcaCount() > 0) && (aFolderId != KMsvGlobalInBoxIndexEntryIdValue))
+ {
+ excerptPtr.Append(aRecipientArray.MdcaPoint(0));
+ excerptPtr.Append(KSpace);
+ }
+
+ //Not deleting this code as it might have to be brought back into use
+ //in (possibly near) future.
+// if (aSubject.Length() > 0)
+// {
+// excerptPtr.Append(aSubject);
+// excerptPtr.Append(KSpace);
+// }
excerptPtr.Append(aBodyText.Left(KMsgBodyExcerptSymbols));
if (aBodyText.Length() > KMsgBodyExcerptSymbols)
excerptPtr.Append(KEllipsis);
- CleanupStack::PopAndDestroy(folder_str);
+// CleanupStack::PopAndDestroy(folder_str);
CleanupStack::PushL(excerpt);
return excerpt;
}
--- a/harvesterplugins/messaging/smsmms/src/cmessageplugin.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/smsmms/src/cmessageplugin.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -252,11 +252,8 @@
iObserver->RemoveHarvestingQueue(this, baseAppClass);
// Delete the index object
- if (iIndexer[aMedia])
- {
- delete iIndexer[aMedia];
- iIndexer[aMedia] = NULL;
- }
+ delete iIndexer[aMedia];
+ iIndexer[aMedia] = NULL;
// if the aActionType is EFFMmcDismount, then the
// parameter aFilename is the baseAppClass of the Index database
@@ -450,14 +447,15 @@
{
User::Panic(_L("CMessagePlugin PANIC"), KErrServerTerminated);
break;
- }
- case EMsvMtmGroupInstalled:
- case EMsvMtmGroupDeInstalled:
- case EMsvGeneralError: // not used after v5
- case EMsvServerReady:
- case EMsvCorruptedIndexRebuilt:
- case EMsvMediaIncorrect:
- case EMsvCorruptedIndexRebuilding:
+ }
+ // Following commented only for decision coverage
+// case EMsvMtmGroupInstalled:
+// case EMsvMtmGroupDeInstalled:
+// case EMsvGeneralError: // not used after v5
+// case EMsvServerReady:
+// case EMsvCorruptedIndexRebuilt:
+// case EMsvMediaIncorrect:
+// case EMsvCorruptedIndexRebuilding:
default:
{
break;
@@ -485,24 +483,6 @@
CPIXLOGSTRING("CMessagePlugin:CalculateMessageType ### Mms Message ###");
ret = EMsgTypeMms;
}
- else if( aEntry.iMtm.iUid == KUidMsgTypeSMTP.iUid )
- {
- OstTrace0( TRACE_NORMAL, DUP2_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE, "CMessagePlugin:CalculateMessageType ### ESmtpEmail ###" );
- CPIXLOGSTRING("CMessagePlugin:CalculateMessageType ### ESmtpEmail ###");
- ret = EMsgTypeEmailSmtp;
- }
- else if( aEntry.iMtm.iUid == KUidMsgTypePOP3.iUid )
- {
- OstTrace0( TRACE_NORMAL, DUP3_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE, "CMessagePlugin:CalculateMessageType ### EPop3Email ###" );
- CPIXLOGSTRING("CMessagePlugin:CalculateMessageType ### EPop3Email ###");
- ret = EMsgTypeEmailPop3;
- }
- else if( aEntry.iMtm.iUid == KUidMsgTypeIMAP4.iUid )
- {
- OstTrace0( TRACE_NORMAL, DUP4_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE, "CMessagePlugin:CalculateMessageType ### EImap4Email ###" );
- CPIXLOGSTRING("CMessagePlugin:CalculateMessageType ### EImap4Email ###");
- ret = EMsgTypeEmailImap4;
- }
// Add J.J
#ifndef __SERIES60_30__ // Not supported before S60 3d FP1
else if ( aEntry.iMtm.iUid == KSenduiMtmUniMessageUid.iUid )
--- a/harvesterplugins/messaging/smsmms/traces/OstTraceDefinitions.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/smsmms/traces/OstTraceDefinitions.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#ifndef __OSTTRACEDEFINITIONS_H__
#define __OSTTRACEDEFINITIONS_H__
// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
--- a/harvesterplugins/messaging/smsmms/traces/cmessagedatahandlerTraces.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/smsmms/traces/cmessagedatahandlerTraces.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,4 +1,4 @@
-// Created by TraceCompiler 2.1.2
+// Created by TraceCompiler 2.2.3
// DO NOT EDIT, CHANGES WILL BE LOST
#ifndef __CMESSAGEDATAHANDLERTRACES_H__
@@ -19,15 +19,8 @@
#define DUP2_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML 0x860007
#define DUP3_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML 0x860008
#define DUP4_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML 0x860009
-#define DUP5_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML 0x86000a
-#define DUP6_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML 0x86000b
#define DUP7_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML 0x86000c
-#define DUP8_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML 0x86000d
#define DUP9_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML 0x86000e
-#define DUP10_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML 0x86000f
-#define DUP11_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML 0x860010
-#define DUP12_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML 0x860011
-#define DUP13_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML 0x860012
#define DUP14_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML 0x860013
#define CMESSAGEDATAHANDLER_RUNL 0x860014
#define CMESSAGEDATAHANDLER_RUNERROR 0x860015
--- a/harvesterplugins/messaging/smsmms/traces/cmessagemonitorTraces.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/smsmms/traces/cmessagemonitorTraces.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,4 +1,4 @@
-// Created by TraceCompiler 2.1.2
+// Created by TraceCompiler 2.2.3
// DO NOT EDIT, CHANGES WILL BE LOST
#ifndef __CMESSAGEMONITORTRACES_H__
--- a/harvesterplugins/messaging/smsmms/traces/cmessagepluginTraces.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/smsmms/traces/cmessagepluginTraces.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,4 +1,4 @@
-// Created by TraceCompiler 2.1.2
+// Created by TraceCompiler 2.2.3
// DO NOT EDIT, CHANGES WILL BE LOST
#ifndef __CMESSAGEPLUGINTRACES_H__
@@ -27,9 +27,6 @@
#define DUP3_CMESSAGEPLUGIN_HANDLESESSIONEVENTL 0x860025
#define CMESSAGEPLUGIN_CALCULATEMESSAGETYPE 0x860026
#define DUP1_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE 0x860027
-#define DUP2_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE 0x860028
-#define DUP3_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE 0x860029
-#define DUP4_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE 0x86002a
#define DUP5_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE 0x86002b
#define DUP6_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE 0x86002c
#define DUP7_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE 0x86002d
--- a/harvesterplugins/messaging/smsmms/traces/fixed_id.definitions Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/messaging/smsmms/traces/fixed_id.definitions Thu Jul 22 16:34:05 2010 +0100
@@ -40,10 +40,6 @@
[TRACE]TRACE_NORMAL[0x86]_CMESSAGEPLUGIN_HANDLESESSIONEVENTL=0x22
[TRACE]TRACE_NORMAL[0x86]_CMESSAGEPLUGIN_MOUNTL=0x21
[TRACE]TRACE_NORMAL[0x86]_CMESSAGEPLUGIN_STARTPLUGINL=0x20
-[TRACE]TRACE_NORMAL[0x86]_DUP10_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0xf
-[TRACE]TRACE_NORMAL[0x86]_DUP11_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0x10
-[TRACE]TRACE_NORMAL[0x86]_DUP12_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0x11
-[TRACE]TRACE_NORMAL[0x86]_DUP13_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0x12
[TRACE]TRACE_NORMAL[0x86]_DUP14_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0x13
[TRACE]TRACE_NORMAL[0x86]_DUP1_CMESSAGEDATAHANDLER_CONSTRUCTL=0x2
[TRACE]TRACE_NORMAL[0x86]_DUP1_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0x6
@@ -53,22 +49,26 @@
[TRACE]TRACE_NORMAL[0x86]_DUP1_CMESSAGEPLUGIN_HANDLESESSIONEVENTL=0x23
[TRACE]TRACE_NORMAL[0x86]_DUP2_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0x7
[TRACE]TRACE_NORMAL[0x86]_DUP2_CMESSAGEMONITOR_HANDLEMSGCREATEDCHANGEDL=0x19
-[TRACE]TRACE_NORMAL[0x86]_DUP2_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE=0x28
[TRACE]TRACE_NORMAL[0x86]_DUP2_CMESSAGEPLUGIN_HANDLESESSIONEVENTL=0x24
[TRACE]TRACE_NORMAL[0x86]_DUP3_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0x8
-[TRACE]TRACE_NORMAL[0x86]_DUP3_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE=0x29
[TRACE]TRACE_NORMAL[0x86]_DUP3_CMESSAGEPLUGIN_HANDLESESSIONEVENTL=0x25
[TRACE]TRACE_NORMAL[0x86]_DUP4_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0x9
[TRACE]TRACE_NORMAL[0x86]_DUP4_CMESSAGEMONITOR_HANDLEMSGCREATEDCHANGEDL=0x1a
-[TRACE]TRACE_NORMAL[0x86]_DUP4_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE=0x2a
-[TRACE]TRACE_NORMAL[0x86]_DUP5_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0xa
[TRACE]TRACE_NORMAL[0x86]_DUP5_CMESSAGEMONITOR_HANDLEMSGCREATEDCHANGEDL=0x1b
[TRACE]TRACE_NORMAL[0x86]_DUP5_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE=0x2b
-[TRACE]TRACE_NORMAL[0x86]_DUP6_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0xb
[TRACE]TRACE_NORMAL[0x86]_DUP6_CMESSAGEMONITOR_HANDLEMSGCREATEDCHANGEDL=0x1c
[TRACE]TRACE_NORMAL[0x86]_DUP6_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE=0x2c
[TRACE]TRACE_NORMAL[0x86]_DUP7_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0xc
[TRACE]TRACE_NORMAL[0x86]_DUP7_CMESSAGEMONITOR_HANDLEMSGCREATEDCHANGEDL=0x1d
[TRACE]TRACE_NORMAL[0x86]_DUP7_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE=0x2d
-[TRACE]TRACE_NORMAL[0x86]_DUP8_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0xd
[TRACE]TRACE_NORMAL[0x86]_DUP9_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0xe
+[[OBSOLETE]][TRACE]TRACE_NORMAL[0x86]_DUP10_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0xf
+[[OBSOLETE]][TRACE]TRACE_NORMAL[0x86]_DUP11_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0x10
+[[OBSOLETE]][TRACE]TRACE_NORMAL[0x86]_DUP12_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0x11
+[[OBSOLETE]][TRACE]TRACE_NORMAL[0x86]_DUP13_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0x12
+[[OBSOLETE]][TRACE]TRACE_NORMAL[0x86]_DUP2_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE=0x28
+[[OBSOLETE]][TRACE]TRACE_NORMAL[0x86]_DUP3_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE=0x29
+[[OBSOLETE]][TRACE]TRACE_NORMAL[0x86]_DUP4_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE=0x2a
+[[OBSOLETE]][TRACE]TRACE_NORMAL[0x86]_DUP5_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0xa
+[[OBSOLETE]][TRACE]TRACE_NORMAL[0x86]_DUP6_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0xb
+[[OBSOLETE]][TRACE]TRACE_NORMAL[0x86]_DUP8_CMESSAGEDATAHANDLER_CREATEMESSAGEINDEXITEML=0xd
--- a/harvesterplugins/notes/src/notesplugin.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/notes/src/notesplugin.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -53,7 +53,7 @@
_LIT(KNpdUpdateTime , "Date");
//Reference from CPix calender harvester plugin.
-_LIT(KNotesTimeFormat , "%F%/0%Y%M%D%H%T"); // Locale independent YYYYMMDDHHMM
+_LIT(KNotesTimeFormat,"%04d %02d %02d %02d %02d");
// ---------------------------------------------------------------------------
// CNotesPlugin::NewL
@@ -346,19 +346,25 @@
index_item->AddFieldL(KNpdMemo, entry->DescriptionL());
// Add Date fields
TBuf<30> dateString;
- TTime endTime = entry->EndTimeL().TimeUtcL();
- endTime.FormatL(dateString, KNotesTimeFormat);
+ TDateTime datetime = entry->EndTimeL().TimeUtcL().DateTime();
+ dateString.Format( KNotesTimeFormat, datetime.Year(),
+ TInt(datetime.Month()+ 1),
+ datetime.Day() + 1,
+ datetime.Hour()+ 1,
+ datetime.Minute());
+
index_item->AddFieldL(KNpdUpdateTime, dateString, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
index_item->AddFieldL(KMimeTypeField, KMimeTypeNotes, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
- TInt excerptLength = entry->DescriptionL().Length();
- HBufC* excerpt = HBufC::NewLC(excerptLength);
- TPtr excerptDes = excerpt->Des();
- excerptDes.Append(entry->DescriptionL());
-
- index_item->AddExcerptL(*excerpt);
- CleanupStack::PopAndDestroy(excerpt);
+ //For notes, no content is expected in excerpt for now.
+ //See appclass-hierarchy.txt for details.
+// TInt excerptLength = entry->DescriptionL().Length();
+// HBufC* excerpt = HBufC::NewLC(excerptLength);
+// TPtr excerptDes = excerpt->Des();
+// excerptDes.Append(entry->DescriptionL());
+// index_item->AddExcerptL(*excerpt);
+// CleanupStack::PopAndDestroy(excerpt);
// Send for indexing
if (aActionType == ECPixAddAction)
--- a/harvesterplugins/notes/traces/OstTraceDefinitions.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/notes/traces/OstTraceDefinitions.h Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#ifndef __OSTTRACEDEFINITIONS_H__
#define __OSTTRACEDEFINITIONS_H__
// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler
--- a/harvesterplugins/tsrc/harvesterplugintester/conf/harvesterplugintester.cfg Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/tsrc/harvesterplugintester/conf/harvesterplugintester.cfg Thu Jul 22 16:34:05 2010 +0100
@@ -91,6 +91,111 @@
[Endtest]
[Test]
+title TestMessageMountNoIndexerL
+create HarvesterPluginTester foobar
+foobar TestMessageMountNoIndexerL
+delete foobar
+[Endtest]
+
+[Test]
+title TestMessageIsMediaRemovableL
+create HarvesterPluginTester foobar
+foobar TestMessageIsMediaRemovableL 0 1 2 3
+delete foobar
+[Endtest]
+
+[Test]
+title TestMessageRunErrorL
+create HarvesterPluginTester foobar
+foobar TestMessageRunErrorL
+delete foobar
+[Endtest]
+
+[Test]
+title TestQualifiedBaseAppClass
+create HarvesterPluginTester foobar
+foobar TestQualifiedBaseAppClass
+delete foobar
+[Endtest]
+
+[Test]
+title TestHandleMsgMoved
+create HarvesterPluginTester foobar
+foobar TestHandleMsgMoved
+delete foobar
+[Endtest]
+
+[Test]
+title TestMessageDataHandler
+create HarvesterPluginTester foobar
+foobar TestMessageDataHandler
+delete foobar
+[Endtest]
+
+[Test]
+title TestMsgUnMount
+create HarvesterPluginTester foobar
+foobar TestMsgUnMount
+delete foobar
+[Endtest]
+
+[Test]
+title TestFormFormBaseAppClass
+create HarvesterPluginTester foobar
+foobar TestFormFormBaseAppClass
+delete foobar
+[Endtest]
+
+[Test]
+title TestMsgDelete
+create HarvesterPluginTester foobar
+foobar TestMsgDelete
+delete foobar
+[Endtest]
+
+[Test]
+title TestMsgHandlesession
+create HarvesterPluginTester foobar
+foobar TestMsgHandlesession
+delete foobar
+[Endtest]
+
+[Test]
+title TestMsgHandlesessionPanic
+create HarvesterPluginTester foobar
+foobar TestMsgHandlesessionPanic 0
+delete foobar
+[Endtest]
+
+[Test]
+title TestMsgHandlesessionPanic
+create HarvesterPluginTester foobar
+foobar TestMsgHandlesessionPanic 1
+delete foobar
+[Endtest]
+
+[Test]
+title TestMsgHandlesessionPanic
+create HarvesterPluginTester foobar
+foobar TestMsgHandlesessionPanic 2
+delete foobar
+[Endtest]
+
+[Test]
+title TestMsgOverwriteOrAddToQuere
+create HarvesterPluginTester foobar
+foobar TestMsgOverwriteOrAddToQuere
+delete foobar
+[Endtest]
+
+[Test]
+title TestMsgMessageHarvester
+create HarvesterPluginTester foobar
+foobar TestMsgMessageHarvester
+delete foobar
+[Endtest]
+
+[Test]
title TestAddBookmarkL
create HarvesterPluginTester foobar
foobar TestAddBookmarkL TestBookmark http:\/\/testbookmark.com testbookmark.com
@@ -193,6 +298,13 @@
[Endtest]
[Test]
+title TestCreateAllContactFields
+create HarvesterPluginTester foobar
+foobar TestCreateAllContactFields And
+delete foobar
+[Endtest]
+
+[Test]
title TestCreateContactIndexItemL_Edit
create HarvesterPluginTester foobar
foobar TestCreateContactIndexItemL_Edit update ContactNew ContactModified
@@ -207,6 +319,48 @@
[Endtest]
[Test]
+title TestCreateContactIndexItemNoIndexerL
+create HarvesterPluginTester foobar
+foobar TestCreateContactIndexItemNoIndexerL
+delete foobar
+[Endtest]
+
+[Test]
+title TestContactGetDateL
+create HarvesterPluginTester foobar
+foobar TestContactGetDateL 2010-11-30
+delete foobar
+[Endtest]
+
+[Test]
+title TestContactDelayedErrorL
+create HarvesterPluginTester foobar
+foobar TestContactDelayedErrorL
+delete foobar
+[Endtest]
+
+[Test]
+title TestContactDelayedCallbackNoIContactsL
+create HarvesterPluginTester foobar
+foobar TestContactDelayedCallbackNoIContactsL
+delete foobar
+[Endtest]
+
+[Test]
+title TestContactDelayedCallbackNoIObserverL
+create HarvesterPluginTester foobar
+foobar TestContactDelayedCallbackNoIObserverL
+delete foobar
+[Endtest]
+
+[Test]
+title TestContactDelayedCallbackWrongCountL
+create HarvesterPluginTester foobar
+foobar TestContactDelayedCallbackWrongCountL
+delete foobar
+[Endtest]
+
+[Test]
title TestCreateContactGroup
create HarvesterPluginTester foobar
foobar TestCreateContactGroup TestGroup
@@ -249,6 +403,20 @@
[Endtest]
[Test]
+title TestAudioHarvestingUpdateIndex
+create HarvesterPluginTester foobar
+foobar TestAudioHarvestingUpdateIndex c:\data\eagle_landed.mp3 eagle_landed.mp3 testaudio.mp3
+delete foobar
+[Endtest]
+
+[Test]
+title TestAudioHarvestingDeleteIndex
+create HarvesterPluginTester foobar
+foobar TestAudioHarvestingDeleteIndex c:\data\eagle_landed.mp3 eagle_landed.mp3
+delete foobar
+[Endtest]
+
+[Test]
title TestMdsSyncController
create HarvesterPluginTester foobar
foobar TestMdsSyncController
@@ -261,6 +429,7 @@
foobar TestVideoHarvestingIndex c:\data\Niagara.wmv Niagara.wmv
delete foobar
[Endtest]
+
[Test]
title TestVideoHarvestingUpdateIndex
create HarvesterPluginTester foobar
@@ -278,21 +447,21 @@
[Test]
title TestImageHarvestingAddIndex
create HarvesterPluginTester foobar
-foobar TestImageHarvestingAddIndex c:\data\Square.jpg Square.jpg
+foobar TestImageHarvestingAddIndex c:\data\square.jpg square.jpg
delete foobar
[Endtest]
[Test]
title TestImageHarvestingUpdateIndex
create HarvesterPluginTester foobar
-foobar TestImageHarvestingUpdateIndex c:\data\Square.jpg Square.jpg Portrait.jpg
+foobar TestImageHarvestingUpdateIndex c:\data\square.jpg square.jpg portrait.jpg
delete foobar
[Endtest]
[Test]
title TestImageHarvestingDeleteIndex
create HarvesterPluginTester foobar
-foobar TestImageHarvestingDeleteIndex c:\data\Square.jpg Square.jpg
+foobar TestImageHarvestingDeleteIndex c:\data\square.jpg square.jpg
delete foobar
[Endtest]
@@ -337,3 +506,17 @@
foobar TestImageMMCEventL 2 1
delete foobar
[Endtest]
+
+[Test]
+title TestStartEmailPlugin
+create HarvesterPluginTester foobar
+foobar TestStartEmailPlugin
+delete foobar
+[Endtest]
+
+[Test]
+title TestHandleEmailDoc
+create HarvesterPluginTester foobar
+foobar TestHandleEmailDoc
+delete foobar
+[Endtest]
Binary file harvesterplugins/tsrc/harvesterplugintester/conf/square.jpg has changed
--- a/harvesterplugins/tsrc/harvesterplugintester/group/bld.inf Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/tsrc/harvesterplugintester/group/bld.inf Thu Jul 22 16:34:05 2010 +0100
@@ -33,6 +33,7 @@
../conf/testfile.txt /epoc32/winscw/c/data/testfile.txt
../conf/eagle_landed.mp3 /epoc32/winscw/c/data/eagle_landed.mp3
../conf/niagara.wmv /epoc32/winscw/c/data/niagara.wmv
+../conf/square.jpg /epoc32/winscw/c/data/square.jpg
//Note: Export for ROM build
../conf/testframework.ini z:/system/data/testframework.ini
--- a/harvesterplugins/tsrc/harvesterplugintester/group/harvesterplugintester.mmp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/tsrc/harvesterplugintester/group/harvesterplugintester.mmp Thu Jul 22 16:34:05 2010 +0100
@@ -39,6 +39,7 @@
OS_LAYER_SYSTEMINCLUDE
SYSTEMINCLUDE /epoc32/include/ecom
SYSTEMINCLUDE /epoc32/include/mmf/common
+SYSTEMINCLUDE /epoc32/include/mw
SOURCEPATH ../src
@@ -77,6 +78,13 @@
// DEFFILE ?filename
// AIF ?filename
+//Used for adding friend classes for unit testing
+//Example (in class header file):
+//#ifdef HARVESTERPLUGINTESTER_FRIEND
+// friend class CHarvesterPluginTester
+//#endif
+MACRO HARVESTERPLUGINTESTER_FRIEND
+
//------------------------Added for testing FilePlugin-------------------
USERINCLUDE ./../../../file/inc
USERINCLUDE ./../../../file/inc/monitorplugin
@@ -206,6 +214,29 @@
SOURCE imageplugin.cpp
//------------------End for image plugin -----------------------------
+//---------------Additions for Email plugin----------------------------
+USERINCLUDE ./../../../messaging/email/inc
+USERINCLUDE ./../../../messaging/email/qtemailfetcher
+SOURCEPATH ./../../../messaging/email/src
+
+SOURCE cemailplugin.cpp
+
+SYSTEMINCLUDE /epoc32/include/mw/QtCore
+SYSTEMINCLUDE /epoc32/include/stdapis
+SYSTEMINCLUDE /epoc32/include/stdapis/sys
+SYSTEMINCLUDE .
+SYSTEMINCLUDE /epoc32/include/stdapis/stlport
+
+
+LIBRARY qtemailfetcher.lib
+LIBRARY qtcore.lib
+LIBRARY libstdcpp.lib
+
+OPTION CW -wchar_t on
+MACRO _WCHAR_T_DECLARED
+//EPOCALLOWDLLDATA
+//------------------End for Eail plugin -----------------------------
+
USERINCLUDE ../../../applications/traces
USERINCLUDE ../../../bookmarks/traces
USERINCLUDE ../../../calendar/traces
--- a/harvesterplugins/tsrc/harvesterplugintester/inc/ccalendarobserver.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/tsrc/harvesterplugintester/inc/ccalendarobserver.h Thu Jul 22 16:34:05 2010 +0100
@@ -24,7 +24,7 @@
#include "calprogresscallback.h"
_LIT8(KGuid, "AGlobalUid");
-class CCalendarObserver : public MCalProgressCallBack
+class CCalendarObserver : public CBase, public MCalProgressCallBack
{
public:
static CCalendarObserver* NewL();
@@ -41,6 +41,7 @@
TBool NotifyProgress();
void AddEntryL();
+ void UpdateCalenderEntryL();
void DeleteEntryL();
void AddNoteL( TPtr8 aMemo);
void DeleteNoteEntryL();
--- a/harvesterplugins/tsrc/harvesterplugintester/inc/cmessagesessionobserver.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/tsrc/harvesterplugintester/inc/cmessagesessionobserver.h Thu Jul 22 16:34:05 2010 +0100
@@ -20,7 +20,7 @@
#include <msvapi.h>
-class CMessageSessionObserver : public MMsvSessionObserver
+class CMessageSessionObserver : public CBase, public MMsvSessionObserver
{
public:
static CMessageSessionObserver* NewL();
--- a/harvesterplugins/tsrc/harvesterplugintester/inc/harvesterobserver.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/tsrc/harvesterplugintester/inc/harvesterobserver.h Thu Jul 22 16:34:05 2010 +0100
@@ -40,7 +40,7 @@
//from MIndexingService
void AddHarvestingQueue(CIndexingPlugin* aPlugin, const TDesC& aQualifiedBaseAppClass, TBool aForceReharvest = EFalse);
- void RemoveHarvestingQueue(CIndexingPlugin* /*aPlugin*/, const TDesC& /*aQualifiedBaseAppClass*/) {};
+ void RemoveHarvestingQueue(CIndexingPlugin* /*aPlugin*/, const TDesC& /*aQualifiedBaseAppClass*/, TBool /*aRemovePersist = EFalse*/){};
void HarvestingCompleted(CIndexingPlugin* aPlugin, const TDesC& aQualifiedBaseAppClass, TInt aError);
private:
--- a/harvesterplugins/tsrc/harvesterplugintester/inc/harvesterplugintester.h Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/tsrc/harvesterplugintester/inc/harvesterplugintester.h Thu Jul 22 16:34:05 2010 +0100
@@ -51,7 +51,7 @@
// FORWARD DECLARATIONS
//class ?FORWARD_CLASSNAME;
class CHarvesterPluginTester;
-
+class CSearchDocument;
// DATA TYPES
//enum ?declaration
//typedef ?declaration
@@ -152,7 +152,7 @@
*/
virtual TInt TestStartHarvesterL( CStifItemParser& aItem );
- virtual TInt TestFormBaseAppClass( CStifItemParser& aItem );
+ virtual TInt TestFormBaseAppClassL( CStifItemParser& aItem );
virtual TInt TestDatabasePathL( CStifItemParser& aItem );
@@ -186,6 +186,12 @@
*/
virtual TInt TestMessageHarvesterChangeDriveL( CStifItemParser& aItem );
+ virtual TInt TestMessageRunErrorL( CStifItemParser& aItem );
+
+ virtual TInt TestMessageIsMediaRemovableL( CStifItemParser& aItem );
+
+ virtual TInt TestMessageMountNoIndexerL( CStifItemParser& aItem );
+
virtual TInt TestStartBookmarksHarvesterL( CStifItemParser& aItem );
virtual TInt TestAddBookmarkL( CStifItemParser& aItem );
@@ -215,6 +221,20 @@
virtual TInt TestCreateContactIndexItemL( CStifItemParser& aItem );
+ virtual TInt TestCreateContactIndexItemNoIndexerL( CStifItemParser& aItem );
+
+ virtual TInt TestContactGetDateL( CStifItemParser& aItem );
+
+ virtual TInt TestContactDelayedErrorL( CStifItemParser& aItem );
+
+ virtual TInt TestContactDelayedCallbackNoIContactsL( CStifItemParser& aItem );
+
+ virtual TInt TestContactDelayedCallbackNoIObserverL( CStifItemParser& aItem );
+
+ virtual TInt TestContactDelayedCallbackWrongCountL( CStifItemParser& aItem );
+
+ virtual TInt TestCreateAllContactFieldsL( CStifItemParser& aItem );
+
virtual TInt TestCreateContactGroupL( CStifItemParser& aItem );
virtual TInt TestStartCalenderHarvesterL( CStifItemParser& aItem );
@@ -227,6 +247,10 @@
virtual TInt TestAudioHarvestingL( CStifItemParser& aItem );
+ virtual TInt TestAudioHarvestingUpdateIndexL( CStifItemParser& aItem );
+
+ virtual TInt TestAudioHarvestingDeleteIndexL( CStifItemParser& aItem );
+
virtual TInt TestMdsSyncControllerL( CStifItemParser& aItem );
virtual TInt TestBlacklistPluginL( CStifItemParser& aItem );
@@ -250,6 +274,32 @@
virtual TInt TestVideoMMCEventL( CStifItemParser& aItem );
virtual TInt TestImageMMCEventL( CStifItemParser& aItem );
+
+ virtual TInt TestStartEmailPluginL( CStifItemParser& aItem );
+
+ CSearchDocument* prepareemaildocument();
+
+ virtual TInt TestHandleEmailDocL( CStifItemParser& aItem );
+
+ virtual TInt TestQualifiedBaseAppClassL( CStifItemParser& );
+
+ virtual TAny TestHandleMsgMovedL( CStifItemParser& );
+
+ virtual TAny TestMessageDataHandlerL( CStifItemParser& );
+
+ virtual TInt TestMsgUnMountL( CStifItemParser& );
+
+ virtual TInt TestFormFormBaseAppClassL( CStifItemParser& );
+
+ virtual TInt TestMsgDeleteL( CStifItemParser& );
+
+ virtual TInt TestMsgHandlesessionL( CStifItemParser& );
+
+ virtual TInt TestMsgHandlesessionPanicL( CStifItemParser& aItem );
+
+ virtual TInt TestMsgOverwriteOrAddToQuereL( CStifItemParser& aItem );
+
+ virtual TInt TestMsgMessageHarvesterL( CStifItemParser& aItem );
/**
* Method used to log version of test class
*/
--- a/harvesterplugins/tsrc/harvesterplugintester/src/capsmod_exe/group/capsmod_exe.mmp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/tsrc/harvesterplugintester/src/capsmod_exe/group/capsmod_exe.mmp Thu Jul 22 16:34:05 2010 +0100
@@ -32,20 +32,14 @@
#ifdef SBSV2
#if defined(__S60_)
- OS_LAYER_SYSTEMINCLUDE
- #else // __S60_ not defined
- SYSTEMINCLUDE /epoc32/include
- SYSTEMINCLUDE /epoc32/include/internal
+ OS_LAYER_SYSTEMINCLUDE
#endif // __S60_
/* Source files */
SOURCEPATH ../src
#else // SBSV2 not defined
#if defined(__S60_)
- MW_LAYER_SYSTEMINCLUDE
- #else // __S60_ not defined
- SYSTEMINCLUDE /epoc32/include
- SYSTEMINCLUDE /epoc32/include/internal
+ MW_LAYER_SYSTEMINCLUDE
#endif // __S60_
/* Source files */
--- a/harvesterplugins/tsrc/harvesterplugintester/src/capsmod_exe/group/capsmod_exe_nrm.mmp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/tsrc/harvesterplugintester/src/capsmod_exe/group/capsmod_exe_nrm.mmp Thu Jul 22 16:34:05 2010 +0100
@@ -32,20 +32,14 @@
#ifdef SBSV2
#if defined(__S60_)
- OSEXT_LAYER_SYSTEMINCLUDE
- #else // __S60_ not defined
- SYSTEMINCLUDE /epoc32/include
- SYSTEMINCLUDE /epoc32/include/internal
+ OSEXT_LAYER_SYSTEMINCLUDE
#endif // __S60_
/* Source files */
SOURCEPATH ../src
#else // SBSV2 not defined
#if defined(__S60_)
- MW_LAYER_SYSTEMINCLUDE
- #else // __S60_ not defined
- SYSTEMINCLUDE /epoc32/include
- SYSTEMINCLUDE /epoc32/include/internal
+ MW_LAYER_SYSTEMINCLUDE
#endif // __S60_
/* Source files */
--- a/harvesterplugins/tsrc/harvesterplugintester/src/ccalanderobserver.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/tsrc/harvesterplugintester/src/ccalanderobserver.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -65,7 +65,7 @@
void CCalendarObserver::AddEntryL()
{
- _LIT(KDescription,"Meeting is scheduled in 1st week of January");
+ _LIT(KDescription,"Meeting");
const TDesC8& guidDes = KGuid;
iUid = guidDes.AllocL();
CCalEntry* entry = CCalEntry::NewL(CCalEntry::EAppt, iUid, CCalEntry::EMethodNone, 0);
@@ -94,6 +94,32 @@
CleanupStack::PopAndDestroy(entry);
}
+void CCalendarObserver::UpdateCalenderEntryL()
+ {
+ _LIT(KOldEntry,"Meeting");
+ _LIT(KNewEntry,"Updated Meeting");
+
+ RPointerArray<CCalEntry> entryarray;
+ CleanupStack::PushL(TCleanupItem(DestroyRPointerArray, &entryarray));
+
+ iCalEntryView->FetchL(KGuid,entryarray);
+ for( int i = 0; i < entryarray.Count(); i++)
+ {
+ CCalEntry* entry = entryarray[i];
+ if ( entry->EntryTypeL() == CCalEntry::EAppt )
+ {
+ if ( entry->DescriptionL().Compare ( KOldEntry ) == 0)
+ {
+ entry->SetDescriptionL(KNewEntry);
+ break;
+ }
+ }
+ }
+ TInt numEntriesAdded = 0;
+ iCalEntryView->StoreL(entryarray, numEntriesAdded);
+ CleanupStack::PopAndDestroy(&entryarray);
+ }
+
void CCalendarObserver::AddNoteL( TPtr8 aMemo)
{
const TDesC8& guidDes = KGuid;
--- a/harvesterplugins/tsrc/harvesterplugintester/src/cmessagesessionobserver.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/tsrc/harvesterplugintester/src/cmessagesessionobserver.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -109,30 +109,35 @@
TInt MessagingUtils::CreateMessageL(CMsvSession* aMsgSession, const TDesC& aMsgFrom,
const TDesC& aMsgTo,const TDesC& aMsgBody)
{
+ CSmsClientMtm* smsMtm = NULL;
+ TMsvId newMsgId = NULL;
CClientMtmRegistry* mtmReg = CClientMtmRegistry::NewL( *aMsgSession );
- CSmsClientMtm* smsMtm = static_cast<CSmsClientMtm*>( mtmReg->NewMtmL( KUidMsgTypeSMS ));
- smsMtm->SwitchCurrentEntryL( KMsvGlobalInBoxIndexEntryId );
- smsMtm->CreateMessageL( KUidMsgTypeSMS.iUid );
- TMsvId newMsgId = smsMtm->Entry().EntryId();
- smsMtm->AddAddresseeL( aMsgTo ); //to address if need
- CMsvStore* messageStore = smsMtm->Entry().EditStoreL();
- CleanupStack::PushL( messageStore );
- CSmsHeader& header = smsMtm->SmsHeader();
- header.SetFromAddressL(aMsgFrom);
- header.StoreL( *messageStore );
- CleanupStack::PopAndDestroy( messageStore );
- CRichText& body = smsMtm->Body();
- body.Reset();
- // Put 16bits stream stored in 8bits buffer back to 16bits buffer.
- body.InsertL( 0, aMsgBody);
- TMsvEntry entry = smsMtm->Entry().Entry();
- entry.SetInPreparation( EFalse );
- entry.SetVisible( ETrue );
- entry.iDate.HomeTime();
- entry.iDetails.Set(aMsgFrom);
- entry.SetUnread( EFalse );
- smsMtm->Entry().ChangeL( entry );
- smsMtm->SaveMessageL();
+ TRAPD(err,smsMtm = static_cast<CSmsClientMtm*>( mtmReg->NewMtmL( KUidMsgTypeSMS )));
+ if( err == KErrNone)
+ {
+ smsMtm->SwitchCurrentEntryL( KMsvGlobalInBoxIndexEntryId );
+ smsMtm->CreateMessageL( KUidMsgTypeSMS.iUid );
+ newMsgId = smsMtm->Entry().EntryId();
+ smsMtm->AddAddresseeL( aMsgTo ); //to address if need
+ CMsvStore* messageStore = smsMtm->Entry().EditStoreL();
+ CleanupStack::PushL( messageStore );
+ CSmsHeader& header = smsMtm->SmsHeader();
+ header.SetFromAddressL(aMsgFrom);
+ header.StoreL( *messageStore );
+ CleanupStack::PopAndDestroy( messageStore );
+ CRichText& body = smsMtm->Body();
+ body.Reset();
+ // Put 16bits stream stored in 8bits buffer back to 16bits buffer.
+ body.InsertL( 0, aMsgBody);
+ TMsvEntry entry = smsMtm->Entry().Entry();
+ entry.SetInPreparation( EFalse );
+ entry.SetVisible( ETrue );
+ entry.iDate.HomeTime();
+ entry.iDetails.Set(aMsgFrom);
+ entry.SetUnread( EFalse );
+ smsMtm->Entry().ChangeL( entry );
+ smsMtm->SaveMessageL();
+ }
delete smsMtm;
delete mtmReg;
return newMsgId;
@@ -164,7 +169,7 @@
TMsvAttachmentId attaId = KMsvNullIndexEntryId;
RFs iFSsession;
- iFSsession.Connect();
+ User::LeaveIfError( iFSsession.Connect());
RFile testfile;
CMsvMimeHeaders* mimeHeaders = CMsvMimeHeaders::NewL();
@@ -211,8 +216,8 @@
entry.SetUnread( EFalse );
iMmsClient->Entry().ChangeL( entry );
iMmsClient->SaveMessageL();
-
delete iMmsClient;
+ iMmsClient = NULL;
delete mtmReg;
return newMsgId;
}
@@ -285,6 +290,7 @@
delete iSmtpClient;
+ iSmtpClient = NULL;
delete mtmReg;
return newMsgId;
}
--- a/harvesterplugins/tsrc/harvesterplugintester/src/harvesterplugintesterblocks.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/harvesterplugins/tsrc/harvesterplugintester/src/harvesterplugintesterblocks.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -29,8 +29,11 @@
#include <favouritesdb.h>
#include <msvapi.h>
#include <bautils.h>
+#include <csearchdocument.h>
#include "harvesterobserver.h"
#include "cmessageplugin.h"
+#include "cmessagemonitor.h"
+#include "cmessageharvester.h"
#include "cmessagesessionobserver.h" //For CMsvSession
#include "ccpixsearcher.h"
#include "bookmarksplugin.h"
@@ -43,11 +46,12 @@
#include "mdsitementity.h"
#include "cpixmdedbmanager.h"
#include "cfolderrenamedharvester.h"
-//#include "CBlacklistMgr.h"
#include "videoplugin.h"
#include "imageplugin.h"
-
+#include "cemailplugin.h"
+#include "cmessagedatahandler.h"
_LIT(KAppBasePath,"@c:root file content");
+_LIT(KEmailAppBasePath,"@c:root msg email");
_LIT(KAppBaseFolderFilePath,"@c:root file folder");
const TInt KMsgPluginBaseAppClassMaxLen = 64;
@@ -56,10 +60,8 @@
#include <utf.h>
#include "notesplugin.h"
-//Test Uid for testing Blacklist manager
-
-//const TUid KTestUid = { 0x101D6348 };
-
+_LIT( KemailId, "1" );
+_LIT(KMsgBaseAppClassGeneric, "root msg email");
#define MEDIA_QBASEAPPCLASS "@c:root media audio"
#define LMEDIA_QBASEAPPCLASS L"@c:root media audio"
#define VIDEO_QBASEAPPCLASS "@c:root media video"
@@ -90,7 +92,7 @@
// First string is the function name used in TestScripter script file.
// Second is the actual implementation member function.
ENTRY( "TestStartHarvester", CHarvesterPluginTester::TestStartHarvesterL ),
- ENTRY( "TestFormBaseAppClass", CHarvesterPluginTester::TestFormBaseAppClass ),
+ ENTRY( "TestFormBaseAppClass", CHarvesterPluginTester::TestFormBaseAppClassL ),
ENTRY( "TestDatabasePath", CHarvesterPluginTester::TestDatabasePathL ),
ENTRY( "TestCreateIndexItemL_Add", CHarvesterPluginTester::TestCreateIndexItemL ),
ENTRY( "TestCreateIndexItemL_Update", CHarvesterPluginTester::TestCreateIndexItemL ),
@@ -100,6 +102,19 @@
ENTRY( "TestMessaging", CHarvesterPluginTester::TestMessageHarvesterL ),
ENTRY( "TestMessageHarvesting", CHarvesterPluginTester::TestMessageHarvesterWithMessageL ),
ENTRY( "TestMessageDriveChange", CHarvesterPluginTester::TestMessageHarvesterChangeDriveL ),
+ ENTRY( "TestMessageRunErrorL", CHarvesterPluginTester::TestMessageRunErrorL ),
+ ENTRY( "TestMessageIsMediaRemovableL", CHarvesterPluginTester::TestMessageIsMediaRemovableL ),
+ ENTRY( "TestMessageMountNoIndexerL", CHarvesterPluginTester::TestMessageMountNoIndexerL ),
+ ENTRY( "TestQualifiedBaseAppClass", CHarvesterPluginTester::TestQualifiedBaseAppClassL ),
+ ENTRY( "TestHandleMsgMoved", CHarvesterPluginTester::TestHandleMsgMovedL ),
+ ENTRY( "TestMessageDataHandler", CHarvesterPluginTester::TestMessageDataHandlerL ),
+ ENTRY( "TestMsgUnMount", CHarvesterPluginTester::TestMsgUnMountL ),
+ ENTRY( "TestFormBaseAppClass", CHarvesterPluginTester::TestFormFormBaseAppClassL ),
+ ENTRY( "TestMsgDelete", CHarvesterPluginTester::TestMsgDeleteL ),
+ ENTRY( "TestMsgHandlesession", CHarvesterPluginTester::TestMsgHandlesessionL ),
+ ENTRY( "TestMsgHandlesessionPanic", CHarvesterPluginTester::TestMsgHandlesessionPanicL ),
+ ENTRY( "TestMsgOverwriteOrAddToQuere", CHarvesterPluginTester::TestMsgOverwriteOrAddToQuereL ),
+ ENTRY( "TestMsgMessageHarvester", CHarvesterPluginTester::TestMsgMessageHarvesterL ),
ENTRY( "TestStartBookmarksHarvesterL", CHarvesterPluginTester::TestStartBookmarksHarvesterL ),
ENTRY( "TestAddBookmarkL", CHarvesterPluginTester::TestAddBookmarkL ),
ENTRY( "TestAddGetDomainL", CHarvesterPluginTester::TestAddGetDomainL ),
@@ -113,14 +128,23 @@
ENTRY( "TestUpdateNoteL", CHarvesterPluginTester::TestUpdateNoteL ),
ENTRY( "TestContactsHarvesting", CHarvesterPluginTester::TestStartContactsHarvesterL ),
ENTRY( "TestCreateContactIndexItemL_Add", CHarvesterPluginTester::TestCreateContactIndexItemL ),
+ ENTRY( "TestCreateAllContactFields", CHarvesterPluginTester::TestCreateAllContactFieldsL ),
ENTRY( "TestCreateContactIndexItemL_Edit", CHarvesterPluginTester::TestCreateContactIndexItemL ),
ENTRY( "TestCreateContactIndexItemL_Delete", CHarvesterPluginTester::TestCreateContactIndexItemL ),
+ ENTRY( "TestCreateContactIndexItemL_NoIndexer", CHarvesterPluginTester::TestCreateContactIndexItemNoIndexerL ),
+ ENTRY( "TestContactGetDateL", CHarvesterPluginTester::TestContactGetDateL ),
+ ENTRY( "TestContactDelayedErrorL", CHarvesterPluginTester::TestContactDelayedErrorL ),
+ ENTRY( "TestContactDelayedCallbackNoIContactsL", CHarvesterPluginTester::TestContactDelayedCallbackNoIContactsL ),
+ ENTRY( "TestContactDelayedCallbackNoIObserverL", CHarvesterPluginTester::TestContactDelayedCallbackNoIObserverL ),
+ ENTRY( "TestContactDelayedCallbackWrongCountL", CHarvesterPluginTester::TestContactDelayedCallbackWrongCountL ),
ENTRY( "TestCreateContactGroup", CHarvesterPluginTester::TestCreateContactGroupL ),
ENTRY( "TestCalenderHarvesting", CHarvesterPluginTester::TestStartCalenderHarvesterL ),
ENTRY( "TestCalenderEntry",CHarvesterPluginTester::TestCalenderEntryL ),
ENTRY( "TestCreateMMS",CHarvesterPluginTester::TestCreateMmsL ),
ENTRY( "TestCreateEmail",CHarvesterPluginTester::TestCreateEmailL ),
ENTRY( "TestAudioHarvesting",CHarvesterPluginTester::TestAudioHarvestingL ),
+ ENTRY( "TestAudioHarvestingUpdateIndex",CHarvesterPluginTester::TestAudioHarvestingUpdateIndexL ),
+ ENTRY( "TestAudioHarvestingDeleteIndex",CHarvesterPluginTester::TestAudioHarvestingDeleteIndexL ),
ENTRY( "TestMdsSyncController",CHarvesterPluginTester::TestMdsSyncControllerL ),
//ENTRY( "TestBlacklistPlugin",CHarvesterPluginTester::TestBlacklistPluginL ),
//ENTRY( "TestBlacklistPluginVersion",CHarvesterPluginTester::TestBlacklistPluginVersionL ),
@@ -133,6 +157,8 @@
ENTRY( "TestAudioMMCEventL",CHarvesterPluginTester::TestAudioMMCEventL ),
ENTRY( "TestVideoMMCEventL",CHarvesterPluginTester::TestVideoMMCEventL ),
ENTRY( "TestImageMMCEventL",CHarvesterPluginTester::TestImageMMCEventL ),
+ ENTRY( "TestStartEmailPlugin",CHarvesterPluginTester::TestStartEmailPluginL ),
+ ENTRY( "TestHandleEmailDoc",CHarvesterPluginTester::TestHandleEmailDocL ),
//ADD NEW ENTRY HERE
// [test cases entries] - Do not remove
};
@@ -153,6 +179,12 @@
else logger->Log( errorString );
}
+CSearchDocument* CHarvesterPluginTester::prepareemaildocument()
+ {
+ CSearchDocument* doc = CSearchDocument::NewL( KemailId,
+ KMsgBaseAppClassGeneric );
+ return doc;
+ }
// Example test method function.
// -----------------------------------------------------------------------------
TInt CHarvesterPluginTester::TestStartHarvesterL( CStifItemParser& /*aItem*/ )
@@ -171,11 +203,12 @@
iPluginTester->iWaitForHarvester->Start();//Wait here till Harvesting is complete.
delete filePlugin;
delete iPluginTester;
+ iPluginTester = NULL;
doLog( iLog, KErrNone, KNoErrorString );
return KErrNone;
}
-TInt CHarvesterPluginTester::TestFormBaseAppClass( CStifItemParser& aItem )
+TInt CHarvesterPluginTester::TestFormBaseAppClassL( CStifItemParser& aItem )
{
// Print to UI
_LIT( KFilePluginBaseAppClass, "FormBaseAppClass" );
@@ -210,7 +243,7 @@
}
delete filePlugin;
delete iPluginTester;
-
+ iPluginTester = NULL;
doLog( iLog, error, KTestFormBaseAppClassNoError );
return error;
}
@@ -246,6 +279,7 @@
CleanupStack::PopAndDestroy( buffer );
delete filePlugin;
delete iPluginTester;
+ iPluginTester = NULL;
doLog( iLog, error, KTestDatabasePathNoError );
return error;
}
@@ -257,15 +291,24 @@
ESearchTypeNoResultsExpected
};
-TInt doSearch( const TDesC& aSearchString, const TDesC& aBaseAppClass, TSearchType aSearchType )
+TInt doSearchL( const TDesC& aSearchString, const TDesC& aBaseAppClass, TSearchType aSearchType )
{
+ _LIT(KHeaderPrefix, "$prefix(\"");
+ _LIT(KTrailerPrefix, "\")");
RSearchServerSession session;
User::LeaveIfError( session.Connect() );
CCPixSearcher* searcher = CCPixSearcher::NewLC( session );
- searcher->OpenDatabaseL( aBaseAppClass );
- TInt docCount = searcher->SearchL( aSearchString, KNullDesC);
+ //Form prefix search query
+ searcher->OpenDatabaseL( aBaseAppClass );
+ HBufC* searchbuf = HBufC::NewLC(KHeaderPrefix().Length() + aSearchString.Length() + KTrailerPrefix().Length());
+ TPtr searchstring = searchbuf->Des();
+ searchstring.Append(KHeaderPrefix);
+ searchstring.Append(aSearchString);
+ searchstring.Append(KTrailerPrefix);
+ TInt docCount = searcher->SearchL( searchstring, KNullDesC);
+ CleanupStack::PopAndDestroy( searchbuf );
CleanupStack::PopAndDestroy( searcher );
session.Close();
@@ -307,7 +350,7 @@
TPtrC searchString;
while( aItem.GetNextString ( searchString ) == KErrNone && error == KErrNone )
{
- error = doSearch( searchString, KAppBasePath, ESearchTypeResultsExpected );
+ error = doSearchL( searchString, KAppBasePath, ESearchTypeResultsExpected );
}
filePlugin->CreateContentIndexItemL( filePathName, ECPixRemoveAction );
}
@@ -321,7 +364,7 @@
TPtrC searchString;
while( aItem.GetNextString ( searchString ) == KErrNone && error == KErrNone )
{
- error = doSearch( searchString, KAppBasePath, ESearchTypeNoResultsExpected );
+ error = doSearchL( searchString, KAppBasePath, ESearchTypeNoResultsExpected );
}
}
}
@@ -335,7 +378,7 @@
TPtrC searchString;
while( aItem.GetNextString ( searchString ) == KErrNone && error == KErrNone )
{
- error = doSearch( searchString, KAppBasePath, ESearchTypeResultsExpected );
+ error = doSearchL( searchString, KAppBasePath, ESearchTypeResultsExpected );
}
}
}
@@ -356,7 +399,7 @@
_LIT( KDirectoryToCreate, "C:\\data\\TestFolder\\" );
RFs fs;
- fs.Connect();
+ User::LeaveIfError( fs.Connect() );
TBool folderExists = BaflUtils::FolderExists(fs, KDirectoryToCreate);
if(!folderExists)
{
@@ -366,12 +409,13 @@
if(error == KErrNone)
{
- error = doSearch( _L("TestFolder"), KAppBaseFolderFilePath, ESearchTypeResultsExpected );
+ error = doSearchL( _L("TestFolder"), KAppBaseFolderFilePath, ESearchTypeResultsExpected );
fs.RmDir(KDirectoryToCreate);
}
fs.Close();
delete filePlugin;
delete iPluginTester;
+ iPluginTester = NULL;
doLog( iLog, error, _L("Error: TestFolderCreateL") );
return error;
@@ -381,7 +425,7 @@
{
TInt error = KErrNone;
RFs fs;
- fs.Connect();
+ User::LeaveIfError( fs.Connect() );
CFilePlugin* filePlugin = CFilePlugin::NewL();
CFolderRenamedHarvester* iFolderRenameHarvester = CFolderRenamedHarvester::NewL( *filePlugin, fs);
@@ -405,7 +449,7 @@
}
iPluginTester->iWaitForHarvester->Start();//Wait here till Harvesting is complete.
- error = doSearch( _L("TestRenameFolder"), KAppBaseFolderFilePath, ESearchTypeResultsExpected );
+ error = doSearchL( _L("TestRenameFolder"), KAppBaseFolderFilePath, ESearchTypeResultsExpected );
if(error == KErrNone)
{
@@ -416,13 +460,15 @@
User::After( (TTimeIntervalMicroSeconds32)35000000 );
//Search for the renamed directory
- error = doSearch( _L("TestFolderRenamed"), KAppBaseFolderFilePath, ESearchTypeNoResultsExpected );
+ error = doSearchL( _L("TestFolderRenamed"), KAppBaseFolderFilePath, ESearchTypeNoResultsExpected );
fs.RmDir(KDirectoryRenamed);
delete filePlugin;
delete iFolderRenameHarvester;
+ iFolderRenameHarvester = NULL;
delete iPluginTester;
+ iPluginTester = NULL;
fs.Close();
doLog( iLog, error, _L("Error: TestFolderRenameL") );
@@ -459,6 +505,7 @@
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
delete sessionobserver;
delete msgSession;
doLog(iLog,KErrNone,KNoErrorString);
@@ -500,6 +547,7 @@
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
delete sessionobserver;
delete msgSession;
doLog(iLog,error,_L("Error in TestMessageHarvesterWithMessageL"));
@@ -550,12 +598,231 @@
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
delete sessionobserver;
delete msgSession;
doLog(iLog,error,_L("Error in TestMessageHarvesterChangeDriveL"));
return error;
}
+//Only for coverage.
+TInt CHarvesterPluginTester::TestMessageRunErrorL( CStifItemParser& /*aItem */)
+ {
+ CMessagePlugin* plugin = CMessagePlugin::NewL();
+ plugin->iMessageMonitor->RunError( KErrNone );
+ delete plugin;
+ return KErrNone;
+ }
+TInt CHarvesterPluginTester::TestQualifiedBaseAppClassL( CStifItemParser& )
+ {
+ //For coverage
+ TDriveNumber drive ( EDriveA );
+ _LIT( appcls1 ,"@c:root media image" );
+ _LIT( appcls2 ,"@*:root media image" );
+ _LIT( appcls3 ,"d:root media image" );
+ CMessagePlugin* plugin = CMessagePlugin::NewL();
+ CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( plugin );
+ plugin->MountL( EDriveC );
+ TRAPD(err, plugin->StartHarvestingL(appcls1));
+ delete plugin->iIndexer[EDriveC];
+ plugin->iIndexer[EDriveC] = NULL;
+ TRAP(err, plugin->StartHarvestingL(appcls1));
+ TRAP(err, plugin->StartHarvestingL(appcls2));
+ TRAP(err, plugin->StartHarvestingL(appcls3));
+ delete plugin;
+ delete iPluginTester;
+ return err;
+ }
+TInt CHarvesterPluginTester::TestMsgUnMountL( CStifItemParser& )
+ {
+ CMessagePlugin* plugin = CMessagePlugin::NewL();
+ CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( plugin );
+ plugin->MountL(EDriveC);
+ plugin->UnMount( EDriveC );
+ plugin->MountL(EDriveC);
+ plugin->UnMount( EDriveC , EFalse);
+ delete plugin;
+ delete iPluginTester;
+ return KErrNone;
+ }
+
+TAny CHarvesterPluginTester::TestHandleMsgMovedL( CStifItemParser& )
+ {
+ const TMsvId id1 = 1;
+ CMsvEntrySelection* selection = new( ELeave ) CMsvEntrySelection;
+ // Current entry will be the one to send
+ selection->AppendL( id1 );
+// CMsvEntrySelection entry;
+ const long int ref = 2;
+
+ const TMsvId id2 = 2;
+// entry.AppendL(id1);
+ CMessagePlugin* plugin = CMessagePlugin::NewL();
+ plugin->iMessageMonitor->HandleMsgMovedL(id1, id2, *selection);
+ selection->Reset();
+ delete plugin;
+ }
+
+TAny CHarvesterPluginTester::TestMessageDataHandlerL( CStifItemParser& )
+ {
+ CMessagePlugin* plugin3 = CMessagePlugin::NewL();
+ _LIT8(Des1, "0xFFFFF");
+ _LIT8(Des2, "0xF");
+ _LIT8(Des3, "FFx0");
+ _LIT8(Des4, "F");
+ _LIT8(Des5, "0xFEFF");
+ _LIT8(Des6, "0xFFFE");
+ const TMsvId id1 = 1;
+ const TMsvId id2 = 2;
+ CMessageDataHandler* idatahandler = CMessageDataHandler::NewL( *plugin3, *(plugin3->iMsvSession) );
+ idatahandler->CreateMessageIndexItemL(id1,ECPixAddAction,id1);
+ idatahandler->IsTextUcs2(Des1);
+ idatahandler->IsTextUcs2(Des2);
+ idatahandler->IsTextUcs2(Des3);
+ idatahandler->IsTextUcs2(Des4);
+ idatahandler->IsTextUcs2(Des5);
+ idatahandler->IsTextUcs2(Des6);
+ const TInt KUtf8BomLength = 3;
+ const TUint8 KUtf8Bom[KUtf8BomLength] = {0xEF, 0xBB, 0xBF};
+ const TUint8 KUtf8Bom1[KUtf8BomLength+1] = {0xEF, 0x5, 0xF, 0xE};
+ TPtrC8 ptr(KUtf8Bom, KUtf8BomLength);
+ TPtrC8 ptr1(KUtf8Bom1, KUtf8BomLength+1);
+ idatahandler->TextContainsUtf8Bom(ptr);
+ idatahandler->TextContainsUtf8Bom(ptr1);
+ idatahandler->DoCancel();
+ idatahandler->RunError(0);
+ delete plugin3;
+
+ }
+TInt CHarvesterPluginTester::TestMessageMountNoIndexerL( CStifItemParser& )
+ {
+ CMessagePlugin* plugin = CMessagePlugin::NewL();
+ RSearchServerSession session;
+ User::LeaveIfError( session.Connect() );
+ plugin->iIndexer[EDriveA] = CCPixIndexer::NewL( session );
+ TRAPD( err, plugin->MountL( EDriveA, EFalse ) );
+ TRAP( err, plugin->MountL( EDriveA, EFalse ) ); //For coverage
+ delete plugin->iIndexer[EDriveA];
+ plugin->iIndexer[EDriveA] = NULL;
+ delete plugin;
+ return err;
+ }
+
+TInt CHarvesterPluginTester::TestMessageIsMediaRemovableL( CStifItemParser& aItem )
+ {
+ CMessagePlugin* plugin = CMessagePlugin::NewL();
+ TInt error;
+ TInt driveNumber = 0;
+ //TODO add a while loop.
+ while( aItem.GetNextInt( driveNumber ) == KErrNone )
+ {
+ error = 0;
+ TDriveNumber number(static_cast<TDriveNumber>(driveNumber) );
+ TRAP( error, plugin->IsMediaRemovableL( number ) );
+ if( error ) break;
+ }
+ delete plugin;
+ return error;
+ }
+
+TInt CHarvesterPluginTester::TestFormFormBaseAppClassL( CStifItemParser& /*aItem*/ )
+ {
+ CMessagePlugin* plugin = CMessagePlugin::NewL();
+ TBuf<20> appclass;
+ //To test proper case
+ plugin->FormBaseAppClass( EDriveA , appclass);
+ //To test failure case
+ plugin->FormBaseAppClass( (TDriveNumber)29 , appclass);
+ //cleanup
+ delete plugin;
+ return KErrNone;
+ }
+
+TInt CHarvesterPluginTester::TestMsgDeleteL( CStifItemParser& /*aItem*/ )
+ {
+ CMessagePlugin* plugin = CMessagePlugin::NewL();
+ CMessageDataHandler* idatahandler = CMessageDataHandler::NewL( *plugin, *(plugin->iMsvSession) );
+ const TMsvId id1 = 1;
+ RSearchServerSession session;
+ User::LeaveIfError( session.Connect() );
+ plugin->iIndexer[plugin->iCurrentDrive] = CCPixIndexer::NewL( session );
+ idatahandler->CreateMessageIndexItemL( id1, ECPixRemoveAction, id1 );
+ delete idatahandler;
+ delete plugin;
+ session.Close();
+ return KErrNone;
+ }
+
+TInt CHarvesterPluginTester::TestMsgHandlesessionL( CStifItemParser& /*aItem*/ )
+ {
+ CMessagePlugin* plugin = CMessagePlugin::NewL();
+ CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( plugin );
+ plugin->StartPluginL();
+ TMsvId id = 1;
+ TDriveNumber drive1 = EDriveB;
+ TDriveNumber drive2 = EDriveC;
+ CMsvEntrySelection* selection = new( ELeave ) CMsvEntrySelection;
+ // Current entry will be the one to send
+ selection->AppendL( id );
+ TRAPD(err , plugin->HandleSessionEventL(MMsvSessionObserver::EMsvEntriesDeleted , (TAny*)selection ,NULL , NULL));
+ TRAP(err , plugin->HandleSessionEventL(MMsvSessionObserver::EMsvEntriesMoved , (TAny*)selection ,NULL , NULL));
+ TRAP(err , plugin->HandleSessionEventL(MMsvSessionObserver::EMsvEntriesMoved , (TAny*)selection ,(TAny*)selection , NULL));
+ TRAP(err , plugin->HandleSessionEventL(MMsvSessionObserver::EMsvEntriesMoved , (TAny*)selection ,(TAny*)selection , (TAny*)selection));
+ TRAP(err , plugin->HandleSessionEventL(MMsvSessionObserver::EMsvEntriesMoved , NULL ,(TAny*)selection , (TAny*)selection));
+ TRAP(err , plugin->HandleSessionEventL(MMsvSessionObserver::EMsvMediaChanged , (TAny*)&drive1 ,(TAny*)&drive2 , NULL));
+ TRAP(err , plugin->HandleSessionEventL(MMsvSessionObserver::EMsvMediaUnavailable , (TAny*)&drive2 ,NULL , NULL));
+ TRAP(err , plugin->HandleSessionEventL(MMsvSessionObserver::EMsvMediaAvailable , (TAny*)&drive1 ,NULL , NULL));
+ selection->Reset();
+ delete plugin;
+ delete iPluginTester;
+ return err;
+ }
+
+TInt CHarvesterPluginTester::TestMsgHandlesessionPanicL( CStifItemParser& aItem )
+ {
+ CMessagePlugin* plugin = CMessagePlugin::NewL();
+ CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( plugin );
+ plugin->StartPluginL();
+ TInt num = 0;
+ TInt err = KErrNone;
+ aItem.GetNextInt( num );
+ if ( num == 0)
+ {
+ TRAP(err , plugin->HandleSessionEventL(MMsvSessionObserver::EMsvServerFailedToStart , NULL ,NULL , NULL));
+ }
+ else if ( num ==1 )
+ {
+ TRAP(err , plugin->HandleSessionEventL(MMsvSessionObserver::EMsvCloseSession , NULL ,NULL , NULL));
+ }
+ else
+ TRAP(err , plugin->HandleSessionEventL(MMsvSessionObserver::EMsvServerTerminated , NULL ,NULL , NULL));
+
+ delete plugin;
+ delete iPluginTester;
+ return err;
+ }
+
+TInt CHarvesterPluginTester::TestMsgOverwriteOrAddToQuereL( CStifItemParser& /*aItem*/ )
+ {
+ CMessagePlugin* plugin = CMessagePlugin::NewL();
+ plugin->iMessageMonitor->OverwriteOrAddToQuereL( 1 , ECPixAddAction , 1 );
+ plugin->iMessageMonitor->OverwriteOrAddToQuereL( 1 , ECPixAddAction , 1 );
+ plugin->iMessageMonitor->RunL();
+ delete plugin;
+ return KErrNone;
+ }
+
+TInt CHarvesterPluginTester::TestMsgMessageHarvesterL( CStifItemParser& /*aItem*/ )
+ {
+ CMessagePlugin* plugin = CMessagePlugin::NewL();
+ CMessageHarvester* messageHarvester = CMessageHarvester::NewL( *plugin, *(plugin->iMsvSession) );
+ messageHarvester->RunError(KErrNone);
+ messageHarvester->HandleNextRequest();
+ delete messageHarvester;
+ delete plugin;
+ return KErrNone;
+ }
+
TInt CHarvesterPluginTester::SearchForTextL(const TDesC& aQueryString, const TDesC& aBaseAppclass,const TDesC& aDefaultField)
{
TInt DocumentCount(KErrNotFound);
@@ -580,6 +847,7 @@
iPluginTester->iWaitForHarvester->Start();//Wait here till Harvesting is complete.
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
doLog( iLog, KErrNone, KNoErrorString );
return KErrNone;
}
@@ -625,12 +893,12 @@
{
error = aItem.GetNextString( string );
if( KErrNone == error )
- error = doSearch( string , _L( BOOKMARK_QBASEAPPCLASS ), ESearchTypeResultsExpected );
+ error = doSearchL( string , _L( BOOKMARK_QBASEAPPCLASS ), ESearchTypeResultsExpected );
}
delete plugin;
delete iPluginTester;
-
+ iPluginTester = NULL;
favoritesDb.Close();
favSession.Close();
@@ -668,6 +936,7 @@
iPluginTester->iWaitForHarvester->Start();//Wait here till Harvesting is complete.
delete appsPlugin;
delete iPluginTester;
+ iPluginTester = NULL;
doLog( iLog, KErrNone, KNoErrorString );
return KErrNone;
}
@@ -684,6 +953,7 @@
delete appsPlugin;
delete iPluginTester;
+ iPluginTester = NULL;
doLog( iLog, KErrNone, KNoErrorString );
return KErrNone;
}
@@ -696,7 +966,8 @@
plugin->StartHarvestingL( _L(NOTES_QBASEAPPCLASS) );
iPluginTester->iWaitForHarvester->Start();//Wait here till Harvesting is complete.
delete plugin;
- delete iPluginTester;
+ delete iPluginTester;
+ iPluginTester = NULL;
doLog( iLog, KErrNone, KNoErrorString );
return KErrNone;
}
@@ -760,7 +1031,7 @@
session->AddNoteL(memo->Des());
plugin->StartHarvestingL( _L(NOTES_QBASEAPPCLASS) );
iPluginTester->iWaitForHarvester->Start();//Wait here till Harvesting is complete.
- error = doSearch( aString2, _L(NOTES_QBASEAPPCLASS), ESearchTypeResultsExpected );
+ error = doSearchL( aString2, _L(NOTES_QBASEAPPCLASS), ESearchTypeResultsExpected );
delete session;
doLog( iLog, error, KNoErrorString );
@@ -768,6 +1039,7 @@
delete memo;
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
return error;
}
@@ -790,14 +1062,14 @@
session->AddNoteL( buf8->Des());
User::After( (TTimeIntervalMicroSeconds32)35000000 );
delete buf8;
- error = doSearch( _L("TestNote"), _L( NOTES_QBASEAPPCLASS ), ESearchTypeResultsExpected );
+ error = doSearchL( _L("TestNote"), _L( NOTES_QBASEAPPCLASS ), ESearchTypeResultsExpected );
doLog( iLog, error, KSearchError );
if( error == KErrNone)
{
session->DeleteNoteEntryL();
User::After( (TTimeIntervalMicroSeconds32)35000000 );
//Delete the Note entry added previously and search for result
- error = doSearch( _L("TestNote"), _L( NOTES_QBASEAPPCLASS ), ESearchTypeResultsExpected );
+ error = doSearchL( _L("TestNote"), _L( NOTES_QBASEAPPCLASS ), ESearchTypeResultsExpected );
//If the entery is succesfully deleted, make error to KErrNone.To show testcase success
if(error == KErrNotFound)
error = KErrNone;
@@ -805,6 +1077,7 @@
delete session;
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
doLog( iLog, error, KSearchError );
return KErrNone;
}
@@ -829,7 +1102,7 @@
TBuf<20> oldsearchstring;
oldsearchstring.Copy( oldString );
iPluginTester->iWaitForHarvester->Start();
- error = doSearch( oldsearchstring, _L( NOTES_QBASEAPPCLASS ), ESearchTypeResultsExpected );
+ error = doSearchL( oldsearchstring, _L( NOTES_QBASEAPPCLASS ), ESearchTypeResultsExpected );
doLog( iLog, error, KSearchError );
TBuf<20> newsearchstring;
@@ -840,14 +1113,15 @@
session->UpdateNoteEntryL( oldbuf8->Des(), newbuf8->Des() );
plugin->StartHarvestingL( _L(NOTES_QBASEAPPCLASS) );
iPluginTester->iWaitForHarvester->Start();
- error = doSearch( newsearchstring, _L( NOTES_QBASEAPPCLASS ), ESearchTypeResultsExpected );
+ error = doSearchL( newsearchstring, _L( NOTES_QBASEAPPCLASS ), ESearchTypeResultsExpected );
doLog( iLog, error, KSearchError );
delete newbuf8;
delete oldbuf8;
delete session;
delete plugin;
- delete iPluginTester;
+ delete iPluginTester;
+ iPluginTester = NULL;
return error;
}
@@ -860,6 +1134,7 @@
iPluginTester->iWaitForHarvester->Start();//Wait here till Harvesting is complete.
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
doLog( iLog, KErrNone, KNoErrorString );
return KErrNone;
}
@@ -888,6 +1163,70 @@
return contactId;
}
+TInt CHarvesterPluginTester::TestContactDelayedCallbackNoIContactsL( CStifItemParser& /*aItem*/ )
+ {
+ CContactsPlugin* plugin = CContactsPlugin::NewL();
+ //for coverage
+ delete plugin->iContacts;
+ plugin->iContacts = NULL;
+ TRAPD( err, plugin->DelayedCallbackL( KErrNone ) );
+ delete plugin;
+ return err;
+ }
+
+TInt CHarvesterPluginTester::TestContactDelayedCallbackNoIObserverL( CStifItemParser& /*aItem*/ )
+ {
+ CContactsPlugin* plugin = CContactsPlugin::NewL();
+ //for coverage
+ delete plugin->iObserver;
+ plugin->iObserver = NULL;
+ TRAPD( err, plugin->DelayedCallbackL( KErrNone ) );
+ delete plugin;
+ return err;
+ }
+
+TInt CHarvesterPluginTester::TestContactDelayedCallbackWrongCountL( CStifItemParser& /*aItem*/ )
+ {
+ //This case can happen if a contact was deleted while harvesting is going on.
+ CContactsPlugin* plugin = CContactsPlugin::NewL();
+ plugin->iCurrentIndex = plugin->iContacts->Count()+1;
+ TRAPD( err, plugin->DelayedCallbackL( KErrNone ) );
+ delete plugin;
+ return err;
+ }
+
+TInt CHarvesterPluginTester::TestContactDelayedErrorL(CStifItemParser& /*aItem*/)
+ {
+ CContactsPlugin* plugin = CContactsPlugin::NewL();
+ plugin->DelayedError( KErrGeneral );
+ delete plugin;
+ return KErrNone;
+ }
+
+TInt CHarvesterPluginTester::TestContactGetDateL( CStifItemParser& aItem )
+ {
+ CContactsPlugin* plugin = CContactsPlugin::NewL();
+
+ TPtrC dateString;
+ TInt error = 0;
+ if( aItem.GetNextString ( dateString ) == KErrNone )
+ {
+ TBuf<30> date; //Picked up 30 from contactsplugin.cpp file.
+ TRAP(error, plugin->GetDateL(dateString, date) );
+ }
+ delete plugin;
+ return error;
+ }
+
+TInt CHarvesterPluginTester::TestCreateContactIndexItemNoIndexerL( CStifItemParser& /*aItem*/ )
+ {
+ //Create contact plugin, call CreateContactIndexItemL without creating indexer.
+ CContactsPlugin* plugin = CContactsPlugin::NewL();
+ TRAPD(err, plugin->CreateContactIndexItemL(0, ECPixUpdateAction) );
+ delete plugin;
+ return err;
+ }
+
TInt CHarvesterPluginTester::TestCreateContactIndexItemL( CStifItemParser& aItem )
{
TInt error = KErrNone;
@@ -915,7 +1254,7 @@
aContactId = CreateNewContactL( *db, ContactName, _L("1234") );
iPluginTester->iWaitForHarvester->Start();//Wait here till Harvesting is complete.
- error = doSearch( ContactName, _L( CONTACT_QBASEAPPCLASS ), ESearchTypeResultsExpected );
+ error = doSearchL( ContactName, _L( CONTACT_QBASEAPPCLASS ), ESearchTypeResultsExpected );
db->DeleteContactL(aContactId);
}
}
@@ -925,27 +1264,34 @@
{
TInt aContactId;
//Add a contact first and later edit the contact
+ plugin->StartHarvestingL( _L(CONTACT_QBASEAPPCLASS) );
aContactId = CreateNewContactL( *db, ContactName, _L("123") );
-
- CContactItem* contactItem = db->OpenContactL( aContactId );
- CleanupStack::PushL( contactItem );
- // First get the item's field set
- CContactItemFieldSet& fieldSet=contactItem->CardFields();
- // Search the field set for the given name field
- TInt index = fieldSet.Find( KUidContactFieldGivenName );
- CContactItemField &field= fieldSet[index];
+ iPluginTester->iWaitForHarvester->Start();
if( aItem.GetNextString ( NewContactName ) == KErrNone )
- {
- field.TextStorage()->SetTextL( NewContactName );
- // Commit the change back to database and clean up
- db->CommitContactL( *contactItem );
+ {
+ CContactCard* newCard = CContactCard::NewLC();
+ // Create the firstName field and add the data to it
+ CContactItemField* firstName = CContactItemField::NewLC( KStorageTypeText, KUidContactFieldGivenName );
+ firstName->TextStorage()->SetTextL(NewContactName);
+ newCard->AddFieldL(*firstName);
+ CleanupStack::Pop(firstName);
+
+ // Create the phoneNo field and add the data to it
+ CContactItemField* phoneNumber = CContactItemField::NewLC( KStorageTypeText, KUidContactFieldPhoneNumber );
+ phoneNumber->SetMapping(KUidContactFieldVCardMapTEL);
+ phoneNumber ->TextStorage()->SetTextL(_L("567"));
+ newCard->AddFieldL(*phoneNumber);
+ CleanupStack::Pop(phoneNumber);
+
+ plugin->StartHarvestingL( _L(CONTACT_QBASEAPPCLASS) );
+ CContactItem* contactItem = db->UpdateContactLC(aContactId, newCard);
+ iPluginTester->iWaitForHarvester->Start();
+
+ CleanupStack::PopAndDestroy(contactItem);
+ CleanupStack::PopAndDestroy(newCard);
+
+ error = doSearchL( NewContactName, _L( CONTACT_QBASEAPPCLASS ), ESearchTypeResultsExpected );
}
- CleanupStack::PopAndDestroy(contactItem);
-
- plugin->StartHarvestingL( _L(CONTACT_QBASEAPPCLASS) );
- iPluginTester->iWaitForHarvester->Start();
- error = doSearch( NewContactName, _L( CONTACT_QBASEAPPCLASS ), ESearchTypeResultsExpected );
- db->DeleteContactL( aContactId );
}
}
if( IndexAction.Compare( KActionDelete ) == 0 )
@@ -955,24 +1301,100 @@
TInt aContactId;
plugin->StartHarvestingL( _L(CONTACT_QBASEAPPCLASS));
//Add a contact to contactdatabase and later delete it
- aContactId = CreateNewContactL( *db, ContactName, _L("123455"));
- db->DeleteContactL(aContactId);
- iPluginTester->iWaitForHarvester->Start();
- error = doSearch( ContactName, _L( CONTACT_QBASEAPPCLASS ), ESearchTypeResultsExpected );
- //If the contact is succesfully deleted, make error to KErrNone.To show testcase success
- if(error == KErrNotFound)
- error = KErrNone;
+ aContactId = CreateNewContactL( *db, ContactName, _L("123455"));
+ iPluginTester->iWaitForHarvester->Start();
+ error = doSearchL( ContactName, _L( CONTACT_QBASEAPPCLASS ), ESearchTypeResultsExpected );
+ if(error == KErrNone)
+ {
+ plugin->StartHarvestingL( _L(CONTACT_QBASEAPPCLASS));
+ db->DeleteContactL(aContactId);
+ iPluginTester->iWaitForHarvester->Start();
+ error = doSearchL( ContactName, _L( CONTACT_QBASEAPPCLASS ), ESearchTypeNoResultsExpected );
+ }
}
}
- }
-
+ }
delete db;
delete plugin;
delete iPluginTester;
-
+ iPluginTester = NULL;
doLog( iLog, error, KSearchError );
return KErrNone;
}
+
+TInt CHarvesterPluginTester::TestCreateAllContactFieldsL( CStifItemParser& aItem )
+ {
+ TInt error = KErrNone;
+ TPtrC ContactName;
+ _LIT( KBirthDate, "19970107:");
+ _LIT( KSearchError, "Search Failed" );
+
+ CContactsPlugin* plugin = CContactsPlugin::NewL();
+ CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( plugin );
+ plugin->StartPluginL();
+ CContactDatabase* db = CContactDatabase::OpenL();
+ if( aItem.GetNextString ( ContactName ) == KErrNone )
+ {
+ plugin->StartHarvestingL( _L(CONTACT_QBASEAPPCLASS) );
+ CContactCard* newCard = CContactCard::NewLC();
+
+ // Create the firstName field and add the data to it
+ CContactItemField* firstName = CContactItemField::NewLC( KStorageTypeText, KUidContactFieldGivenName );
+ firstName->TextStorage()->SetTextL(ContactName);
+ newCard->AddFieldL(*firstName);
+ CleanupStack::Pop(firstName);
+
+ CContactItemField* suffix = CContactItemField::NewLC( KStorageTypeText, KUidContactFieldSuffixName );
+ suffix->TextStorage()->SetTextL(_L("Mr"));
+ newCard->AddFieldL(*suffix);
+ CleanupStack::Pop(suffix);
+
+ CContactItemField* assistant = CContactItemField::NewLC( KStorageTypeText, KUidContactFieldAssistant );
+ assistant->TextStorage()->SetTextL(_L("Jane"));
+ newCard->AddFieldL(*assistant);
+ CleanupStack::Pop(assistant);
+
+ CContactItemField* department = CContactItemField::NewLC( KStorageTypeText, KUidContactFieldDepartmentName );
+ department->TextStorage()->SetTextL(_L("Services"));
+ newCard->AddFieldL(*department);
+ CleanupStack::Pop(department);
+
+ CContactItemField* birthday = CContactItemField::NewLC( KStorageTypeDateTime, KUidContactFieldBirthday );
+ TTime time(KBirthDate);
+ birthday->DateTimeStorage()->SetTime(time);
+ newCard->AddFieldL(*birthday);
+ CleanupStack::Pop(birthday);
+
+ CContactItemField* anniversary = CContactItemField::NewLC( KStorageTypeText, KUidContactFieldAnniversary );
+ anniversary->TextStorage()->SetTextL(_L("2002-10-10"));
+ newCard->AddFieldL(*anniversary);
+ CleanupStack::Pop(anniversary);
+
+ // Create the phoneNo field and add the data to it
+ CContactItemField* phoneNumber = CContactItemField::NewLC( KStorageTypeText, KUidContactFieldPhoneNumber );
+ phoneNumber->TextStorage()->SetTextL(_L("1234"));
+ newCard->AddFieldL(*phoneNumber);
+ CleanupStack::Pop(phoneNumber);
+
+ // Add newCard to the database
+ const TContactItemId contactId = db->AddNewContactL(*newCard);
+ CleanupStack::PopAndDestroy(newCard);
+
+ iPluginTester->iWaitForHarvester->Start();
+
+ error = doSearchL( ContactName, _L( CONTACT_QBASEAPPCLASS ), ESearchTypeResultsExpected );
+ if( error == KErrNone )
+ {
+ error = doSearchL( _L("jan"), _L( CONTACT_QBASEAPPCLASS ), ESearchTypeResultsExpected );
+ }
+ }
+ delete db;
+ delete plugin;
+ delete iPluginTester;
+ iPluginTester = NULL;
+ doLog( iLog, error, KSearchError );
+ return error;
+ }
TInt CHarvesterPluginTester::TestCreateContactGroupL( CStifItemParser& aItem )
{
TInt error = KErrNone;
@@ -990,13 +1412,29 @@
CContactItem* newitem = db->CreateContactGroupL( _L("TestGroup") );
db->AddContactToGroupL( aContactId, newitem->Id() );
iPluginTester->iWaitForHarvester->Start();
- error = doSearch( GroupName, _L( CONTACT_QBASEAPPCLASS ), ESearchTypeResultsExpected );
+ error = doSearchL( GroupName, _L( CONTACT_QBASEAPPCLASS ), ESearchTypeResultsExpected );
+
+ //update the group by adding a new contact, to get update event
+ CContactGroup* group = static_cast<CContactGroup*>(db->OpenContactLX(newitem->Id()));
+ CleanupStack::PushL(group);
+ plugin->StartHarvestingL( _L(CONTACT_QBASEAPPCLASS) );
+ TInt aId = CreateNewContactL( *db, _L("Contact1"), _L("455") );
+ db->AddContactToGroupL( aId, group->Id());
+ db->CommitContactL(*group);
+ iPluginTester->iWaitForHarvester->Start();
+ CleanupStack::PopAndDestroy(2);
+
+ //Delete the group and its contacts
+ plugin->StartHarvestingL( _L(CONTACT_QBASEAPPCLASS) );
db->DeleteContactL(aContactId);
+ db->RemoveContactFromGroupL(aId, newitem->Id());
db->DeleteContactL( newitem->Id() );
+ iPluginTester->iWaitForHarvester->Start();
}
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
delete db;
doLog( iLog, error, KSearchError );
return KErrNone;
@@ -1011,6 +1449,7 @@
iPluginTester->iWaitForHarvester->Start();//Wait here till Harvesting is complete.
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
doLog( iLog, KErrNone, KNoErrorString );
return KErrNone;
}
@@ -1029,14 +1468,19 @@
session->AddEntryL();
iPluginTester->iWaitForHarvester->Start();
User::After((TTimeIntervalMicroSeconds32)30000000);
- error = doSearch( _L("scheduled"), _L( CALENDAR_QBASEAPPCLASS ), ESearchTypeResultsExpected );
+ error = doSearchL( _L("Meeting"), _L( CALENDAR_QBASEAPPCLASS ), ESearchTypeResultsExpected );
doLog( iLog, error, KSearchError );
+ // For update event
+ session->UpdateCalenderEntryL();
+ plugin->StartHarvestingL( _L(CALENDAR_QBASEAPPCLASS) );
+ iPluginTester->iWaitForHarvester->Start();
+
plugin->StartHarvestingL( _L(CALENDAR_QBASEAPPCLASS) );
session->DeleteEntryL();
iPluginTester->iWaitForHarvester->Start();
//Delete the calender entry added previously and search for result
- error = doSearch( _L("scheduled"), _L( CALENDAR_QBASEAPPCLASS ), ESearchTypeResultsExpected );
+ error = doSearchL( _L("scheduled"), _L( CALENDAR_QBASEAPPCLASS ), ESearchTypeResultsExpected );
//If the entery is succesfully deleted, make error to KErrNone.To show testcase success
if(error == KErrNotFound)
@@ -1045,6 +1489,7 @@
delete session;
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
doLog( iLog, error, KSearchError );
return KErrNone;
}
@@ -1082,6 +1527,7 @@
MessagingUtils::RemoveMmsEntryL( msgSession, msgid );
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
delete sessionobserver;
delete msgSession;
doLog(iLog,error,KSearchError);
@@ -1113,6 +1559,7 @@
MessagingUtils::RemoveMmsEntryL( msgSession, msgid );
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
delete sessionobserver;
delete msgSession;
doLog(iLog,error,KSearchError);
@@ -1132,7 +1579,7 @@
plugin->StartPluginL(); //Initialize the Plugin
//Copy file path
RFs fileSession;
- fileSession.Connect();
+ User::LeaveIfError( fileSession.Connect() );
_LIT(KPathToMusic,"c:\\data\\music\\");
fileSession.Delete(_L("c:\\data\\music\\Eagle_Landed.mp3")); //Delete if already exist
//pause harvester while copy
@@ -1157,11 +1604,114 @@
doLog(iLog,error,_L("Error in TestAudioHarvestingL"));
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
fileSession.Close();
//End search
return error;
}
+TInt CHarvesterPluginTester::TestAudioHarvestingUpdateIndexL( CStifItemParser& aItem )
+ {
+ TInt error = KErrNone;
+ TPtrC filepath;
+ TPtrC filename;
+ TPtrC newFile;
+ TBuf<KMaxFileName> srcPath(_L("c:\\data\\Sounds\\"));
+ TBuf<KMaxFileName> desPath;
+ desPath.Copy( srcPath );
+ CAudioPlugin* plugin = CAudioPlugin::NewL();
+ CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( plugin );
+ plugin->StartPluginL();
+ RFs fSession;
+ User::LeaveIfError( fSession.Connect());
+ CleanupClosePushL( fSession );
+ if((aItem.GetNextString(filepath)==KErrNone) && (aItem.GetNextString(filename) == KErrNone))
+ {
+ srcPath.Append( filename );
+ if( aItem.GetNextString(newFile) == KErrNone )
+ {
+ desPath.Append( newFile );
+ RHarvesterClient harvester;
+ User::LeaveIfError(harvester.Connect());
+ harvester.Pause();
+ TBool fileExist = BaflUtils::FileExists( fSession, srcPath );
+ if(!fileExist)
+ {
+ BaflUtils::EnsurePathExistsL( fSession, srcPath );//Create folder
+ BaflUtils::CopyFile( fSession, filepath, srcPath );
+ }
+ BaflUtils::RenameFile( fSession, srcPath, desPath );
+ harvester.Resume();
+ harvester.Close();
+ plugin->StartHarvestingL( _L(MEDIA_QBASEAPPCLASS) );
+ //wait for index to flush
+ iPluginTester->SetWaitTime( (TTimeIntervalMicroSeconds32)60000000 );
+ //wait till video harvesting completes
+ iPluginTester->iWaitForHarvester->Start();
+ TInt count = SearchForTextL(_L("testaudio"), _L(MEDIA_QBASEAPPCLASS), KNullDesC );
+ if(count <= 0)
+ {
+ error = KErrNotFound;
+ }
+ doLog( iLog, error, _L("Error in TestAudioHarvestingUpdateIndexL") );
+ }
+ }
+ else
+ doLog( iLog, KErrNotFound, _L("Error in TestAudioHarvestingUpdateIndexL") );
+ CleanupStack::PopAndDestroy();
+ delete plugin;
+ delete iPluginTester;
+ iPluginTester = NULL;
+ return error;
+ }
+TInt CHarvesterPluginTester::TestAudioHarvestingDeleteIndexL( CStifItemParser& aItem )
+ {
+ TInt error = KErrNone;
+ TPtrC filepath;
+ TPtrC filename;
+ TBuf<KMaxFileName> srcPath(_L("c:\\data\\Sounds\\"));
+ CAudioPlugin* plugin = CAudioPlugin::NewL();
+ CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( plugin );
+ plugin->StartPluginL();
+ RFs fSession;
+ User::LeaveIfError( fSession.Connect());
+ CleanupClosePushL( fSession );
+ if((aItem.GetNextString(filepath)==KErrNone) && (aItem.GetNextString(filename) == KErrNone))
+ {
+ srcPath.Append( filename );
+ RHarvesterClient harvester;
+ User::LeaveIfError(harvester.Connect());
+ harvester.Pause();
+ TBool fileExist = BaflUtils::FileExists( fSession, srcPath );
+ if(!fileExist)
+ {
+ BaflUtils::EnsurePathExistsL( fSession, srcPath );//Create folder
+ BaflUtils::CopyFile( fSession, filepath, srcPath );
+ }
+ BaflUtils::DeleteFile( fSession, srcPath );
+ harvester.Resume();
+ harvester.Close();
+ plugin->StartHarvestingL( _L(MEDIA_QBASEAPPCLASS) );
+ //wait for index to flush
+ iPluginTester->SetWaitTime( (TTimeIntervalMicroSeconds32)60000000 );
+ //wait till video harvesting completes
+ iPluginTester->iWaitForHarvester->Start();
+ TInt count = SearchForTextL(_L("eagle"), _L(MEDIA_QBASEAPPCLASS), KNullDesC );
+ if(count <= 0)
+ {
+ // If the search is not found,then testcase is success
+ doLog( iLog, error, _L("Error in TestAudioHarvestingDeleteIndexL") );
+ }
+ }
+ else
+ doLog( iLog, KErrNotFound, _L("Error in TestAudioHarvestingDeleteIndexL") );
+ CleanupStack::PopAndDestroy();
+ delete plugin;
+ delete iPluginTester;
+ iPluginTester = NULL;
+ return error;
+ }
+
TInt CHarvesterPluginTester::TestMdsSyncControllerL( CStifItemParser& /*aItem*/ )
{
_LIT( KHarvesterPluginTester, "HarvesterPluginTester" );
@@ -1265,7 +1815,7 @@
CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( plugin );
plugin->StartPluginL();
RFs fSession;
- fSession.Connect();
+ User::LeaveIfError( fSession.Connect());
CleanupClosePushL( fSession );
if((aItem.GetNextString(filepath)==KErrNone) && (aItem.GetNextString(filename) == KErrNone))
{
@@ -1299,6 +1849,7 @@
CleanupStack::PopAndDestroy();
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
doLog( iLog, error, _L("Error in TestVideoHarvestingIndexL") );
return error;
}
@@ -1316,7 +1867,7 @@
CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( plugin );
plugin->StartPluginL();
RFs fSession;
- fSession.Connect();
+ User::LeaveIfError( fSession.Connect());
CleanupClosePushL( fSession );
if((aItem.GetNextString(filepath)==KErrNone) && (aItem.GetNextString(filename) == KErrNone))
{
@@ -1354,6 +1905,7 @@
CleanupStack::PopAndDestroy();
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
return error;
}
@@ -1367,7 +1919,7 @@
CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( plugin );
plugin->StartPluginL();
RFs fSession;
- fSession.Connect();
+ User::LeaveIfError( fSession.Connect());
CleanupClosePushL( fSession );
if((aItem.GetNextString(filepath)==KErrNone) && (aItem.GetNextString(filename) == KErrNone))
{
@@ -1401,6 +1953,7 @@
CleanupStack::PopAndDestroy();
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
return error;
}
@@ -1414,7 +1967,7 @@
CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( plugin );
plugin->StartPluginL();
RFs fSession;
- fSession.Connect();
+ User::LeaveIfError( fSession.Connect());
CleanupClosePushL( fSession );
if((aItem.GetNextString(filepath)==KErrNone) && (aItem.GetNextString(filename) == KErrNone))
{
@@ -1448,6 +2001,7 @@
CleanupStack::PopAndDestroy();
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
return error;
}
@@ -1464,7 +2018,7 @@
CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( plugin );
plugin->StartPluginL();
RFs fSession;
- fSession.Connect();
+ User::LeaveIfError( fSession.Connect());
CleanupClosePushL( fSession );
if((aItem.GetNextString(filepath)==KErrNone) && (aItem.GetNextString(filename) == KErrNone))
{
@@ -1501,6 +2055,7 @@
CleanupStack::PopAndDestroy();
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
return error;
}
@@ -1514,7 +2069,7 @@
CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( plugin );
plugin->StartPluginL();
RFs fSession;
- fSession.Connect();
+ User::LeaveIfError( fSession.Connect() );
CleanupClosePushL( fSession );
if((aItem.GetNextString(filepath)==KErrNone) && (aItem.GetNextString(filename) == KErrNone))
{
@@ -1548,6 +2103,7 @@
CleanupStack::PopAndDestroy();
delete plugin;
delete iPluginTester;
+ iPluginTester = NULL;
return error;
}
@@ -1565,7 +2121,8 @@
//iPluginTester->iWaitForHarvester->Start(); //Start Wait AO and let it complete
doLog(iLog,error,_L("Error in TestAudioMMCEventL"));
delete plugin;
- delete iPluginTester;
+ delete iPluginTester;
+ iPluginTester = NULL;
//End search
return err;
}
@@ -1584,7 +2141,8 @@
//iPluginTester->iWaitForHarvester->Start(); //Start Wait AO and let it complete
doLog(iLog,error,_L("Error in TestVideoMMCEventL"));
delete plugin;
- delete iPluginTester;
+ delete iPluginTester;
+ iPluginTester = NULL;
//End search
return err;
}
@@ -1603,9 +2161,47 @@
//iPluginTester->iWaitForHarvester->Start(); //Start Wait AO and let it complete
doLog(iLog,error,_L("Error in TestImageMMCEventL"));
delete plugin;
- delete iPluginTester;
+ delete iPluginTester;
+ iPluginTester = NULL;
//End search
return err;
}
+TInt CHarvesterPluginTester::TestStartEmailPluginL( CStifItemParser& /*aItem*/ )
+ {
+ _LIT( KHarvesterPluginTester, "HarvesterPluginTester: %S" );
+ _LIT( KExample, "In TestStartEmailPluginL" );
+ TestModuleIf().Printf( 0, KHarvesterPluginTester, KExample );
+
+ // Print to log file
+ iLog->Log( KExample );
+ CEmailPlugin* emailPlugin = CEmailPlugin::NewL();
+ CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( emailPlugin );
+ emailPlugin->StartPluginL(); //Calls Add
+ emailPlugin->StartHarvestingL( KEmailAppBasePath );
+ delete emailPlugin;
+ delete iPluginTester;
+ doLog( iLog, KErrNone, KNoErrorString );
+ return KErrNone;
+ }
+
+TInt CHarvesterPluginTester::TestHandleEmailDocL( CStifItemParser& /*aItem*/ )
+ {
+ _LIT( KHarvesterPluginTester, "HarvesterPluginTester: %S" );
+ _LIT( KExample, "In TestHandleEmailDocL" );
+ TestModuleIf().Printf( 0, KHarvesterPluginTester, KExample );
+
+ // Print to log file
+ iLog->Log( KExample );
+ CEmailPlugin* emailPlugin = CEmailPlugin::NewL();
+ CHarvesterObserver* iPluginTester = CHarvesterObserver::NewL( emailPlugin );
+ CSearchDocument* doc = prepareemaildocument();
+ TRAPD(err , emailPlugin->HandleDocumentL( doc , ECPixAddAction));
+ iPluginTester->iWaitForHarvester->Start();//Wait here till Harvesting is complete.
+ delete emailPlugin;
+ delete iPluginTester;
+ doLog( iLog, err, KNoErrorString );
+ return err;
+ }
+
// [End of File] - Do not remove
--- a/layers.sysdef.xml Fri Jun 11 16:24:16 2010 +0100
+++ b/layers.sysdef.xml Thu Jul 22 16:34:05 2010 +0100
@@ -6,8 +6,9 @@
<systemModel>
<layer name="app_layer">
<module name="search">
- <unit unitID="orgdo.search.bldinf" mrp="" bldFile="&layer_real_source_path;/group" name="search_bldinf"/>
- <unit unitID="orgdo.search.pro" mrp="" bldFile="&layer_real_source_path;/searchui" name="search_pro" proFile="searchui.pro"/>
+ <unit unitID="orgdo.search.pro" mrp="" bldFile="&layer_real_source_path;" name="search_pro" proFile="search.pro"/>
+ <unit unitID="orgdo.search.bldinf" mrp="" bldFile="&layer_real_source_path;/group" name="search_bldinf"/>
+
</module>
</layer>
</systemModel>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/bwins/isengineu.def Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,19 @@
+EXPORTS
+ ?qt_metacall@IsEngine@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 1 NONAME ; int IsEngine::qt_metacall(enum QMetaObject::Call, int, void * *)
+ ?qt_metacast@IsEngine@@UAEPAXPBD@Z @ 2 NONAME ; void * IsEngine::qt_metacast(char const *)
+ ?trUtf8@IsEngine@@SA?AVQString@@PBD0H@Z @ 3 NONAME ; class QString IsEngine::trUtf8(char const *, char const *, int)
+ ?trUtf8@IsEngine@@SA?AVQString@@PBD0@Z @ 4 NONAME ; class QString IsEngine::trUtf8(char const *, char const *)
+ ?SelectedProvider@IsEngine@@QAEPAVServiceProvider@@XZ @ 5 NONAME ; class ServiceProvider * IsEngine::SelectedProvider(void)
+ ??0IsEngine@@QAE@PAVQObject@@@Z @ 6 NONAME ; IsEngine::IsEngine(class QObject *)
+ ??_EIsEngine@@UAE@I@Z @ 7 NONAME ; IsEngine::~IsEngine(unsigned int)
+ ?tr@IsEngine@@SA?AVQString@@PBD0@Z @ 8 NONAME ; class QString IsEngine::tr(char const *, char const *)
+ ??1IsEngine@@UAE@XZ @ 9 NONAME ; IsEngine::~IsEngine(void)
+ ?getStaticMetaObject@IsEngine@@SAABUQMetaObject@@XZ @ 10 NONAME ; struct QMetaObject const & IsEngine::getStaticMetaObject(void)
+ ?staticMetaObject@IsEngine@@2UQMetaObject@@B @ 11 NONAME ; struct QMetaObject const IsEngine::staticMetaObject
+ ?PerformWebSearch@IsEngine@@QAEXABVQString@@@Z @ 12 NONAME ; void IsEngine::PerformWebSearch(class QString const &)
+ ?Providers@IsEngine@@QAE_NAAV?$QList@VServiceProvider@@@@@Z @ 13 NONAME ; bool IsEngine::Providers(class QList<class ServiceProvider> &)
+ ?SetSelectedProvider@IsEngine@@QAE_NH@Z @ 14 NONAME ; bool IsEngine::SetSelectedProvider(int)
+ ?metaObject@IsEngine@@UBEPBUQMetaObject@@XZ @ 15 NONAME ; struct QMetaObject const * IsEngine::metaObject(void) const
+ ?PerformInDeviceSearch@IsEngine@@QBEXABVQString@@@Z @ 16 NONAME ; void IsEngine::PerformInDeviceSearch(class QString const &) const
+ ?tr@IsEngine@@SA?AVQString@@PBD0H@Z @ 17 NONAME ; class QString IsEngine::tr(char const *, char const *, int)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/bwins/isproviderdbmanageru.def Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,21 @@
+EXPORTS
+ ?getStaticMetaObject@IsProviderDBManager@@SAABUQMetaObject@@XZ @ 1 NONAME ; struct QMetaObject const & IsProviderDBManager::getStaticMetaObject(void)
+ ??_EIsProviderDBManager@@UAE@I@Z @ 2 NONAME ; IsProviderDBManager::~IsProviderDBManager(unsigned int)
+ ?GetCountryList@IsProviderDBManager@@QAE_NAAVQStringList@@@Z @ 3 NONAME ; bool IsProviderDBManager::GetCountryList(class QStringList &)
+ ?SelectedProvider@IsProviderDBManager@@QAEPAVServiceProvider@@XZ @ 4 NONAME ; class ServiceProvider * IsProviderDBManager::SelectedProvider(void)
+ ?SetSelectedProvider@IsProviderDBManager@@QAE_NH@Z @ 5 NONAME ; bool IsProviderDBManager::SetSelectedProvider(int)
+ ?OpenDatabase@IsProviderDBManager@@AAE_NXZ @ 6 NONAME ; bool IsProviderDBManager::OpenDatabase(void)
+ ?GetCountryCode@IsProviderDBManager@@AAE?AVQString@@XZ @ 7 NONAME ; class QString IsProviderDBManager::GetCountryCode(void)
+ ?GetProviders@IsProviderDBManager@@QAE_NAAV?$QList@VServiceProvider@@@@@Z @ 8 NONAME ; bool IsProviderDBManager::GetProviders(class QList<class ServiceProvider> &)
+ ??0IsProviderDBManager@@QAE@PAVQObject@@@Z @ 9 NONAME ; IsProviderDBManager::IsProviderDBManager(class QObject *)
+ ?qt_metacast@IsProviderDBManager@@UAEPAXPBD@Z @ 10 NONAME ; void * IsProviderDBManager::qt_metacast(char const *)
+ ?metaObject@IsProviderDBManager@@UBEPBUQMetaObject@@XZ @ 11 NONAME ; struct QMetaObject const * IsProviderDBManager::metaObject(void) const
+ ?trUtf8@IsProviderDBManager@@SA?AVQString@@PBD0@Z @ 12 NONAME ; class QString IsProviderDBManager::trUtf8(char const *, char const *)
+ ??1IsProviderDBManager@@UAE@XZ @ 13 NONAME ; IsProviderDBManager::~IsProviderDBManager(void)
+ ?staticMetaObject@IsProviderDBManager@@2UQMetaObject@@B @ 14 NONAME ; struct QMetaObject const IsProviderDBManager::staticMetaObject
+ ?CloseDatabase@IsProviderDBManager@@AAEXXZ @ 15 NONAME ; void IsProviderDBManager::CloseDatabase(void)
+ ?qt_metacall@IsProviderDBManager@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 16 NONAME ; int IsProviderDBManager::qt_metacall(enum QMetaObject::Call, int, void * *)
+ ?trUtf8@IsProviderDBManager@@SA?AVQString@@PBD0H@Z @ 17 NONAME ; class QString IsProviderDBManager::trUtf8(char const *, char const *, int)
+ ?tr@IsProviderDBManager@@SA?AVQString@@PBD0H@Z @ 18 NONAME ; class QString IsProviderDBManager::tr(char const *, char const *, int)
+ ?tr@IsProviderDBManager@@SA?AVQString@@PBD0@Z @ 19 NONAME ; class QString IsProviderDBManager::tr(char const *, char const *)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/common/inc/serviceprovider.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,53 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef SERVICEPROVIDER_H
+#define SERVICEPROVIDER_H
+
+#include <QList>
+#include <QObject>
+#include <HbIcon>
+
+
+class ServiceProvider
+{
+public:
+ ServiceProvider() {}
+ virtual ~ServiceProvider() {}
+ QString Name() const {return m_name;}
+ void SetName(const QString& aName) { m_name = aName; }
+ int Id() const {return m_providerId;}
+ void SetId(const int providerId) { m_providerId = providerId; }
+ HbIcon Icon() const {return m_icon;}
+ void SetIcon(const HbIcon& icon) { m_icon = icon; }
+ QString Description() const {return m_description;}
+ void SetDescription(const QString& description) { m_description = description; }
+ QString ProviderUrl() const {return m_providerUrl;}
+ void SetProviderUrl(const QString& providerUrl) { m_providerUrl = providerUrl; }
+ QString PluginName() const {return m_pluginName;}
+ void SetPluginName(const QString& pluginName) { m_pluginName = pluginName; }
+
+private:
+ int m_providerId;
+ QString m_name;
+ HbIcon m_icon;
+ QString m_description;
+ QString m_providerUrl;
+ QString m_pluginName;
+};
+
+#endif // SERVICEPROVIDER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/common/resources/baidu_logo.svg Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,353 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.2" baseProfile="tiny" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+ x="0px" y="0px" width="88px" height="72px" viewBox="0 0 88 72" xml:space="preserve">
+<switch>
+ <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
+ <i:pgfRef xlink:href="#adobe_illustrator_pgf">
+ </i:pgfRef>
+ </foreignObject>
+ <g i:extraneous="self">
+ <path fill="#FFFFFF" stroke="#CCCCCC" d="M78.813,61.402c0,3.808-3.084,6.892-6.89,6.892H19.491c-3.806,0-6.89-3.084-6.89-6.892
+ V8.969c0-3.805,3.084-6.889,6.89-6.889h52.434c3.807,0,6.891,3.084,6.891,6.889v52.434H78.813z"/>
+ <g>
+ <path fill="#2319DC" d="M62.116,44.868c0,0-6.046-4.631-9.574-9.638c-4.779-7.377-11.585-4.376-13.855-0.621
+ c-2.259,3.756-5.788,6.129-6.293,6.752c-0.506,0.624-7.302,4.256-5.79,10.89c1.506,6.627,6.803,6.5,6.803,6.5
+ s3.906,0.377,8.432-0.62c4.534-0.998,8.435,0.247,8.435,0.247s10.584,3.508,13.479-3.249
+ C66.646,48.377,62.116,44.868,62.116,44.868z M68.038,31.727c0-1.497-1.262-6.002-5.922-6.002c-4.664,0-5.289,4.25-5.289,7.263
+ c0,2.865,0.24,6.877,6.045,6.75C68.667,39.611,68.038,33.233,68.038,31.727z M52.542,26.476c3.91,0.498,6.42-3.629,6.92-6.759
+ c0.509-3.123-2.01-6.752-4.779-7.383c-2.774-0.623-6.229,3.77-6.549,6.634C47.763,22.477,48.646,25.977,52.542,26.476z
+ M39.955,25.983c2.919,0,5.284-3.332,5.284-7.448c0-4.121-2.365-7.451-5.284-7.451c-2.923,0-5.292,3.33-5.292,7.451
+ C34.663,22.651,37.032,25.983,39.955,25.983z M30.127,36.485c5.289-1.125,4.57-7.392,4.41-8.761
+ c-0.256-2.11-2.766-5.794-6.168-5.504c-4.288,0.376-4.911,6.51-4.911,6.51C22.876,31.559,24.847,37.613,30.127,36.485z"/>
+ <path fill="#FFFFFF" d="M40.836,52.226h-2.772c0,0-1.928-0.095-2.52-2.301c-0.301-0.977,0.048-2.105,0.202-2.542
+ c0.146-0.443,0.785-1.471,2.125-1.869h2.965V52.226z M40.886,38.417v4.458h-3.659c0,0-3.663,0.291-4.944,4.408
+ c-0.447,2.743,0.391,4.356,0.541,4.703c0.147,0.344,1.333,2.354,4.302,2.937h6.881V38.461L40.886,38.417z"/>
+ <path fill="#FFFFFF" d="M45.692,43.264v8.671c0,0,0.143,2.156,3.215,2.944h7.917V43.264h-3.418v8.723h-3.266
+ c0,0-1.041-0.15-1.233-0.981v-7.794L45.692,43.264z"/>
+ </g>
+ </g>
+</switch>
+<i:pgf id="adobe_illustrator_pgf">
+ <![CDATA[
+ eJztfdluK0uSmJ8PwH8gtZLiVis37aREaqGOFmrj0UJxKUk8okiqSN7btw370Z6xAfvFgA0/28D4
+wQOMn7wA/ppp9MxfODJry1qyKrn0uAd23766ZFYyIjMyMraMqFyNXNSS+51BS0mKKS4c+ra6WlKV
+5nigFsK4OXzc601GYxU1Ra9iYR66oV77x7mG3vNWUUfdQb+An6V49LSMfh/d73x2+139x7FwNIYe
+XXfHPQUevg0Gbz2l0Ru8DVKjX95iJmoAddAcQ5dMWkoLHJcPiwVRCl+coR7FwaTf6fbfioPfFcKi
+wIUFIRuWcnxYzAro+VH3Shk5O6Vk1A3+Sjn0WczyKRl1Phi0J59Kf3yhDtrKaFQa9AbqqBAu/dbs
+h8+ab/CkGa4rvd7gV+i9fyw3yt2eAlP7bI7DeUyG/WNeaBQn3V7n++SzpcCkJUHC7WIDg7sZARwA
+iT7j9mzj+BOaasp4DCMEbJiaV5UiOQhoxf9EH/7wn//9H//yL/7uL//bU8wAqw6Gn031A34qyhk0
+tYyIpiZJaGqijKeGOl4rn8MeEBJTQeIwFfJ51NX6bHSFeeFuPCekxHw+H07yQLZ8JpzJA93y8CGL
+v+v9LcIpv3SVXwvh74O+otNoXx3Xur+HOec4LpzhOL35atJT1Jt+dwzj5nFbXqPQ2aCj9Iw2/PNy
+r4kJg//hrb96j+um+qaMYZkHvckY813OxAKrUG3+pqgEkvOh0r8e3OJhJmUhnAGG4cM8n5XDOTkP
+1MMIxFxYyOZ0XDzGZ4wIAUA/NwBn0YJdwBqeq923br9gjCzbqKjdjrWwWSGc0/7g0adyxL954199
+kDDl8VjpG6MGpiqdESzCpc5qCOthv1MafCLKj/BmUAA/8A3sIf2p9QU/AxCToT4N3NCAhbpQu30E
+OPTtu/Ys17joTeBhRR1Mhsf910HoW1Tb+6Vmr9d9U5vD9247XFQno/fw9WDQi4X1548iLzyKMv8o
+ZLKPgsw9ClkR/ivDd157JkiPYiYD/4VnEvTJQl9Jgv9Cm5gFQIEgHD9JNbvDWMCwgZqqEtaeAgr8
+FaFCoERJHxWfYQFV++2zNeh1R5/WnNFARTTILEDiZG0OGRgj+orGKsJ3mEtGhv+ieYhMiNqIA1QK
+lXkMHoOUxNmobIBAFJUWQeV/fCO+wAPun/fhwztl3LKGLIMYcTZ+FlA3Weuekf9fHjfIcr8xByD8
+/2NmHfO12myDQA+ft34q7TFGwoEQAmEqcgBI4j2aABcMVchithGzTMJQI0tP6XdGhDjMIriSJg5B
+7jGKfE08CnjaDhD+Q0GDeO32OyB5apPuWCFHAhgz5Eg4LJnxLDOSRgRBUzQwGCGTwcIFKR+8IGhh
+OOiO5Pv0xDlQXsEytLQOqS2QatAhMpDH+RNtPjqHSJIxL6YV6zX7TTWMH9i1Nkl/JGoxwZDIlcVZ
+ltABwhqb3ACzhDQ7kslAgySvPUOW5Pi3ngK2Tvq0P/i1j7+FCzC7h7//X//h7/76Pz3FwunvzU8l
+nIAutS7Yu4rZhwufoz8cYdPdN1HLFfxJ5YW8xAvIGsvmJJFHH/IcD3Yuts/wP/f7qDdvfPsNfTuB
+Tz+h7dewFD4LPzxx4U4IngFIDL8Dw7howmzCm6Fv4TSwBPqAZwRUIOYTTJiLZg/sP0WbwkWLccw2
+hwHP+/73iFw2N+KiDf8WrUGYqKZblip4duRSuCeq9ZiRCXhOe6hZYAjUPzHaAZizlYZBH7PhsIBj
+CTyw2kgbDYhT0NduG7kSTfU3veH+rPodHBPK481w9HefvT50SIJqVrutyVgBkZjAnfdVtfkPCmZB
+WIh+7XfwaFWlr/cSwuljIJX5GP0Z/zZU9MfRtf6o8UtTHW3CdqwBBlBFtr6/NHsTszN6MKJ07MNe
+1vvpoxnZv/6jJ1UfHGUWKvUG7Q+lw0Qmo2viz2KCrS4OvfAskwSeAQ/1O54Nw0TJ7otkivmJwvsT
+hY0U3WarpzDtDJaV/r/OCNMLhcIv7GIB9f3zYHg0z/ZkNB58/hmIvz8pixZGTWRhIR0K+5CdU/8h
+9g0M6M9tPH8eBPpUxs0OrNgCBpOfezDLHd3sYtoARG/t5w9/+9//6x/+4l/83f/+qz/+m3+JbP+b
+frcNPzNAgXHIh03LDgc/w3pkFbzFC1UZKeMwoT+4cLoI7r3+QwNb+KMPGnUwGYffNLfJr293NEAx
+9nALecUwCGPdZOh/pTRx/3z4TBm9h6+ao7Gidn+PTzjCVvxa/4nI2X5yPhkPYQgBP8rIsijry4J+
+1VTHrUFT7YTbKLQO5n/Lor5A9Burzf5o2IS1bf8G0+x2wqPu7xVWoG+qojCPQDVtE1mQhBy9q0AO
+NrAvOYbAztYYeNsyYpZQf1HC18rvxuHDTnfcbHV73fFv1qLrQN2MVW323ybNN/CxB0OTS1z6R8wY
+izpsdjpOXvpsjj6cAxsNB2Nnv2ava0j7rLGMnWE3pbdJehNMV7W2z/5xeH8yHpgs5MH1+fCwOYSt
+Mep+TnpNgq94KjUdlEGnUfuq0tyHaf9iYCA1UtRwwcEZTXH4f9q5lf4RHVhpH/EJFvoU03+HD7bw
+M0tcGJMz8SJMHluUC7+aGx+2cq/bV8JjWGRjfhyxtGRfFRMr+YvSHgPntJq9Zr+tePAO+ZuhwUWD
+XxR1iPzPUcAv2r3uEMiJtOnvgDnfgPAjxkmMxurgw9L9LrPPbgzUlN5RcwycWx20mz0k+kYkxWi9
+gTKKenxg60s+v0YqDqE2JLPnihJCvnZbwQeXxcHv7uvGjziDH4wPjh+gQzfbD7KCd0cd8pHSfXs3
+h5TL+Xa+63bG7+bUYI+2B2pH6XiQNZz+Phjbn5vrCgAv3l6dSwet982hY3NC48H1gZsx8uH+wOKc
+cLePGWMwwqFNXe89ioIejUOhQSGjhwIzOJ4p8sITMUd0ehiGve+n+Ei+xJ1LiCFLOkNe2Rgya0l3
+ra8mT9K32hYp2rcIqfe07hW12ekisdnsd3RF6Kv6tF9VEa/vq9qvsHR2/WpqsvDhw4saM1203j6E
+cXc+1/dozbZHSQJq/dgpqPWfmoTazxhoGMTohpRMW15HWu2ooxSYaiACCK2q4Xb1MwTYaOTQLGTP
+9mfKkKHtz98+YnTcRM/B+F1xaiOy63CopjS/zAcz6tRRXpuTniE35LycErymg7r+SgiNnMSn8tSe
+7zZZ9Md/9zd//1/+5g//6q/++Ff/+g//89/+4a//49/+j790269OIH2bqepG1HaOid7LNh5PyqJe
+2Cw0Bu0/vp+DlmN8bpA9NfUJP/cdnNpJDdS3lP8M9E6Gz89z1G4jUHOKCS2w4y9+w8e9hr32b36s
+izu1+yNf2kKnMdiVpnvgya9vnx+pEQqbB3WCjad0gjq1Qc35jPu1P051evbV8ew0mrTMuYleyEap
+nvKL0vPbZKNUq4tEjN+YR6m+8tYkjEhKr/agP8YxVL9OPR7p0ObYLRwdHUfvzY6iKiM/OTbUpBgh
+w0yJTnb73TDlMhe9OiHbz2f00GMwbA+Ceoz8KIB7dCasbrPjpwG7WhPrk36bTU7g7s1+33RqLJXs
+6hYorkH8EywbPWkOm30tty4scBwPH8EX7/gPCKuQwWu35/SLHZ3AGFO6/XGgXALLrdccMggwvaOf
+yME7165aA8ir7XVMN2JKLD8CAT5GqZjGcFKC7Mn9qC+oSGTYOFSN9/CH4BN3+69+HIz7IbcHp4Za
+1ghdmKElbjXVkR+RLdk4eH0FofTqu3b23uPBkL2zalelQd1bg7HF1Rlqf5zT6Rg5Q29r5AydyZEz
+dLeNnKYgOr2h+jqwfF6q3P5EltsoYLVBJCtjh7gVOYqQU1WnPYutZ6+ub66ulI6gX2CjjolYAZls
+4CdXBr2ego1pu0PhQjIa9wybE7t8phUbsGvR7/QfECKa5UfDDpKavT77uIaM4gf9RpM+1k+8twRY
+l12U+By8Mc2eFmv7GuVaZ5K1/U1zrb+Tt2nWNeyDkeKvBbB97eznIi8ymDvKqPvW9wq0eXOhFuwJ
+AIp5ooVS3v22oNmTVH2+HZujVnf82fQzVlBfrRPT9kIOgTGz4cBXYqCuZlCk1Wu2fb1C7B8gDzlI
+m6CeoMqG7wP19wZvUbrhEIwFbdMMGaMozb7RN0xEwVxRFe94AEfrdk3EJx0xl3NnZJGjBh+8oeh9
+nGCC/H9vYw2zCGwi8Bbf/CQK6jf66A5h/fp+64f6qeBEqCMF4fbz6lFXJGmbZnTMvjAngxZKgHMs
+ixGAK4OeQpFQO5eYQTujYsLz0e/0vFBvqNfWORgZHEQB+FOQ1w4HCoUNVaXdJbQhESbEuVMEQMF6
+dNgHSWz5keSTz5bS0QJL3iOsgSOnVRR4jRMlBuLw8LDZtijrZgginc2RU4UWQUu2QrQyHoa+pdED
+sgkx2n6tdHyckw8UpFgw5PiO/JKN79620lw6frYR330fi+iTIG1dFkTzwaX5CT/YFHevx8WD13zl
+42j5art58MrVd8ynQnz7KvMeWR9ef0US7z+PAE0k3k6l0ZfrSHxS4CPJffE8sqrwh5GEUK5EErG9
+Wkqs5ibxnXqiz2/sbw/lSCl2KY3EFWbUgMYLO0K9Gkk0Og8IVy0SPRol0Nc6IMxH4jvbw1UdDUx9
+ZxjbGgJNTj6l3fOXHe6oeVXUP72c7MKDgw9Ak0qP5C/4Uhu6ejWU0ihX7l8L0Xx9heus8X00kXNr
+YOrj6C2nz7USWZNGwugMwwWguYp4t7n8Cl8rPUADP68fGLOvjlR1c/RDfdq8OOfSUi2Kx0tirfCP
+0v17NeGJ9emteOSFVZtNrpIRfqYjGLEH1pb6nI7feWP9Xowt3wx7VS+so+XnTBFjxZzmmu7RzmW2
+f+uNVYrdxzfb52eeWJfKz5IXVoQGIebKxdM9CpEzyyt9NbZNwVp/5sqv32veWCuRrTX+pHGtrY1r
+ulzlSLimLq3wY+f6BWMF/m4d2il8pz5OdqoIa8zCitDoSxutiw89PgZYpYFraatcUcd6sb7uwCrL
+n40hDWtDfXrv49nYERtY95qZbHmF98T6vPtyRcN6tCJGNx8dWDEajHgr8jRafleuvLFelmI7Xyuf
+VS+s8c1eYYeCNbO8/DX5kdVkmsd0pfoDVz7duvDEulT+zK9K3w8uvbBy5UH3xIFVQ6MjXjs7Vyo0
+rApXuVz+4T3X73fc6kf6tgZYs0Pn5lmvNES0PXW5mIw6pit/fdSuNKyHjx9lG9YfO1z1OC8irBuu
+uR59fGWl4q5kYbWJTq76+apQsebODp9bNKzP3HnvvOaN9XT9B6A5TYHJ6DVdrnYmZqlYqxXpVKJg
+fZC46+NazMKKZkMinoxr1cpD1hPrLTfuUrFeK9/T7zSsx4ihb5/Xd7ynW82v30Yj33c9sd4lb9eo
+WO/2o5vLFlbEaTbEXe5HYvvZG+v3Y+VnpL0R9cT61Fo6o2IFNB+F3voJZbqPu9zz8w==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 1QaNwJ4ykpWoWx4ZMyB9Mjm0K6BFgG0ELbkUD1aERj8B+FvQGuUMJ+N15ERd7Mq5LGIASROaqCWf
+y4jaD80Z6I1Vr2lVMTWwOsMPc7JGOy4nalM222CeoOqqGk9mhUzG3gbaLoMkPxovbDS0ytkcojta
+bj6Tw1RAOkSU85g0UhY0DNIFfFYU8YByGWQpIHUkYErpegYrn7wmOVAjn8mjOYOIlmVEPsTonIDp
+kkF6F8l4OZvFxo8E7CpzmZzVWCUb0URhaUzSkLOvmnyCeQTpHj4vSHiGgpjB5LEa0WAzsmbBcIgE
+Mh4Z8KSAhY7EIdUJg8Aq8NaQ5hLRWCUbDSRVTQbn0QbzbjTIhBuB1+GPoxHYMJ/XGjMZiSfHA0Il
+L2vjMRsRllyeN6Zin7RGFSBKPhyNhdF1ndWibriDHY9N62QSN4iaJV9SB0Pw3ScjRe2AuRVOoyf9
+AWo+a6ofo/BHf/BrP9wfjMP/1GZ2T/D/NSs7XHEaTob1DCvpYT+LUjaFbFugAuZigTO/wgRq0CJn
+UIss6R20r0LW7EDOcGIAhFUlAWpfSYCiZAMIm5IGUJJFEqCUcwKUMCgToP41CKA5ZQ0gOWUNgjll
+/StlyuTnfxbuvuorCkusr+fq6kXzTblWm90ectTeRs1flHCzD8vYHCtDeBR+U5XReKAq4dH74FfU
+gn5k/gDcvvNy6Nv/AfM48J4=
+ ]]>
+</i:pgf>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/common/resources/bing_logo.svg Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,906 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="88px" height="88px"
+ viewBox="0 0 88 88" enable-background="new 0 0 88 88" xml:space="preserve">
+<switch>
+ <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
+ <i:pgfRef xlink:href="#adobe_illustrator_pgf">
+ </i:pgfRef>
+ </foreignObject>
+ <g i:extraneous="self">
+ <g id="Layer_2">
+ <rect x="-0.167" y="0.167" fill="#FFFFFF" stroke="#CCCCCC" width="88.333" height="88.333"/>
+ </g>
+ <g id="Layer_1">
+ <path fill="#FFA615" d="M59.229,45.021c0,6.426-6.864,11.609-15.312,11.609c-8.466,0-15.312-5.184-15.312-11.609
+ c0-6.417,6.846-11.625,15.312-11.625C52.365,33.396,59.229,38.605,59.229,45.021z"/>
+ <path fill="#006DD4" d="M43.918,71.541c19.541,0,35.369-11.881,35.369-26.523c0-14.661-15.828-26.53-35.369-26.53
+ c-19.541,0-35.369,11.869-35.369,26.53C8.549,59.66,24.377,71.541,43.918,71.541z M43.918,65.168
+ c-13.583,0-24.584-9.023-24.584-20.15c0-11.143,11.001-20.166,24.584-20.166c13.583,0,24.584,9.023,24.584,20.166
+ C68.502,56.145,57.501,65.168,43.918,65.168z"/>
+ </g>
+ </g>
+</switch>
+<i:pgf id="adobe_illustrator_pgf">
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ uxF5UUxXNnQhtUmn5PiDKi1dLbUgN67m737gHuJgnCfcGK0vq7R6onEmVa00CmoVJi3cpvBf11OL
+ihHZ1RK5BslpxchSA3LbckmN12ahT9LoinSV8gd0tDeD4m1TCieXWKflFVQ5qZymksw13ZxqHDSB
+kE9D8Hym9Gi1WUkGaQelrq+QBjxXh7lKhcy01Jg2S1apPJkyDic30NFX4HkJenKaY7/rXPG8Ti37
+WunYhlQ7l8+Y0OxouT+YCAcl4NkXJaoh7yF0esbEUhN0tPAgGN1eWLNff57wNp25oSeWMh715A/6
+6eQGOid6TuMHn8cYPvQ8xlT2gH2DmeSTxkTwZAmkjeIhLRLx472gPt75QjoTScTwUEWwcZabimEB
+JtRxY4J8jCud4E/kQxc7raRoUtdQtZW8F8pq9TWdpJTKQmUdAGvPg1+B8cFYr8IVflmV63ZrCfSq
+ODs0SHmRWrCoNULMt9tGF0WKFi6x7DWyqtKjKSsDBPAHsFm4togca5VRrUEQ74KJDV6ecIw6URdd
+5sGNmAWgfGfBiRLujmSmchOeyby+6/CCfx3V/VJuiSg2/BV6HeaWwliORdmLG/GSzA28wGMTgi5F
+5SGqMEvQuBvnRQk2yecvKPR1M2varjif3yi2P5STqaY/AzxYLuISpCmFBVgOIB5x6mnbeUVlpuBi
+CNPxYKZAjkQhIWU3y7lS9r5mI/UertwkZctvTN1f6el7JnkBli0p8O4kr3Uv1w1zv9OWn5G3oBzP
+Hj8Kn+oA3eajKuxYoc8lR5MkLhUgJr99WoiRx3vBQmFXg+ckYOBVgJmTBmLYjTs7cG+0/GD41Nxf
+oDsG2m2g3VgF//tjzkRShBbxxHZaIDnXXKYUmls9Eoe3X3JzcV1RNhp7rRqxUh9xqindipPbiEtt
+Ne2o5OF3eiYfbZ7ktQpsAgx3IkCHRADsU96f0r+NgK1uocYIjjJauGiBSuxU+yB761B8JD+J+1p5
+Ky7u0/KNbsWVpV4rFX+naqvkSFJbp7VpzOjW5Ohay1umpA1c5mktr9SnXkj1ps0rRKbhohEi66VS
+hY+21zagQhIKMQlJ4PPC+GbKhkU8659qIKUNnG2g3TJB+VAZTQTiTg8rp+3ImVEZ/O3xoxf49b3f
+HF5cHU1Pr6aL+fjij8FfEPvqCR1VCRrz68E3L64upvM3g6+Gw8PT0+vz54urMd789eDPeOu3+E+S
+IZYtqjho6xXZUkerI1zorYsvnYWLaodiuyJctRTAdISLinKq2BUuqoaIYUW6cJEupuUJk6J7k7YX
+i3BRsrONK8JFuWBrusKF+cOuZFH1CLxnWbKortC5rmRRxaSpu5JFoaBxK5KFoaOUl2XJqp0m7grJ
+oiIPEJtlycLMh0p3kizcrOJl1SVJVl1x6u8eJSvp3mrwPaowXLRrGzEelNITy+z4q0pyO9L+Vbmf
+Uka29JdkXqfOcCETW6bcmZtuXm3Jfz9+dIla9/Cd6nCrDarkW5o7aCOSUKR8qpQsoHImliUBT5O/
+KgV9xc1OVydLsiVILRAKGY/pLI5MFnUMnwZetEHB06UcVXmzdqwgusSBU2IQy53nhXD8CCf9+Squ
+O31BcunQBuqxViWaljOTGeSm4ZZuOW8q34xDxdUnBdkOSG04TRIjeEz1Opksrp/Lslpug4JpqkmD
+y5tz1zLZVT4oi+gcS95x0mFRF0+nqZl0/FfqNZ31aCq/zCJcBrBS71Lc7PgraLtkSzCzqMRTXwqy
+uddFGzosKhpc3py7VpBd4QOzqKJppi6OI+2A55o3fMxWx8FBXPbSJwenom99M10HB0HDG1o7Dg5m
+uaHDXQcHQVk2zw4OgZxvKx0chGWdMjs4dDp7rLoODjYh65Xs4FAf+BST7ODgme1UC1U6OAhKsqzj
+4NAB73xOUXZwEDS8BJsdHGID78bpODh0Sj2vDGcHh865l7FMDg4dis/VzB0Hh07Q73g3SFN20Gfv
+hpjQVPWyd0NnJxtTaugVEfkU3k0hWB3vphCs7N0UkpW9m0KyOt5NIVnZuykkK3s3hWR1vJtCtLJ3
+U4hW8m4Kyep4N4VkZe+mkCzxbgqx6ng3hVhl76YQq+zdFGLV8W4KscreTSFW2bspxKrj3ahYZdem
+EKvs2hRi1XFt7kesllwbXAfLkU12bfgbQMKKa1Pc33FtcC1LZ3TuDNYt8npHx7Xpv3m1JV3XBmPZ
+ug2laT9fxcUPQbCVjEzyWKo6yr7w0rnBVuoKSb4Vd0tYs0S0A2bnpsSTH1KQzf5KakHHtSkaW96a
+u1UQXeFBst34HZumVX8x2+4OrkYW10prZY+a45APLOnYbvo+zMYv3Uzn0ddLZEuwsN0Fno1sJluY
+49yGru3ODS5vzl0ryK7wgVn0vpyNR/TlD4v5M5hCVzCLnjwRnHI55SePH/3wjj4zFX/44u/fPZ3O
+gNTjR9+kn3F6fvPL9yc/LM4m9HN35r7no28HX/37fDaHD59AAy+mr66vJpc0h0EBXIyX7zl9O52d
+XUx4ltvBN3+bX+UP8Z+rP95N6MOvTFX9CdTEz/PpKeCqLcp7fxvPruXm36dnV2/ffzcmtOhmaI7c
+/udt6NrbyfTN26v1+6b331fnNujav9fv1b/vr0OHf3t5OHv3dvzSrN2x6Vlh4G7qEt60BYP0x/qD
+9Mf9dWjx6l+T06vh4np+Bk0cLm4RraJ/r0kDwr1Xl+v3tPPQn9fr2ENTsFfXF6+uZ5P56WRtXvHD
+6zIpvereurd2xy4ml9ezDZSs3n9v8xf8h7U792p8OXl6Mfk/1zDWG8zmpcfuq6t27X7Or89/PL0a
+/zbZYCKXz9xXD+eLF1fTq9Nb/Jeio5d0+0/T2SY97Ty0psq6qT/mff3pt3ylxp38VKqeWxr+/lF5
++KplOr9Fgjs+Ad58X3L4YnF9cTr57mL87u30dIP+bdK9++vdbe0surR4N7kYXy0u1u9YfuKeZ9Zo
+cf5ucTm9Wm9ifaJWkHN0ewO+OZq8Hny7j0P3cegncZF2Ng51+zh0H4fuThz6+mIMHvjsh8X0ch+J
+bmEkun5abLsD0fXV7j4Q3QeiD0+z7APRfSC6D0T7GrAlgajb3UB0k65tWyD6xO5iKDqc/DaZvXg7
+Plv8vksLoxsN1sYh6TaGZ2yMKfOwc6b41ez6Ftu6xZHZ+vHK5dXZ0eS3qdTfre/Hl0/ds7vx3fj6
+8nI6ng95RLfPlV9/tM42sBFn92gkNujRBor07B4zABupi23RgYvXry8nV8PPpAnvU0f8SD3dSu2w
+k5I3Q78cq1dPF7PFxV9+f8vR4ro264/ZBhlguf2+unr5bnL64/UtU2aLfY31i5Eury9ej08nL07H
+Gw1f56l7C1Or9bsJA349G18c//vdYj6ZbzCUq0/eW3c37u1oMb+8Gt+lt/nJLQ2TIHCEP2tz7D/r
+s+g/9xgN+036tB25iydmo4H6JDH+p/Jwni2m86sTSY/dW9Z18kIm9YkY+K10ue6W99iWJZZNHZJt
+8Sl33dHaLx49fM2xvnH59ZYcSTk4eO99Sd0GPbrFaez0yGyDb/trvUGP6q3o0QZG6tetslHbYn13
+u8BhNr16Np7eFgVusREeX0yv3p5PrjYYu70x3s6w/g7Z8TtM0/sc3u8nF28myNet9LU21jU7PTqf
+tBX7Qq6P5amZfSHXn7exkMuv37ftyIUe/u3laLGYDS8mk/+sv/T28Iu4NpHC/b6inp7uwr4ic7D+
+0QEX47Pp9Qb80fvvN4DczaK8DXp0tkGP7lEfrd+jbYuEz6az8QZFG1scBX+/uHj3djFbvPljK+Ok
+XVaGu6cCN9jUtSUqcHc3wO5V4JaowCc7WJC8e5pvw71E26D61u/SvrD6cw/Ozh8+scmE2hYdsb4r
+uzU6YgPvfMv8o2qDyGO7DwhZvwh+f0DI+/dq7A8I+UgDdkvtUjlSG27IuN+dGJuYgK2pCtpFU72+
+AG6NqV6/S9tmqg/XXzQbvR3P55PZi8lscrpRNmP1yfvq7fP1F3Pv3NvVJ+/Znh1NL9/NxqeT88n8
+6vvxu600audjILf+Aug2RWvVQK/Byo+m8+Pa3acfN/C+9P4t0K9bYwU3PLF1G6zg+l3a0qTWCDel
+f6+qZvu05CZCty3zaP0Ie2vm0fpd2jZvcoPt45/v/KGHNktfb1Z693o6m21UxTW7R1/mFqejzPvh
+N9NtkO/j2x++YL++WJxvMFx09331an1FdLXYwJ1e3GOP1hfAs9v2d3RWfK/vMWodz34f/7F+x8AI
+XI0vNrMa/MB9dXB9Y1B0M7XhB+rKup1deuy+ujybzifj9TcYnY5np98vzjboZ37ivro4X8zXt3Jj
+/ELg69vLajpDWTxzX528mFBuZf1+np1Nr6a/bdLL9MS9Rkfj+fR8fL9HO2//iY9P4r4e6cGHnKe7
+V4+0QZe2NHWzr0d6uBnuTSbUtuiI3atH2qBL25aW+oK+OneD8yr3FUn7iqTPMmDrO73bVZG0iRHY
+moqkXTTWu1eRtEGXts1Y7yuS+nu7r0h6UEbtS6pIMl9cRdImJmNbrODuVSRt0KUtTWtte0XSJkK3
+LfNo9yqSNujStnmTD7IiaRvWx7axsmqTqbm5trnPkd3uEzs3KeLcj8uOnKKzPcPySVtxny3YqSNU
+D//28ojO3Xm5YTpvTc9rGw3eBlnALTvga7ePy98fILVXhB9BEYa9IpT+rc+JvSLcK8K9ItwVRXh8
+AcjeIdw7hFuuBycox3s1uFeDH6IG9+7g3h3cq8G9Gvxi1WC5/vVyw3KHHdaG63PiS1wD3c+tzedW
+s59b0r/1ObGfW/u5dcPcejb992T2bDb+4+WGW08fclGRrwZ+/QJRHtPnm9SIFo/cVx/3X9G2Mcsu
+JueL244/2J9+tNSv+z79aIOe7Y/VSamC+z5WxwzMt7YaGA//VgP4+y38DP//Fj4Y7Gzp/nR+Nnk9
+nU83WFa6mLybjK+ONpHc4pH76uiaJnNnjky6fIeHJq3d2f2RSX1DuT8y6WEemfTQ3LRd/rbZV7Pb
+NP0W7uHYqFPbtotjn2XZPt2x+RrVthyRsJn+2BKleLo4f7e4BK/5x+tbFMMW65HbBmM3FhdHOpRb
+qT3Wzxn+esvCVjk4eO+95YXW79Et+d9Oj8w9ZhbW79EtFWmdHtVb0aMNzNSv92il7ubBb4sNvpO5
+2kZb/FlO7ryf/OvF9Ort+eRqAx9xb5S3c9HnbgK933R611bsF+c/xeL8hme+PuRs0X5xfr8438Oy
+/eL8n/eL89qv/eL8J9fAuDxvq28308b7Bfn+Ad0vyO+/w2i/IH8nq79fkF889LT4fkF+vyD/cHJ3
++wX5bdIdO7lgfTZ9/fp6g29M2ha9sWm/tk11rJ//FU6MFnOI1eYbdHHlwYffVx6VF5t9/0nnofvq
+4x+T2Wzx+9odnU3fvL2CG56c4tHW6/d1+bl7i9vXt3zXF6/Brd5wTLtPrWn5HprB2Q==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+</i:pgf>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/common/resources/google_logo.svg Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+]>
+<svg version="1.2" baseProfile="tiny" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+ x="0px" y="0px" width="88px" height="72px" viewBox="0 0 88 72" xml:space="preserve">
+<path fill="#0066CC" d="M78.046,61.925c0,3.808-3.084,6.892-6.89,6.892H18.724c-3.805,0-6.889-3.084-6.889-6.892V9.491
+ c0-3.805,3.084-6.889,6.889-6.889h52.434c3.807,0,6.891,3.084,6.891,6.889v52.434H78.046z"/>
+<path fill="#FFFFFF" d="M54.366,9.872c1.655,1.371,5.118,4.253,5.118,9.734c0,5.334-3.027,7.858-6.057,10.237
+ c-0.938,0.938-2.021,1.948-2.021,3.533c0,1.586,1.083,2.452,1.875,3.101l2.597,2.019c3.172,2.667,6.057,5.12,6.057,10.095
+ c0,6.777-6.563,13.627-18.962,13.627c-10.453,0-15.502-4.976-15.502-10.311c0-2.597,1.299-6.273,5.555-8.8
+ c4.469-2.736,10.525-3.098,13.769-3.313c-1.01-1.299-2.163-2.669-2.163-4.902c0-1.226,0.361-1.947,0.724-2.812
+ c-0.793,0.069-1.586,0.146-2.31,0.146c-7.642,0-11.967-5.699-11.967-11.322c0-3.314,1.514-6.994,4.614-9.66
+ c4.108-3.389,9.013-3.965,12.903-3.965h14.854l-4.614,2.595L54.366,9.872L54.366,9.872z M49.247,41.884
+ c-0.577-0.071-0.938-0.071-1.656-0.071c-0.647,0-4.545,0.146-7.572,1.154c-1.586,0.576-6.199,2.307-6.199,7.428
+ c0,5.115,4.975,8.793,12.688,8.793c6.924,0,10.602-3.314,10.602-7.783C57.104,47.725,54.729,45.777,49.247,41.884z M51.339,28.187
+ c1.656-1.66,1.804-3.967,1.804-5.265c0-5.19-3.103-13.266-9.086-13.266c-1.873,0-3.893,0.938-5.047,2.381
+ c-1.225,1.514-1.586,3.459-1.586,5.333c0,4.83,2.812,12.835,9.013,12.835C48.236,30.205,50.184,29.34,51.339,28.187z"/>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/common/resources/issearch_icons.qrc Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,8 @@
+<RCC>
+ <qresource prefix="/">
+ <file>google_logo.svg</file>
+ <file>bing_logo.svg</file>
+ <file>baidu_logo.svg</file>
+ <file>yandex_logo.svg</file>
+ </qresource>
+</RCC>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/common/resources/yandex_logo.svg Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="88px" height="88px" viewBox="0 0 88 88" enable-background="new 0 0 88 88" xml:space="preserve">
+<path fill="#FFFFFF" stroke="#BCBEC0" stroke-width="2" d="M83.223,43.183c0.264,0.461,0.264,1.214,0,1.678L61.998,81.624
+ c-0.27,0.462-0.918,0.836-1.455,0.836H4.947c-0.534,0-0.969-0.434-0.969-0.968l0-74.94c0-0.533,0.436-0.969,0.97-0.969h55.596
+ c0.537,0,1.186,0.377,1.455,0.839L83.223,43.183z"/>
+<path fill="#ED1C24" d="M42.917,17.242h-8.12c-7.973,0-14.736,6.071-14.736,17.854c0,7.071,3.275,12.28,9.111,14.855L18.284,69.657
+ c-0.356,0.65,0,1.144,0.567,1.144h5.056c0.425,0,0.709-0.143,0.852-0.493l9.898-19.357h3.561v19.357
+ c0,0.211,0.213,0.493,0.493,0.493h4.414c0.428,0,0.574-0.211,0.574-0.569V17.958C43.699,17.457,43.412,17.242,42.917,17.242z
+ M38.218,46.381h-2.992c-4.703,0-9.253-3.427-9.253-11.999c0-8.927,4.267-12.571,8.611-12.571h3.634V46.381z"/>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/eabi/isengineu.def Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,19 @@
+EXPORTS
+ _ZN8IsEngine11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME
+ _ZN8IsEngine11qt_metacastEPKc @ 2 NONAME
+ _ZN8IsEngine16PerformWebSearchERK7QString @ 3 NONAME
+ _ZN8IsEngine16SelectedProviderEv @ 4 NONAME
+ _ZN8IsEngine16staticMetaObjectE @ 5 NONAME DATA 16
+ _ZN8IsEngine19SetSelectedProviderEi @ 6 NONAME
+ _ZN8IsEngine19getStaticMetaObjectEv @ 7 NONAME
+ _ZN8IsEngine9ProvidersER5QListI15ServiceProviderE @ 8 NONAME
+ _ZN8IsEngineC1EP7QObject @ 9 NONAME
+ _ZN8IsEngineC2EP7QObject @ 10 NONAME
+ _ZN8IsEngineD0Ev @ 11 NONAME
+ _ZN8IsEngineD1Ev @ 12 NONAME
+ _ZN8IsEngineD2Ev @ 13 NONAME
+ _ZNK8IsEngine10metaObjectEv @ 14 NONAME
+ _ZNK8IsEngine21PerformInDeviceSearchERK7QString @ 15 NONAME
+ _ZTI8IsEngine @ 16 NONAME
+ _ZTV8IsEngine @ 17 NONAME
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/eabi/isproviderdbmanageru.def Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,21 @@
+EXPORTS
+ _ZN19IsProviderDBManager11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME
+ _ZN19IsProviderDBManager11qt_metacastEPKc @ 2 NONAME
+ _ZN19IsProviderDBManager12GetProvidersER5QListI15ServiceProviderE @ 3 NONAME
+ _ZN19IsProviderDBManager12OpenDatabaseEv @ 4 NONAME
+ _ZN19IsProviderDBManager13CloseDatabaseEv @ 5 NONAME
+ _ZN19IsProviderDBManager14GetCountryCodeEv @ 6 NONAME
+ _ZN19IsProviderDBManager14GetCountryListER11QStringList @ 7 NONAME
+ _ZN19IsProviderDBManager16SelectedProviderEv @ 8 NONAME
+ _ZN19IsProviderDBManager16staticMetaObjectE @ 9 NONAME DATA 16
+ _ZN19IsProviderDBManager19SetSelectedProviderEi @ 10 NONAME
+ _ZN19IsProviderDBManager19getStaticMetaObjectEv @ 11 NONAME
+ _ZN19IsProviderDBManagerC1EP7QObject @ 12 NONAME
+ _ZN19IsProviderDBManagerC2EP7QObject @ 13 NONAME
+ _ZN19IsProviderDBManagerD0Ev @ 14 NONAME
+ _ZN19IsProviderDBManagerD1Ev @ 15 NONAME
+ _ZN19IsProviderDBManagerD2Ev @ 16 NONAME
+ _ZNK19IsProviderDBManager10metaObjectEv @ 17 NONAME
+ _ZTI19IsProviderDBManager @ 18 NONAME
+ _ZTV19IsProviderDBManager @ 19 NONAME
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/isengine/inc/isengine.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,61 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef ISENGINE_H
+#define ISENGINE_H
+
+#include <qglobal.h>
+#include <QObject>
+#include <QtCore/QStringList.h>
+
+#if defined(ISENGINESERVICES_LIB)
+# define ISENGINELIB_EXPORT Q_DECL_EXPORT
+#else
+# define ISENGINELIB_EXPORT Q_DECL_IMPORT
+#endif
+
+class ServiceProvider;
+class IsProviderDBManager;
+
+/*!
+ * Internet Search Engine
+ *
+ */
+class ISENGINELIB_EXPORT IsEngine : public QObject
+{
+ Q_OBJECT
+
+
+public:
+ IsEngine( QObject *parent = 0 );
+ ~IsEngine();
+
+ ServiceProvider* SelectedProvider();
+ bool SetSelectedProvider(const int providerId);
+ bool Providers(QList<ServiceProvider>& providers);
+ void PerformWebSearch(const QString& searchParam);
+ void PerformInDeviceSearch(const QString& searchParam) const;
+
+private:
+ /*!< Provider database handler*/
+ IsProviderDBManager* m_dbHandler;
+ /*!< Activity manager*/
+ QObject *m_activityManager;
+
+};
+
+#endif // ISENGINE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/isengine/isengine.pro Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,56 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+
+
+TEMPLATE = lib
+TARGET = isengine
+TARGET.EPOCALLOWDLLDATA = 1
+TARGET.CAPABILITY = CAP_GENERAL_DLL
+CONFIG += hb mobility
+MOBILITY = serviceframework
+
+DEFINES += ISENGINESERVICES_LIB
+
+#INCLUDEPATH += . ../inc
+
+QT += sql
+
+symbian {
+ TARGET.UID3 = 0x2000F875
+ INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
+ INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+
+ defBlock = \
+ "$${LITERAL_HASH}if defined(EABI)" \
+ "DEFFILE ../eabi/" \
+ "$${LITERAL_HASH}else" \
+ "DEFFILE ../bwins/" \
+ "$${LITERAL_HASH}endif"
+
+ MMP_RULES += defBlock
+}
+
+
+
+HEADERS += ./inc/*.h
+SOURCES += ./src/*.cpp
+
+
+LIBS += -lxqutils -lisproviderdbmanager
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/isengine/src/isengine.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,120 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include <QDesktopServices>
+#include <xqapplicationmanager.h>
+#include <QUrl>
+#include <qservicemanager.h>
+#include "isengine.h"
+#include "isproviderdbmanager.h"
+QTM_USE_NAMESPACE
+const QString KAppUid = "0x2002C377";
+
+IsEngine::IsEngine(QObject *parent) :
+ QObject(parent), m_activityManager(0)
+ {
+ QServiceManager serviceManager;
+ m_activityManager = serviceManager.loadInterface(
+ "com.nokia.qt.activities.ActivityManager");
+
+ m_dbHandler = new IsProviderDBManager;
+ }
+
+IsEngine::~IsEngine()
+ {
+ if (m_activityManager)
+ {
+ delete m_activityManager;
+ }
+
+ delete m_dbHandler;
+ }
+
+/*!
+ * \brief Sets selected provider
+ * Returns false if something goes wrong with the database access
+ */
+bool IsEngine::SetSelectedProvider(const int providerId)
+ {
+ return m_dbHandler->SetSelectedProvider(providerId);
+ }
+
+/*!
+ * \brief Gets selected provider
+ */
+ServiceProvider* IsEngine::SelectedProvider()
+ {
+ return m_dbHandler->SelectedProvider();
+ }
+
+/*!
+ * \brief Gets list of providers allowed in the current country.
+ * Returns false if something goes wrong with the database access
+ */
+bool IsEngine::Providers(QList<ServiceProvider>& providers)
+ {
+ return m_dbHandler->GetProviders(providers);
+ }
+
+/*!
+ * \brief Performs internet search by creating search url and opening the browser
+ * with it.
+ */
+void IsEngine::PerformWebSearch(const QString &searchParam)
+ {
+ ServiceProvider* provider = SelectedProvider();
+
+ if (provider)
+ {
+ QString url;
+ if ( searchParam.length() )
+ {
+ // add search param to url
+ url.append((provider->ProviderUrl().arg(searchParam)));
+ }
+ else
+ {
+ // search with empty param
+ url.append((provider->ProviderUrl().arg("")));
+ }
+
+
+ // Launch the browser
+ QDesktopServices::openUrl(QUrl(url));
+ }
+ }
+
+/*!
+ * \brief Performs in device search
+ *
+ * \param searchParam a const QString & argument.
+ */
+void IsEngine::PerformInDeviceSearch(const QString &searchParam) const
+ {
+ QUrl url;
+ url.setScheme("appto");
+ url.setHost(KAppUid);
+ url.addQueryItem("activityname", "SearchDeviceQueryView");
+
+ url.addQueryItem("query", searchParam);
+
+ QString debugString = url.toString();
+ bool ok = QMetaObject::invokeMethod(m_activityManager, "launchActivity",
+ Q_ARG(QUrl, url));
+
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/isproviderdbmanager/inc/isproviderdbconstants.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef ISPROVIDERDBCONSTANTS_H_
+#define ISPROVIDERDBCONSTANTS_H_
+
+// Database info
+#ifdef __WINSCW__
+const QString databaseName = "c:\\private\\20022f35\\providerdatabase.sq";
+#else
+const QString databaseName = "z:\\private\\20022f35\\providerdatabase.sq";
+#endif
+const QString connectionName = "providerdatabase.sq";
+const QString databaseType = "QSQLITE";
+
+// SQL Queries
+const QString providerQuery = "SELECT p.ProviderId, Name, Description, Iconpath FROM Providers p INNER JOIN CountryProviderMap map ON p.ProviderId = map.ProviderId JOIN Countries ON map.CountryId = Countries.CountryId WHERE Countries.CountryCode = \'";
+const QString selectedProviderQuery = "SELECT ProviderId, Name, Description, Iconpath, ProviderUrl FROM Providers WHERE Selected = 1";
+const QString resetProviderSelection = "UPDATE Providers SET Selected = 0";
+const QString setSelectedProvider = "UPDATE Providers SET Selected = 1 WHERE ProviderId = ";
+const QString countryQuery = "SELECT Country FROM Countries";
+
+
+#endif /* ISPROVIDERDBCONSTANTS_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/isproviderdbmanager/inc/isproviderdbmanager.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef ISPROVIDERDBMANAGER_H
+#define ISPROVIDERDBMANAGER_H
+
+#include <qglobal.h>
+#include <QObject>
+#include <QtCore/QStringList.h>
+#include <QSqlDatabase>
+#include "serviceprovider.h"
+
+#if defined(ISPROVIDERDBSERVICES_LIB)
+#define ISPROVIDERDBLIB_EXPORT Q_DECL_EXPORT
+#else
+#define ISPROVIDERDBLIB_EXPORT Q_DECL_IMPORT
+#endif
+
+
+
+class QSqlDatabase;
+
+/*!
+ *
+ *
+ */
+class ISPROVIDERDBLIB_EXPORT IsProviderDBManager : public QObject
+{
+ Q_OBJECT
+
+public:
+ IsProviderDBManager( QObject *parent = 0 );
+ ~IsProviderDBManager();
+
+ bool GetProviders(QList<ServiceProvider>& providers);
+ bool GetCountryList(QStringList& countryList);
+ ServiceProvider* SelectedProvider();
+ bool SetSelectedProvider(int providerId);
+
+private:
+ bool OpenDatabase();
+ void CloseDatabase();
+ QString GetCountryCode();
+
+private:
+ QSqlDatabase m_db;
+};
+
+#endif // ISPROVIDERDBMANAGER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/isproviderdbmanager/isproviderdbmanager.pro Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,50 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+
+TEMPLATE = lib
+TARGET = isproviderdbmanager
+TARGET.CAPABILITY = CAP_GENERAL_DLL
+TARGET.EPOCALLOWDLLDATA = 1
+DEPENDPATH += . inc src
+INCLUDEPATH += . ../common/inc
+CONFIG += hb mobility
+MOBILITY = systeminfo
+DEFINES += ISPROVIDERDBSERVICES_LIB
+
+QT += sql network
+
+RESOURCES += ../common/resources/issearch_icons.qrc
+
+# Input
+HEADERS += inc/isproviderdbmanager.h inc/isproviderdbconstants.h
+SOURCES += src/isproviderdbmanager.cpp
+
+symbian: {
+
+ TARGET.UID3 = 0xE47ae51a
+ INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
+ INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+
+defBlock = \
+ "$${LITERAL_HASH}if defined(EABI)" \
+ "DEFFILE ../eabi/" \
+ "$${LITERAL_HASH}else" \
+ "DEFFILE ../bwins/" \
+ "$${LITERAL_HASH}endif"
+
+ MMP_RULES += defBlock
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/isproviderdbmanager/src/isproviderdbmanager.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,229 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+#include <QSqlQuery>
+#include <QSqlError>
+#include <qsysteminfo.h>
+using namespace QtMobility;
+#include <QVariant>
+#include <QStringList.h>
+
+#include "isproviderdbmanager.h"
+#include "isproviderdbconstants.h"
+
+
+/*!
+ * \brief Constructor
+ */
+IsProviderDBManager::IsProviderDBManager( QObject *parent ) : QObject(parent)
+ {
+ }
+
+/*!
+ * \brief Destructor
+ */
+IsProviderDBManager::~IsProviderDBManager()
+ {
+ }
+
+/*!
+ * \brief Opens the database
+ */
+bool IsProviderDBManager::OpenDatabase()
+ {
+ m_db = QSqlDatabase::addDatabase(databaseType, connectionName);
+ m_db.setDatabaseName(databaseName);
+
+ if ( !m_db.isValid())
+ {
+ CloseDatabase();
+ return false;
+ }
+
+ if (!m_db.isOpen())
+ {
+ if (!m_db.open())
+ {
+ CloseDatabase();
+ return false;
+ }
+ }
+ return true;
+ }
+
+/*!
+ * \brief Closes the database
+ */
+void IsProviderDBManager::CloseDatabase()
+ {
+ // if (m_db.isValid() && m_db.isOpen())
+ // {
+ m_db.close();
+ // }
+ }
+
+/*!
+ * \brief Reads providers allowed in the current country
+ */
+bool IsProviderDBManager::GetProviders(QList<ServiceProvider>& providers)
+ {
+ bool ok = OpenDatabase();
+
+ if (ok)
+ {
+ // Create query that gets providers allowed this country
+ QString queryString(providerQuery);
+ // get country code and append to query
+ queryString.append(GetCountryCode());
+ queryString.append("\'");
+
+ QSqlQuery query(QSqlDatabase::database(connectionName));
+ query.prepare(queryString);
+ query.exec();
+ // read all found providers
+ while (query.next())
+ {
+ ServiceProvider* provider = new ServiceProvider();
+
+ int providerId = query.value(0).toInt();
+ provider->SetId(providerId);
+
+ QString providerName = query.value(1).toString();
+ provider->SetName(providerName);
+
+ QString providerDescription = query.value(2).toString();
+ provider->SetDescription(providerDescription);
+
+ HbIcon icon(query.value(3).toString());
+ provider->SetIcon(icon);
+
+ QString pluginName = query.value(10).toString();
+ provider->SetPluginName(pluginName);
+ providers.append(*provider);
+ }
+ }
+
+ CloseDatabase();
+
+ return ok;
+ }
+
+/*!
+ * \brief Gets selected provider
+ */
+ServiceProvider* IsProviderDBManager::SelectedProvider()
+ {
+ ServiceProvider* provider = NULL;
+
+ bool ok = OpenDatabase();
+ if (ok)
+ {
+ // Create query that gets providers allowed this country
+ QSqlQuery query(QSqlDatabase::database(connectionName));
+ query.prepare(selectedProviderQuery);
+ query.exec();
+
+ // read all found providers
+ while (query.next())
+ {
+ provider = new ServiceProvider();
+
+ int providerId = query.value(0).toInt();
+ provider->SetId(providerId);
+
+ QString providerName = query.value(1).toString();
+ provider->SetName(providerName);
+
+ QString providerDescription = query.value(2).toString();
+ provider->SetDescription(providerDescription);
+
+ HbIcon icon(query.value(3).toString());
+ provider->SetIcon(icon);
+
+ QString providerUrl = query.value(4).toString();
+ provider->SetProviderUrl(providerUrl);
+ }
+ }
+
+ CloseDatabase();
+
+ return provider;
+ }
+
+/*!
+ * \brief Sets selected provider
+ */
+bool IsProviderDBManager::SetSelectedProvider(int providerId)
+ {
+ bool ok = OpenDatabase();
+ if (ok)
+ {
+ // Clear selection status from all providers
+ QSqlQuery query(QSqlDatabase::database(connectionName));
+ query.prepare(resetProviderSelection);
+ ok = query.exec();
+
+ if (ok)
+ {
+ // Set selection status to selected provider
+ QString queryString(setSelectedProvider);
+ queryString.append( QString::number(providerId));
+
+ query.clear();
+ query.prepare(queryString);
+ ok = query.exec();
+ }
+ }
+
+ CloseDatabase();
+
+ return ok;
+ }
+
+/*!
+ * \brief Reads country list from database
+ */
+bool IsProviderDBManager::GetCountryList(QStringList& countryList)
+ {
+ bool ok = OpenDatabase();
+ if (ok)
+ {
+ // Create query that gets country list
+ QSqlQuery query(QSqlDatabase::database(connectionName));
+ query.prepare(countryQuery);
+ ok = query.exec();
+
+ // read all found providers
+ while (query.next())
+ {
+ countryList << query.value(0).toString();
+ }
+ }
+
+ CloseDatabase();
+
+ return ok;
+ }
+
+/*!
+ * \brief Return current country code retrieved from system
+ */
+QString IsProviderDBManager::GetCountryCode()
+ {
+ QSystemInfo *sysInfo = new QSystemInfo(this);
+ return "FI";//sysInfo->currentCountryCode();
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/onlinesearchproviders.pro Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,26 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TEMPLATE = subdirs
+
+SUBDIRS = isproviderdbmanager \
+ isengine
+
+CONFIG += ordered
+
+symbian: {
+ BLD_INF_RULES.prj_exports += "rom/issearch.iby CORE_APP_LAYER_IBY_EXPORT_PATH(issearch.iby)"
+ }
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/onlinesearchproviders/rom/issearch.iby Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,30 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef ISSEARCH_IBY
+#define ISSEARCH_IBY
+#ifdef FF_SEARCH_SW
+#include <data_caging_paths_for_iby.hrh>
+
+//ENGINE
+file = ABI_DIR\BUILD_DIR\isengine.dll SHARED_LIB_DIR\isengine.dll
+file = ABI_DIR\BUILD_DIR\isproviderdbmanager.dll SHARED_LIB_DIR\isproviderdbmanager.dll
+data=ZPRIVATE\20022F35\providerdatabase.sq private\20022F35\providerdatabase.sq
+data=ZPRIVATE\20022F35\providerdatabase.sq c:\private\20022F35\providerdatabase.sq
+
+#endif //FF_SEARCH_SW
+#endif // ISSEARCH_IBY
--- a/rom/cpix_app.iby Fri Jun 11 16:24:16 2010 +0100
+++ b/rom/cpix_app.iby Thu Jul 22 16:34:05 2010 +0100
@@ -52,6 +52,11 @@
// Notes plugin
ECOM_PLUGIN( cpixnotesplugin.dll, cpixnotesplugin.rsc)
+// Email plugin
+ECOM_PLUGIN( cpixemailplugin.dll, cpixemailplugin.rsc)
+file=ABI_DIR\BUILD_DIR\qtemailfetcher.dll SHARED_LIB_DIR\qtemailfetcher.dll
+
+
data=DATAZ_\private\10202be9\20029ac7.cre private\10202be9\20029ac7.cre
data=ZSYSTEM\install\cpixsearchapp_stub.sis System\Install\cpixsearchapp_stub.sis
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/search.pro Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: SEARCH project file
+#
+TEMPLATE = subdirs
+
+SUBDIRS += search_plat \
+ onlinesearchproviders \
+ searchui \
+ harvesterplugins/messaging/email/qtemailfetcher
+
+
+CONFIG += ordered
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/search_plat/onlinesearchplugin_api/inc/onlinesearchplugin.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,121 @@
+ /*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: OnlineSearchPlugin class definition
+ *
+ */
+
+#ifndef ONLINESEARCHPLUGIN_H
+#define ONLINESEARCHPLUGIN_H
+
+#include <QObject>
+
+/**
+ * @ingroup group_onlinesearchpluginmodel
+ * @brief Represents a plugin plugin in the framework.
+ *
+ * OnlineSearchPlugin is an interface through which setting plugin plugin can be
+ * executed in the search handlers.
+ *
+ * @lib ?library
+ * @since S60 ?S60_version
+ */
+
+class OnlineSearchPlugin : public QObject
+ {
+Q_OBJECT
+public:
+
+ /**
+ * Destructor.
+ * @since S60 ?S60_version.
+ */
+ virtual ~OnlineSearchPlugin()
+ {
+ }
+
+ /**
+ * Called by the search handlers during initialize cycle of the plugin, it is during
+ * this phase the plugin widget
+ * usually creates its initial view.
+ * Once the initialization is done, pluginInitialized signal must be
+ * emitted.
+ * @since S60 ?S60_version.
+ */
+ virtual void initializePlugin() = 0;
+
+ /**
+ * Called by the search handlers when the plugin becomes the current plugin.
+ * @since S60 ?S60_version.
+ */
+ virtual void activatePlugin() = 0;
+ /**
+ * Called by the search handlers when the plugin becomes the current plugin.
+ * @since S60 ?S60_version.
+ */
+ virtual void activatePlugin(const QString &searchQuery) = 0;
+
+ /**
+ * Called by the search handlers when the plugin is no longer being displayed.
+ */
+ virtual void deactivatePlugin() = 0;
+
+ /**
+ * Called by the search handlers before the plugin destructor is called.
+ * @param reason The reason why the search handlers is being killed.
+ */
+ virtual void shutdownPlugin() = 0;
+
+protected:
+
+ /**
+ * Constructor.
+ * @since S60 ?S60_version.
+ */
+ OnlineSearchPlugin()
+ {
+ }
+
+signals:
+
+ /**
+ * Emit this signal when changing the view inside the plugin.
+ * @param caller The calling plugin plugin instance.
+ * @param viewWidget The new plugin view widget to be shown.
+ */
+ void viewChanged();
+
+ /**
+ * Emit this signal to indicate initialization is done.
+ * @param caller The calling plugin plugin instance.
+ * @param success True if succeeded, false otherwise.
+ */
+ void pluginInitialized(bool success);
+
+ /**
+ * Emit this signal to indicate that the plugin plugin can be deleted.
+ * Note that this signal does not need to be emitted if true is returned
+ * from shutdownPlugin.
+ * @param caller The calling plugin plugin instance.
+ */
+ void shutdownCompleted(bool success);
+
+ /**
+ * Called by search handlers when back button is clicked in the plugin view.
+ * In this method the plugin plugin can implement internally showing and
+ * hiding GUI elements if the plugin has multiple 'views'.
+ */
+ void handleBackEvent();
+ };
+
+#endif // ONLINESEARCHPLUGIN_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/search_plat/onlinesearchplugin_api/inc/onlinesearchpluginfactory.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: OnlineSearchPluginFactory class definition
+ *
+ */
+
+#ifndef ONLINESEARCHPLUGINFACTORY_H
+#define ONLINESEARCHPLUGINFACTORY_H
+
+
+class OnlineSearchPlugin;
+
+/**
+ * @ingroup group_onlinesearchpluginmodel
+ * @brief A factory class through which the wizard plugin can be instantiated.
+ *
+ * OnlineSearchPluginFactory contains a factory method to create a wizard plugin instance.
+ *
+ * @lib ?library
+ * @since S60 ?S60_version
+ */
+
+class OnlineSearchPluginFactory
+{
+public:
+ /**
+ * Instantiates a wizard plugin object.
+ * @return The constructed wizard plugin object.
+ * @since S60 ?S60_version.
+ */
+ virtual OnlineSearchPlugin* createPlugin() const = 0;
+};
+
+Q_DECLARE_INTERFACE(OnlineSearchPluginFactory, "com.nokia.search.OnlineSearchPluginFactory/1.0");
+
+#endif // ONLINESEARCHPLUGIN_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/search_plat/onlinesearchplugin_api/onlinesearchplugin_api.metaxml Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<api id="ece024acf429cde33ecf84e4538a7a32" dataversion="1.0">
+<name>onlinesearchplugin_api</name>
+<description>Online search plugin API for search framework. This is UI plugin for in device search application to launch the user chosen internet search provider. This exposes API based on qt plugin mechanism.</description>
+<type>c++</type>
+<subsystem>search</subsystem>
+<libs></libs>
+<release category="platform" sinceversion="5.0"/>
+<attributes>
+<htmldocprovided>no</htmldocprovided>
+<adaptation>no</adaptation>
+</attributes>
+</api>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/search_plat/onlinesearchplugin_api/onlinesearchplugin_api.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,18 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+PLATFORM_HEADERS += onlinesearchplugin_api/inc/onlinesearchplugin.h \
+ onlinesearchplugin_api/inc/onlinesearchpluginfactory.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/search_plat/onlinesearchproviders_api/inc/isengine.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,61 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef ISENGINE_H
+#define ISENGINE_H
+
+#include <qglobal.h>
+#include <QObject>
+#include <QtCore/QStringList.h>
+
+#if defined(ISENGINESERVICES_LIB)
+# define ISENGINELIB_EXPORT Q_DECL_EXPORT
+#else
+# define ISENGINELIB_EXPORT Q_DECL_IMPORT
+#endif
+
+class ServiceProvider;
+class IsProviderDBManager;
+
+/*!
+ * Internet Search Engine
+ *
+ */
+class ISENGINELIB_EXPORT IsEngine : public QObject
+{
+ Q_OBJECT
+
+
+public:
+ IsEngine( QObject *parent = 0 );
+ ~IsEngine();
+
+ ServiceProvider* SelectedProvider();
+ bool SetSelectedProvider(const int providerId);
+ bool Providers(QList<ServiceProvider>& providers);
+ void PerformWebSearch(const QString& searchParam);
+ void PerformInDeviceSearch(const QString& searchParam) const;
+
+private:
+ /*!< Provider database handler*/
+ IsProviderDBManager* m_dbHandler;
+ /*!< Activity manager*/
+ QObject *m_activityManager;
+
+};
+
+#endif // ISENGINE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/search_plat/onlinesearchproviders_api/inc/isproviderdbmanager.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,63 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef ISPROVIDERDBMANAGER_H
+#define ISPROVIDERDBMANAGER_H
+
+#include <qglobal.h>
+#include <QObject>
+#include <QtCore/QStringList.h>
+#include <QSqlDatabase>
+#include "serviceprovider.h"
+
+#if defined(ISPROVIDERDBSERVICES_LIB)
+#define ISPROVIDERDBLIB_EXPORT Q_DECL_EXPORT
+#else
+#define ISPROVIDERDBLIB_EXPORT Q_DECL_IMPORT
+#endif
+
+
+
+class QSqlDatabase;
+
+/*!
+ *
+ *
+ */
+class ISPROVIDERDBLIB_EXPORT IsProviderDBManager : public QObject
+{
+ Q_OBJECT
+
+public:
+ IsProviderDBManager( QObject *parent = 0 );
+ ~IsProviderDBManager();
+
+ bool GetProviders(QList<ServiceProvider>& providers);
+ bool GetCountryList(QStringList& countryList);
+ ServiceProvider* SelectedProvider();
+ bool SetSelectedProvider(int providerId);
+
+private:
+ bool OpenDatabase();
+ void CloseDatabase();
+ QString GetCountryCode();
+
+private:
+ QSqlDatabase m_db;
+};
+
+#endif // ISPROVIDERDBMANAGER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/search_plat/onlinesearchproviders_api/inc/serviceprovider.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,53 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef SERVICEPROVIDER_H
+#define SERVICEPROVIDER_H
+
+#include <QList>
+#include <QObject>
+#include <HbIcon>
+
+
+class ServiceProvider
+{
+public:
+ ServiceProvider() {}
+ virtual ~ServiceProvider() {}
+ QString Name() const {return m_name;}
+ void SetName(const QString& aName) { m_name = aName; }
+ int Id() const {return m_providerId;}
+ void SetId(const int providerId) { m_providerId = providerId; }
+ HbIcon Icon() const {return m_icon;}
+ void SetIcon(const HbIcon& icon) { m_icon = icon; }
+ QString Description() const {return m_description;}
+ void SetDescription(const QString& description) { m_description = description; }
+ QString ProviderUrl() const {return m_providerUrl;}
+ void SetProviderUrl(const QString& providerUrl) { m_providerUrl = providerUrl; }
+ QString PluginName() const {return m_pluginName;}
+ void SetPluginName(const QString& pluginName) { m_pluginName = pluginName; }
+
+private:
+ int m_providerId;
+ QString m_name;
+ HbIcon m_icon;
+ QString m_description;
+ QString m_providerUrl;
+ QString m_pluginName;
+};
+
+#endif // SERVICEPROVIDER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/search_plat/onlinesearchproviders_api/onlinesearchproviders_api.metaxml Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<api id="8bfff0a255f33f33c8272f378eb5e2af" dataversion="2.0">
+ <name>onlinesearchproviders_api</name>
+ <description>This API provides interface to read the internet search providers and a way to set the default user selected internet search provider. The backend implementation uses SQL db to store the list. Each provider entity provide the name, description and suitable icon for display.</description>
+ <type>c++</type>
+ <collection>onlinesearchproviders</collection>
+ <libs>
+ <lib name="isengine.lib"/>
+ </libs>
+ <release category="platform" sinceversion="5.2"/>
+ <attributes>
+ <htmldocprovided>no</htmldocprovided>
+ <adaptation>no</adaptation>
+ </attributes>
+</api>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/search_plat/onlinesearchproviders_api/onlinesearchproviders_api.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+PLATFORM_HEADERS += onlinesearchproviders_api/inc/serviceprovider.h \
+ onlinesearchproviders_api/inc/isengine.h \
+ onlinesearchproviders_api/inc/isproviderdbmanager.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/search_plat/search_plat.pro Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TEMPLATE = subdirs
+BLD_INF_RULES.prj_exports += "$${LITERAL_HASH}include <platform_paths.hrh>"
+
+include(onlinesearchplugin_api/onlinesearchplugin_api.pri)
+include(onlinesearchproviders_api/onlinesearchproviders_api.pri)
+
+for(filename,PLATFORM_HEADERS){
+ BLD_INF_RULES.prj_exports *= "$$filename APP_LAYER_PLATFORM_EXPORT_PATH($$basename(filename))"
+ }
\ No newline at end of file
--- a/searchui/Searchapplication/Searchapplication.pro Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/Searchapplication/Searchapplication.pro Thu Jul 22 16:34:05 2010 +0100
@@ -35,6 +35,7 @@
CONFIG += hb
CONFIG += console
+CONFIG += hb console mobility
TRANSLATIONS += searchsw.ts
nft:DEFINES += NFT
@@ -53,9 +54,11 @@
TARGET.UID3 = 0x2002C377
TARGET.CAPABILITY = CAP_APPLICATION AllFiles TrustedUI
TARGET.EPOCSTACKSIZE = 0x14000 // 80kB
- TARGET.EPOCHEAPSIZE = 0x20000 0x1000000 // 128kB - 16MB
+ TARGET.EPOCHEAPSIZE = 0x20000 0x800000 // 128kB - 16MB
rom:DEFINES += ROM
SKINICON = qtg_large_search
+ INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
+ INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
}
win32 {
--- a/searchui/Searchapplication/inc/Search.h Fri Jun 11 16:24:16 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-/*
- * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description: search application main class.
- *
- */
-
-#ifndef SEARCHAPPLICATION_H
-#define SEARCHAPPLICATION_H
-
-#include "search_global.h"
-
-#include <qobject.h>
-
-class QStateMachine;
-
-/**
- * @ingroup group_searchsearchlication
- * @brief Search application main class.
- *
- * Loads a runtime from a runtime provider plugin. Manages
- * the runtime execution.
- *
- * @lib ?library
- * @since S60 ?S60_version
- */
-class Search : public QObject
- {
-Q_OBJECT
-
-public:
-
- /**
- * Constructor.
- * @since S60 ?S60_version.
- * @param aParent Parent object.
- */
- Search(QObject* aParent = 0);
-
- /**
- * Destructor.
- * @since S60 ?S60_version.
- */
- virtual ~Search();
-
-private:
-
- Q_DISABLE_COPY(Search)
-
-signals:
-
- /**
- * Emitted when the search application needs to exit.
- * @since S60 ?S60_version.
- */
- void exit();
-
-public slots:
-
- /**
- * Starts the runtime.
- * @since S60 ?S60_version.
- */
- void start();
-
- /**
- * Stops the runtime.
- * @since S60 ?S60_version.
- */
- void stop();
-
-private slots:
-
- /**
- * Called after the runtime has started.
- * @since S60 ?S60_version.
- */
- void handleRuntimeStarted();
-
- /**
- * Called after the runtime has stopped.
- * @since S60 ?S60_version.
- */
- void handleRuntimeStopped();
-
- /**
- * Called after the runtime has faulted.
- * @since S60 ?S60_version.
- */
- void handleRuntimeFaulted();
-
-private:
-
- /**
- * Runtime.
- */
- QStateMachine* mRuntime;
- };
-
-#endif//SEARCHAPPLICATION_H
--- a/searchui/Searchapplication/src/Search.cpp Fri Jun 11 16:24:16 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-/*
- * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description: Search application main class.
- *
- */
-
-#include "search.h"
-#include <qstatemachine.h>
-#include <searchruntimeprovider.h>
-#include <searchruntime.h>
-
-// ---------------------------------------------------------------------------
-// Search::Search
-// ---------------------------------------------------------------------------
-//
-Search::Search(QObject* aParent) :
- QObject(aParent), mRuntime(NULL)
- {
- SEARCH_FUNC_ENTRY("SEARCH::Search::Search");
-
- SearchRuntimeProvider *interface = new SearchRuntimeProvider();
- mRuntime = interface->createPlugin();
- if (mRuntime)
- {
- mRuntime->setParent(this);
- connect(mRuntime, SIGNAL(started()), SLOT(handleRuntimeStarted()));
- connect(mRuntime, SIGNAL(stopped()), SLOT(handleRuntimeStopped()));
- connect(mRuntime, SIGNAL(faulted()), SLOT(handleRuntimeFaulted()));
- }
- SEARCH_FUNC_EXIT("SEARCH::Search::Search");
- }
-
-// ---------------------------------------------------------------------------
-// Search::~Search()
-// ---------------------------------------------------------------------------
-//
-Search::~Search()
- {
- if (mRuntime)
- {
- disconnect(mRuntime, SIGNAL(started()), this,
- SLOT(handleRuntimeStarted()));
- disconnect(mRuntime, SIGNAL(stopped()), this,
- SLOT(handleRuntimeStopped()));
- disconnect(mRuntime, SIGNAL(faulted()), this,
- SLOT(handleRuntimeFaulted()));
-
- delete mRuntime;
- }
- }
-
-// ---------------------------------------------------------------------------
-// Search::start()
-// ---------------------------------------------------------------------------
-//
-void Search::start()
- {
- SEARCH_FUNC_ENTRY("SEARCH::Search::start");
-
- if (mRuntime)
- {
- mRuntime->start();
- }
- else
- {
- emit exit();
- }
-
- SEARCH_FUNC_EXIT("SEARCH::Search::start");
- }
-
-// ---------------------------------------------------------------------------
-// Search::stop()
-// ---------------------------------------------------------------------------
-//
-void Search::stop()
- {
- SEARCH_FUNC_ENTRY("SEARCH::Search::stop");
- if (mRuntime)
- {
- mRuntime->stop();
- }
-
- SEARCH_FUNC_EXIT("SEARCH::Search::stop");
- }
-
-// ---------------------------------------------------------------------------
-// Search::handleRuntimeStarted()
-// ---------------------------------------------------------------------------
-//
-void Search::handleRuntimeStarted()
- {
- }
-
-// ---------------------------------------------------------------------------
-// Search::handleRuntimeStopped()
-// ---------------------------------------------------------------------------
-//
-void Search::handleRuntimeStopped()
- {
- emit exit();
- }
-
-// ---------------------------------------------------------------------------
-// Search::handleRuntimeFaulted()
-// ---------------------------------------------------------------------------
-//
-void Search::handleRuntimeFaulted()
- {
- emit exit();
- }
--- a/searchui/Searchapplication/src/main.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/Searchapplication/src/main.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -15,7 +15,7 @@
*
*/
-#include "search.h"
+#include "searchapplication.h"
#include "search_global.h"
#include <QtGui>
@@ -30,7 +30,7 @@
int main(int argc, char *argv[])
{
SEARCH_FUNC_ENTRY("SEARCH::Search::main");
-
+ PERF_APP_LAUNCH_END("SearchApplication Main Called");
HbApplication app(argc, argv);
QTranslator translator;
@@ -58,8 +58,9 @@
QTranslator notesTranslator;
notesTranslator.load("notes_" + lang, path);
app.installTranslator(¬esTranslator);
-
- Search search;
+ PERF_APP_LAUNCH_END("Search Component Cunstructions starts");
+ SearchApplication search;
+ PERF_APP_LAUNCH_END("Search Component Cunstructions Ends");
#ifdef ROM
QDir::setCurrent("Z:/");
#else
@@ -70,6 +71,7 @@
QObject::connect(&search, SIGNAL(exit()), &app, SLOT(quit()),
Qt::QueuedConnection);
search.start();
+ PERF_APP_LAUNCH_END("SearchApplication Ends, Main Event Loop");
int ret = app.exec();
SEARCH_FUNC_EXIT("SEARCH::Search::main");
return ret;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/bwins/searchonlinehandleru.def Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,32 @@
+EXPORTS
+ ?getStaticMetaObject@OnlineHandler@@SAABUQMetaObject@@XZ @ 1 NONAME ; struct QMetaObject const & OnlineHandler::getStaticMetaObject(void)
+ ?backEventTriggered@OnlineHandler@@IAEXXZ @ 2 NONAME ; void OnlineHandler::backEventTriggered(void)
+ ?metaObject@OnlineHandler@@UBEPBUQMetaObject@@XZ @ 3 NONAME ; struct QMetaObject const * OnlineHandler::metaObject(void) const
+ ?qt_metacast@OnlineHandler@@UAEPAXPBD@Z @ 4 NONAME ; void * OnlineHandler::qt_metacast(char const *)
+ ?pluginShutdown@OnlineHandler@@IAEX_N@Z @ 5 NONAME ; void OnlineHandler::pluginShutdown(bool)
+ ?activatePlugin@OnlineHandler@@QAE_NXZ @ 6 NONAME ; bool OnlineHandler::activatePlugin(void)
+ ??1OnlineHandler@@UAE@XZ @ 7 NONAME ; OnlineHandler::~OnlineHandler(void)
+ ?isShutdownCompleted@OnlineHandler@@QAEX_N@Z @ 8 NONAME ; void OnlineHandler::isShutdownCompleted(bool)
+ ??0OnlineHandler@@QAE@PAVQObject@@@Z @ 9 NONAME ; OnlineHandler::OnlineHandler(class QObject *)
+ ?loadSearchPlugin@OnlineHandler@@AAEPAVOnlineSearchPlugin@@ABVQString@@@Z @ 10 NONAME ; class OnlineSearchPlugin * OnlineHandler::loadSearchPlugin(class QString const &)
+ ?setDefaultProvider@OnlineHandler@@QAEXH@Z @ 11 NONAME ; void OnlineHandler::setDefaultProvider(int)
+ ?pluginIntialized@OnlineHandler@@IAEX_N@Z @ 12 NONAME ; void OnlineHandler::pluginIntialized(bool)
+ ?defaultProvider@OnlineHandler@@IAEXH@Z @ 13 NONAME ; void OnlineHandler::defaultProvider(int)
+ ?backEvent@OnlineHandler@@QAEXXZ @ 14 NONAME ; void OnlineHandler::backEvent(void)
+ ?providerDetails@OnlineHandler@@IAEXVQString@@VHbIcon@@H@Z @ 15 NONAME ; void OnlineHandler::providerDetails(class QString, class HbIcon, int)
+ ?initializePlugin@OnlineHandler@@QAEXXZ @ 16 NONAME ; void OnlineHandler::initializePlugin(void)
+ ?staticMetaObject@OnlineHandler@@2UQMetaObject@@B @ 17 NONAME ; struct QMetaObject const OnlineHandler::staticMetaObject
+ ?trUtf8@OnlineHandler@@SA?AVQString@@PBD0@Z @ 18 NONAME ; class QString OnlineHandler::trUtf8(char const *, char const *)
+ ?trUtf8@OnlineHandler@@SA?AVQString@@PBD0H@Z @ 19 NONAME ; class QString OnlineHandler::trUtf8(char const *, char const *, int)
+ ?readSettings@OnlineHandler@@QAEXXZ @ 20 NONAME ; void OnlineHandler::readSettings(void)
+ ?writeSettings@OnlineHandler@@QAEXH@Z @ 21 NONAME ; void OnlineHandler::writeSettings(int)
+ ??_EOnlineHandler@@UAE@I@Z @ 22 NONAME ; OnlineHandler::~OnlineHandler(unsigned int)
+ ?isPluginIntialized@OnlineHandler@@QAEX_N@Z @ 23 NONAME ; void OnlineHandler::isPluginIntialized(bool)
+ ?unloadPluginandExit@OnlineHandler@@QAEXXZ @ 24 NONAME ; void OnlineHandler::unloadPluginandExit(void)
+ ?unloadPlugin@OnlineHandler@@QAEXXZ @ 25 NONAME ; void OnlineHandler::unloadPlugin(void)
+ ?tr@OnlineHandler@@SA?AVQString@@PBD0H@Z @ 26 NONAME ; class QString OnlineHandler::tr(char const *, char const *, int)
+ ?qt_metacall@OnlineHandler@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 27 NONAME ; int OnlineHandler::qt_metacall(enum QMetaObject::Call, int, void * *)
+ ?loadISPlugin@OnlineHandler@@QAEXHVQString@@@Z @ 28 NONAME ; void OnlineHandler::loadISPlugin(int, class QString)
+ ?tr@OnlineHandler@@SA?AVQString@@PBD0@Z @ 29 NONAME ; class QString OnlineHandler::tr(char const *, char const *)
+ ?activatePlugin@OnlineHandler@@QAE_NABVQString@@@Z @ 30 NONAME ; bool OnlineHandler::activatePlugin(class QString const &)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/eabi/searchonlinehandleru.def Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,32 @@
+EXPORTS
+ _ZN13OnlineHandler11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME
+ _ZN13OnlineHandler11qt_metacastEPKc @ 2 NONAME
+ _ZN13OnlineHandler12loadISPluginEi7QString @ 3 NONAME
+ _ZN13OnlineHandler12readSettingsEv @ 4 NONAME
+ _ZN13OnlineHandler12unloadPluginEv @ 5 NONAME
+ _ZN13OnlineHandler13writeSettingsEi @ 6 NONAME
+ _ZN13OnlineHandler14activatePluginERK7QString @ 7 NONAME
+ _ZN13OnlineHandler14activatePluginEv @ 8 NONAME
+ _ZN13OnlineHandler14pluginShutdownEb @ 9 NONAME
+ _ZN13OnlineHandler15defaultProviderEi @ 10 NONAME
+ _ZN13OnlineHandler15providerDetailsE7QString6HbIconi @ 11 NONAME
+ _ZN13OnlineHandler16initializePluginEv @ 12 NONAME
+ _ZN13OnlineHandler16loadSearchPluginERK7QString @ 13 NONAME
+ _ZN13OnlineHandler16pluginIntializedEb @ 14 NONAME
+ _ZN13OnlineHandler16staticMetaObjectE @ 15 NONAME DATA 16
+ _ZN13OnlineHandler18backEventTriggeredEv @ 16 NONAME
+ _ZN13OnlineHandler18isPluginIntializedEb @ 17 NONAME
+ _ZN13OnlineHandler18setDefaultProviderEi @ 18 NONAME
+ _ZN13OnlineHandler19getStaticMetaObjectEv @ 19 NONAME
+ _ZN13OnlineHandler19isShutdownCompletedEb @ 20 NONAME
+ _ZN13OnlineHandler19unloadPluginandExitEv @ 21 NONAME
+ _ZN13OnlineHandler9backEventEv @ 22 NONAME
+ _ZN13OnlineHandlerC1EP7QObject @ 23 NONAME
+ _ZN13OnlineHandlerC2EP7QObject @ 24 NONAME
+ _ZN13OnlineHandlerD0Ev @ 25 NONAME
+ _ZN13OnlineHandlerD1Ev @ 26 NONAME
+ _ZN13OnlineHandlerD2Ev @ 27 NONAME
+ _ZNK13OnlineHandler10metaObjectEv @ 28 NONAME
+ _ZTI13OnlineHandler @ 29 NONAME
+ _ZTV13OnlineHandler @ 30 NONAME
+
--- a/searchui/inc/Search_global.h Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/inc/Search_global.h Thu Jul 22 16:34:05 2010 +0100
@@ -26,6 +26,13 @@
#include <e32hal.h>
#endif
#endif
+//#define OST_TRACE_COMPILER_IN_USE //Uncomment to enable performance measurements.
+
+#ifdef OST_TRACE_COMPILER_IN_USE
+#define PERF_APP_LAUNCH_END(str) qDebug() << "Search_App_Launch :"<<str<<"at:"<<QTime::currentTime().second()<<":"<<QTime::currentTime().msec();
+#else
+#define PERF_APP_LAUNCH_END(str)
+#endif
#ifndef SEARCH_UNITTESTING
#define SEARCH_CLASS(aClassName)
--- a/searchui/indevicehandler/indevicehandler.pro Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/indevicehandler/indevicehandler.pro Thu Jul 22 16:34:05 2010 +0100
@@ -38,8 +38,17 @@
TARGET.EPOCALLOWDLLDATA=1
TARGET.CAPABILITY = ALL -TCB -DRM
INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
-
-
+ INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+
+ defBlock = \
+ "$${LITERAL_HASH}if defined(EABI)" \
+ "DEFFILE ../eabi/" \
+ "$${LITERAL_HASH}else" \
+ "DEFFILE ../bwins/" \
+ "$${LITERAL_HASH}endif"
+
+ MMP_RULES += defBlock
+
}
--- a/searchui/indevicehandler/tsrc/t_indevicehandler/src/t_indevicehandler.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/indevicehandler/tsrc/t_indevicehandler/src/t_indevicehandler.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#include "t_indevicehandler.h"
#include "indevicehandler.h"
#include <qsignalspy.h>
@@ -46,11 +30,11 @@
void SearchInDeviceHandlerTest::testhandleAsyncSearchResult()
{
InDeviceHandler* indevicehandler = new InDeviceHandler();
- indevicehandler->setCategory("file");
+ indevicehandler->setCategory("media");
QSignalSpy
spy(indevicehandler, SIGNAL(handleAsyncSearchResult(int, int)));
- indevicehandler->searchAsync("txt");
- QTest::qWait(200);
+ indevicehandler->searchAsync("jpg*");
+ QTest::qWait(2000);
QCOMPARE(spy.count(), 1);
delete indevicehandler;
@@ -58,15 +42,15 @@
void SearchInDeviceHandlerTest::testhandleDocument()
{
InDeviceHandler* indevicehandler = new InDeviceHandler();
- indevicehandler->setCategory("file");
+ indevicehandler->setCategory("media");
- indevicehandler->searchAsync("txt");
- QTest::qWait(200);
+ indevicehandler->searchAsync("jpg*");
+ QTest::qWait(2000);
QSignalSpy spy(indevicehandler,
SIGNAL(handleDocument(int, QCPixDocument*)));
indevicehandler->getDocumentAsyncAtIndex(0);
- QTest::qWait(200);
+ QTest::qWait(2000);
QCOMPARE(spy.count(), 1);
delete indevicehandler;
@@ -83,14 +67,14 @@
void SearchInDeviceHandlerTest::testgetDocumentAsyncAtIndex()
{
InDeviceHandler* indevicehandler = new InDeviceHandler();
- indevicehandler->setCategory("file");
+ indevicehandler->setCategory("media");
- indevicehandler->searchAsync("txt");
- QTest::qWait(200);
+ indevicehandler->searchAsync("jpg*");
+ QTest::qWait(2000);
QSignalSpy spy(indevicehandler,
SIGNAL(handleDocument(int, QCPixDocument*)));
indevicehandler->getDocumentAsyncAtIndex(0);
- QTest::qWait(200);
+ QTest::qWait(2000);
QCOMPARE(spy.count(), 1);
delete indevicehandler;
}
@@ -98,21 +82,21 @@
void SearchInDeviceHandlerTest::testsearchAsync()
{
InDeviceHandler* indevicehandler = new InDeviceHandler();
- indevicehandler->setCategory("file");
+ indevicehandler->setCategory("media");
QSignalSpy spy(indevicehandler, SIGNAL(handleAsyncSearchResult(int,int)));
indevicehandler->searchAsync(NULL);
- QTest::qWait(200);
+ QTest::qWait(2000);
QCOMPARE(spy.count(), 0);
- indevicehandler->searchAsync("txt");
- QTest::qWait(200);
+ indevicehandler->searchAsync("jpg*");
+ QTest::qWait(2000);
QCOMPARE(spy.count(), 1);
delete indevicehandler;
}
void SearchInDeviceHandlerTest::testcancelLastSearch()
{
InDeviceHandler* indevicehandler = new InDeviceHandler();
- indevicehandler->setCategory("file");
- indevicehandler->searchAsync("txt");
+ indevicehandler->setCategory("media");
+ indevicehandler->searchAsync("jpg*");
indevicehandler->cancelLastSearch();
delete indevicehandler;
}
@@ -120,9 +104,9 @@
{
InDeviceHandler* indevicehandler = new InDeviceHandler();
QCOMPARE(indevicehandler->getSearchResultCount(),0);
- indevicehandler->setCategory("file");
- indevicehandler->searchAsync("txt");
- QTest::qWait(200);
+ indevicehandler->setCategory("media");
+ indevicehandler->searchAsync("jpg*");
+ QTest::qWait(2000);
QVERIFY(indevicehandler->getSearchResultCount());
delete indevicehandler;
--- a/searchui/indevicehandler/tsrc/t_indevicehandler/t_indevicehandler.pro Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/indevicehandler/tsrc/t_indevicehandler/t_indevicehandler.pro Thu Jul 22 16:34:05 2010 +0100
@@ -37,8 +37,9 @@
TARGET.UID3 = 0x20026F8A
TARGET.CAPABILITY = ALL -TCB -DRM
TARGET.EPOCSTACKSIZE = 0x14000 // 80kB
-TARGET.EPOCHEAPSIZE = 0x20000 0x1000000 // 128kB - 16MB
+TARGET.EPOCHEAPSIZE = 0x20000 0x800000 // 128kB - 16MB
INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
+INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
}
include(t_indevicehandler.pri)
--- a/searchui/indevicehandler/tsrc/t_src.pro Fri Jun 11 16:24:16 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-#
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-# All rights reserved.
-# This component and the accompanying materials are made available
-# under the terms of "Eclipse Public License v1.0"
-# which accompanies this distribution, and is available
-# at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-# Initial Contributors:
-# Nokia Corporation - initial contribution.
-#
-# Contributors:
-#
-# Description:
-#
-
-TEMPLATE = subdirs
-
-SUBDIRS = t_indevicehandler
-
-CONFIG += ordered
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/indevicehandler/tsrc/tsrc.pro Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TEMPLATE = subdirs
+
+SUBDIRS = t_indevicehandler
+
+CONFIG += ordered
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/inc/onlinehandler.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Onlinehandler.
+ *
+ */
+
+#ifndef ONLINEHANDLER_H
+#define ONLINEHANDLER_H
+
+#include <QObject>
+#include <QVector>
+#include <QDir>
+#include <hbicon.h>
+#include "search_global.h"
+class HbMainWindow;
+class HbView;
+class OnlineSearchPlugin;
+class IsEngine;
+class ServiceProvider;
+class HbIcon;
+
+#ifdef SEARCHONLINEHANDLER_LIB
+#define ONLINEHANDLER_EXPORT Q_DECL_EXPORT
+#else
+#define ONLINEHANDLER_EXPORT Q_DECL_IMPORT
+#endif
+
+SEARCH_CLASS(SearchOnlineHandlerTest)
+/**
+ * @ingroup group_OnlineHandler
+ * @brief Loads and connects onlinesearchprovider plugins
+ *
+ * This service is responsible for loading onlinesearchprovider plugins.
+ *
+ * @since S60 ?S60_version.
+ */
+class ONLINEHANDLER_EXPORT OnlineHandler : public QObject
+ {
+Q_OBJECT
+
+public:
+ /**
+ * Default constructor.
+ *
+ * @since S60 ?S60_version.
+ */
+ OnlineHandler(QObject* = 0);
+
+ /**
+ * Destructor.
+ *
+ * @since S60 ?S60_version.
+ */
+ virtual ~OnlineHandler();
+ void setDefaultProvider(const int);
+
+ void isProvidersAvailable();
+ void initializePlugin();
+ bool activatePlugin();
+ bool activatePlugin(const QString &str);
+
+ void readSettings();
+ void writeSettings(const int);
+
+ void loadISPlugin(int id, QString query);
+
+ void unloadPlugin();
+ void unloadPluginandExit();
+public slots:
+ void isPluginIntialized(bool);
+ void isShutdownCompleted(bool);
+ void backEvent();
+
+signals:
+ void providerDetails(QString, HbIcon, int);
+ void defaultProvider(const int);
+ void pluginIntialized(bool);
+ void pluginShutdown(bool);
+ void backEventTriggered();
+private:
+ OnlineSearchPlugin *loadSearchPlugin(const QString &pluginFile);
+
+private:
+ QString mDefaultPluginName;
+ OnlineSearchPlugin *mOnlinePlugin;
+ IsEngine* mEng;
+ ServiceProvider* mCurrentProvider;
+ QList<ServiceProvider> mAvailableProviders;
+ bool mLoadSuggestion;
+ QString mLoadSuggestionLink;
+SEARCH_FRIEND_CLASS (SearchOnlineHandlerTest)
+ };
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/inc/searchbasepath.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,34 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0""
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#ifndef SEARCHBASEPATH_H
+#define SEARCHBASEPATH_H
+
+#ifdef Q_OS_SYMBIAN
+ #define SEARCH_PLUGIN_PATH QString("/resource/qt/plugins/onlinesearch")
+ #define SEARCH_PLUGIN_CONFIG_PATH QString("/resource/qt/plugins/onlinesearch/config")
+#else
+ #ifdef _DEBUG
+ #define SEARCH_PLUGIN_PATH QString("/onlinesearch/debug/bin")
+ #define SEARCH_PLUGIN_CONFIG_PATH QString("/onlinesearch/debug/bin/config")
+ #else
+ #define SEARCH_PLUGIN_PATH QString("/onlinesearch/release/bin")
+ #define SEARCH_PLUGIN_CONFIG_PATH QString("/onlinesearch/release/bin/config")
+ #endif
+#endif
+
+#endif /* SEARCHBASEPATH_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/inc/searchutility.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0""
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+#ifndef SEARCH_UTILITY_H
+#define SEARCH_UTILITY_H
+
+#include <QStringList>
+
+class SearchUtility
+ {
+public:
+ static QStringList drives();
+ static QStringList pluginDirs();
+ static QStringList SearchcfgDirs();
+
+private:
+ SearchUtility();
+ };
+
+#endif //SEARCH_UTILITY_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/onlinehandler.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: online handler list of files
+#
+
+HEADERS += ./inc/*.h
+SOURCES += ./src/*.cpp
+
+RESOURCES +=
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/onlinehandler.pro Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,56 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: SEARCH online handler project file
+#
+
+TEMPLATE = lib
+TARGET = searchonlinehandler
+
+CONFIG += hb
+CONFIG += console
+
+LIBS += -lhbcore
+LIBS += -lxqsettingsmanager
+LIBS += -lisproviderdbmanager
+LIBS += -lisengine
+
+QT -= webkit
+QT += xml
+
+DEFINES += SEARCHONLINEHANDLER_LIB
+
+DEPENDPATH += ./inc \
+ ./src
+
+INCLUDEPATH += ./inc \
+ ../inc
+
+symbian {
+ TARGET.UID2 = 0x20004C45
+ TARGET.UID3 = 0x2002C37C
+ TARGET.EPOCALLOWDLLDATA=1
+ TARGET.CAPABILITY = ALL -TCB -DRM
+ INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
+ INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+
+defBlock = \
+ "$${LITERAL_HASH}if defined(EABI)" \
+ "DEFFILE ../eabi/" \
+ "$${LITERAL_HASH}else" \
+ "DEFFILE ../bwins/" \
+ "$${LITERAL_HASH}endif"
+
+ MMP_RULES += defBlock
+}
+include(onlinehandler.pri)
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/src/onlinehandler.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,292 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Online Handler.
+ *
+ */
+#include "onlinehandler.h"
+#include "searchutility.h"
+#include "onlinesearchplugin.h" // after export should be included as systeminc
+#include "onlinesearchpluginfactory.h" // after export should be included as systeminc
+#include <QDebug>
+#include <QPluginLoader>
+#ifdef Q_OS_SYMBIAN
+#include <QLibraryInfo>
+#else
+#include <QCoreApplication>
+#endif
+#include <QDir>
+#include <hbmainwindow.h>
+#include <hbview.h>
+#include <hbinstance.h>
+#include <hbicon.h>
+#include <serviceprovider.h>
+#include <isengine.h>
+
+#ifdef WIN32
+#define PLUGINFILE_SUFFIX "dll"
+#else
+#define PLUGINFILE_SUFFIX "qtplugin"
+#endif
+
+// ---------------------------------------------------------------------------
+// OnlineHandler::OnlineHandler
+// ---------------------------------------------------------------------------
+//
+OnlineHandler::OnlineHandler(QObject* parent) :
+ QObject(parent), mOnlinePlugin(NULL), mEng(NULL), mCurrentProvider(NULL)
+ {
+ }
+// ---------------------------------------------------------------------------
+// OnlineHandler::~OnlineHandler
+// ---------------------------------------------------------------------------
+//
+OnlineHandler::~OnlineHandler()
+ {
+ if (mOnlinePlugin)
+ delete mOnlinePlugin;
+ if (mEng)
+ delete mEng;
+ if (mCurrentProvider)
+ delete mCurrentProvider;
+ }
+void OnlineHandler::setDefaultProvider(const int id)
+ {
+ if (mEng)
+ mEng->SetSelectedProvider(id);
+ }
+// ---------------------------------------------------------------------------
+// OnlineHandler::readSettings
+// ---------------------------------------------------------------------------
+//
+void OnlineHandler::readSettings()
+ {
+ if (!mEng)
+ mEng = new IsEngine();
+ mAvailableProviders.clear();
+ mEng->Providers(mAvailableProviders);
+ for (int i = 0; i < mAvailableProviders.count(); i++)
+ {
+ emit providerDetails(mAvailableProviders.at(i).Name(),
+ mAvailableProviders.at(i).Icon(),
+ mAvailableProviders.at(i).Id());
+ }
+ mCurrentProvider = mEng->SelectedProvider(); // default provider
+ if (mCurrentProvider)
+ {
+ mDefaultPluginName = mCurrentProvider->Name();
+ emit defaultProvider(mCurrentProvider->Id());
+ }
+ else
+ {
+ mDefaultPluginName = QString();
+ }
+ }
+// ---------------------------------------------------------------------------
+// OnlineHandler::writeSettings
+// ---------------------------------------------------------------------------
+//
+void OnlineHandler::writeSettings(const int providerId)
+ {
+ if (mEng && mEng->SetSelectedProvider(providerId) && mCurrentProvider)
+ {
+ mCurrentProvider = mEng->SelectedProvider(); // default provider
+ emit defaultProvider(mCurrentProvider->Id());
+ }
+ return;
+ }
+// ---------------------------------------------------------------------------
+// OnlineHandler::initializePlugin
+// ---------------------------------------------------------------------------
+//
+void OnlineHandler::initializePlugin()
+ {
+ /* Below assumes, only default plugins are handled now. If user selects different plugin some more logic needed here. */
+
+ if (mOnlinePlugin)
+ {
+ delete mOnlinePlugin;
+ mOnlinePlugin = NULL;
+ }
+ mOnlinePlugin = loadSearchPlugin(mDefaultPluginName);
+ if (mOnlinePlugin)
+ {
+ connect(mOnlinePlugin, SIGNAL(pluginInitialized(bool)), this,
+ SLOT(isPluginIntialized(bool)));
+
+ connect(mOnlinePlugin, SIGNAL(shutdownCompleted(bool)), this,
+ SLOT(isShutdownCompleted(bool)));
+
+ connect(mOnlinePlugin, SIGNAL(handleBackEvent()), this,
+ SLOT(backEvent()));
+
+ mOnlinePlugin->initializePlugin();
+ }
+ }
+void OnlineHandler::loadISPlugin(int id, QString query)
+ {
+ if (!mEng)
+ mEng = new IsEngine();
+ mLoadSuggestion = true;
+ mLoadSuggestionLink = query;
+ QList<ServiceProvider> iAvailableProviders;
+ mEng->Providers(iAvailableProviders);
+ for (int i = 0; i < iAvailableProviders.count(); i++)
+ {
+ if (iAvailableProviders.at(i).Id() == id)
+ {
+ mDefaultPluginName = iAvailableProviders.at(i).Name();
+ break;
+ }
+ }
+ initializePlugin();
+ }
+// ---------------------------------------------------------------------------
+// OnlineHandler::isPluginIntialized
+// ---------------------------------------------------------------------------
+//
+void OnlineHandler::isPluginIntialized(bool success)
+ {
+ if (mLoadSuggestion)
+ {
+ activatePlugin(mLoadSuggestionLink);
+ mLoadSuggestion = false;
+ }
+ else
+ {
+ emit pluginIntialized(success);
+ }
+ }
+// ---------------------------------------------------------------------------
+// OnlineHandler::isShutdownCompleted
+// ---------------------------------------------------------------------------
+//
+void OnlineHandler::isShutdownCompleted(bool success)
+ {
+ mOnlinePlugin->deleteLater();
+ emit pluginShutdown(success);
+ }
+// ---------------------------------------------------------------------------
+// OnlineHandler::backEvent
+// ---------------------------------------------------------------------------
+//
+void OnlineHandler::backEvent()
+ {
+ emit backEventTriggered();
+ }
+// ---------------------------------------------------------------------------
+// OnlineHandler::activatePlugin
+// ---------------------------------------------------------------------------
+//
+bool OnlineHandler::activatePlugin()
+ {
+ if (mOnlinePlugin)
+ mOnlinePlugin->activatePlugin();
+ return true;
+ }
+// ---------------------------------------------------------------------------
+// OnlineHandler::activatePlugin
+// ---------------------------------------------------------------------------
+//
+bool OnlineHandler::activatePlugin(const QString &str)
+ {
+ if (mOnlinePlugin)
+ mOnlinePlugin->activatePlugin(str);
+ return true;
+ }
+// ---------------------------------------------------------------------------
+// OnlineHandler::unloadPlugin
+// ---------------------------------------------------------------------------
+//
+void OnlineHandler::unloadPlugin()
+ {
+ if (mOnlinePlugin)
+ {
+ disconnect(mOnlinePlugin, SIGNAL(pluginInitialized(bool)), this,
+ SLOT(isPluginIntialized(bool)));
+
+ disconnect(mOnlinePlugin, SIGNAL(shutdownCompleted(bool)), this,
+ SLOT(isShutdownCompleted(bool)));
+
+ disconnect(mOnlinePlugin, SIGNAL(handleBackEvent()), this,
+ SLOT(backEvent()));
+
+ mOnlinePlugin->deactivatePlugin();
+ }
+ }
+// ---------------------------------------------------------------------------
+// OnlineHandler::unloadPluginandExit
+// ---------------------------------------------------------------------------
+//
+void OnlineHandler::unloadPluginandExit()
+ {
+ if (mOnlinePlugin)
+ {
+ disconnect(mOnlinePlugin, SIGNAL(pluginInitialized(bool)), this,
+ SLOT(isPluginIntialized(bool)));
+
+ disconnect(mOnlinePlugin, SIGNAL(shutdownCompleted(bool)), this,
+ SLOT(isShutdownCompleted(bool)));
+
+ disconnect(mOnlinePlugin, SIGNAL(handleBackEvent()), this,
+ SLOT(backEvent()));
+
+ mOnlinePlugin->deactivatePlugin();
+ mOnlinePlugin->shutdownPlugin();
+ }
+ }
+// ---------------------------------------------------------------------------
+// OnlineHandler::loadSearchPlugin
+// ---------------------------------------------------------------------------
+//
+OnlineSearchPlugin *OnlineHandler::loadSearchPlugin(const QString &pluginFile)
+ {
+ // CpLogger logger;
+ // logger << "loading plugin:" << pluginFile << "\r\n";
+
+ QFileInfo fileInfo(pluginFile);
+
+ if (!fileInfo.isAbsolute())
+ {
+ QString fileName = fileInfo.fileName();
+ if (fileInfo.suffix().compare(PLUGINFILE_SUFFIX, Qt::CaseInsensitive))
+ {
+ fileName = fileInfo.baseName() + '.' + PLUGINFILE_SUFFIX;
+ }
+
+ QStringList pluginDirs = SearchUtility::pluginDirs();
+ foreach(const QString &pluginDir,pluginDirs)
+ {
+ fileInfo.setFile(pluginDir + fileName);
+ if (fileInfo.exists() && QLibrary::isLibrary(
+ fileInfo.absoluteFilePath()))
+ {
+ break;
+ }
+ }
+ }
+
+ QPluginLoader loader(fileInfo.absoluteFilePath());
+ OnlineSearchPluginFactory *pluginFactory = qobject_cast<
+ OnlineSearchPluginFactory*> (loader.instance());
+ OnlineSearchPlugin *plugin = pluginFactory->createPlugin();
+ /*
+ * why unload?
+ if (!plugin) {
+ loader.unload();
+ }
+ */
+ // logger << (plugin ? "load plugin succeed." : "load plugin failed.") << "\r\n";
+ return plugin;
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/src/searchutility.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,140 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0""
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+#include "searchutility.h"
+#include <qstring>
+#include <qdir>
+#include <qfileinfo>
+#include "searchbasepath.h"
+
+#if 0
+
+#include "Searchpluginloader.h"
+#include <Searchpluginplatinterface.h>
+#include <Searchsettingformentryitemdata.h>
+#include "Searchcategorysettingformitemdata.h"
+#include "Searchpluginconfigreader.h"
+
+void SearchUtility::buildConfigPluginItems(HbDataFormModelItem *parent,
+ const QString &configFile,
+ SearchItemDataHelper &itemDataHelper)
+{
+ if (!parent) {
+ return;
+ }
+
+ QString configPath(configFile);
+ QFileInfo fi(configFile);
+ if (!fi.isAbsolute()) {
+ QStringList dirs = SearchUtility::SearchcfgDirs();
+ foreach(const QString &dir,dirs) {
+ configPath = dir + fi.fileName();
+ if (QFileInfo(configPath).exists()) {
+ break;
+ }
+ }
+ }
+
+ QList<SearchPluginConfig> SearchPluginConfigs = SearchPluginConfigReader(configPath).readSearchPluginConfigs();
+
+ foreach(const SearchPluginConfig &SearchPluginConfig, SearchPluginConfigs) {
+ SearchPluginPlatInterface *plugin = SearchPluginLoader().loadSearchPlugin(SearchPluginConfig.mPluginFile);
+
+ if (plugin) {
+ SearchSettingFormItemData *itemData = plugin->createSettingFormItemData(itemDataHelper);
+ if (itemData) {
+ //append the new created setting form item to its parent item.
+ parent->appendChild(itemData);
+
+ if (SearchCategorySettingFormItemData *categoryItemData
+ = qobject_cast<SearchCategorySettingFormItemData*>(itemData)) {
+ categoryItemData->initialize(itemDataHelper);
+ }
+
+ //set the description from config if it is empty.
+ if (SearchSettingFormEntryItemData *SearchEntryItemData
+ = qobject_cast<SearchSettingFormEntryItemData*>(itemData)) {
+ if (SearchEntryItemData->text().isEmpty()) {
+ SearchEntryItemData->setText(SearchPluginConfig.mDisplayName);
+ }
+ if (SearchEntryItemData->description().isEmpty()) {
+ SearchEntryItemData->setDescription(SearchPluginConfig.mDescription);
+ }
+ }
+
+ }
+ }
+
+ } //end foreach
+}
+
+#endif
+
+QStringList SearchUtility::drives()
+{
+ static QStringList drives;
+
+ if (drives.empty()) {
+#ifdef WIN32
+ drives.append("C:");
+#else
+ QFileInfoList fileInfoList = QDir::drives();
+ foreach(const QFileInfo &fileInfo,fileInfoList) {
+ QString str = fileInfo.filePath();
+ if (str.length() > 2) {
+ str = str.left(2);
+ }
+ drives.append(str);
+ }
+#endif
+ }
+
+ return drives;
+}
+
+static QStringList listDirs(const QString &baseDir)
+{
+ QStringList dirs;
+
+ QStringList drives = SearchUtility::drives();
+ foreach(const QString &drive,drives) {
+ QString dir = drive + baseDir + QDir::separator();
+ if (QFileInfo(dir).exists()) {
+ dirs.append(dir);
+ }
+ }
+
+ return dirs;
+}
+
+QStringList SearchUtility::pluginDirs()
+{
+ static QStringList dirs;
+ if (dirs.empty()) {
+ dirs = listDirs(SEARCH_PLUGIN_PATH);
+ }
+ return dirs;
+}
+
+QStringList SearchUtility::SearchcfgDirs()
+{
+ static QStringList dirs;
+ if (dirs.empty()) {
+ dirs = listDirs(SEARCH_PLUGIN_CONFIG_PATH);
+ }
+ return dirs;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_baiduplugin/resource/t_baiduplugin.manifest Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<plugin>
+ <runtime library="Baidu.dll"
+ uri="com.nokia.search/plugin/Baidu"/>
+</plugin>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_baiduplugin/src/t_baiduplugin.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: t_baidplugin
+ *
+ */
+
+#include "t_baiduplugin.h"
+
+#include <QDebug>
+#include <QGraphicsLayout>
+#include <QWidget>
+#include <QtWebKit/QGraphicsWebView>
+#include <QtGui/QApplication>
+#include <QGraphicsWidget>
+#include <hbdialog.h>
+#include <hbaction.h>
+#include <hblabel.h>
+#include <qdesktopservices.h>
+// ---------------------------------------------------------------------------
+// baiduplugin::baiduplugin()
+// ---------------------------------------------------------------------------
+//
+baiduplugin::baiduplugin()
+ {
+ // Set up plugin settings
+ }
+
+// ---------------------------------------------------------------------------
+// baiduplugin::~baiduplugin()
+// ---------------------------------------------------------------------------
+//
+baiduplugin::~baiduplugin()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// baiduplugin::initialize()
+// ---------------------------------------------------------------------------
+//
+void baiduplugin::initializePlugin()
+ {
+ emit pluginInitialized(true);
+ }
+
+// ---------------------------------------------------------------------------
+// baiduplugin::activate()
+// ---------------------------------------------------------------------------
+//
+void baiduplugin::activatePlugin()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// baiduplugin::activate(const QString &)
+// ---------------------------------------------------------------------------
+//
+void baiduplugin::activatePlugin(const QString &searchQuery)
+ {
+#ifdef __WINSCW__
+ HbDialog* popup = new HbDialog();
+ popup->setDismissPolicy(HbDialog::NoDismiss);
+ popup->setTimeout(HbDialog::NoTimeout);
+ QString str("Baidu Search ");
+ str.append(searchQuery);
+ HbLabel *label = new HbLabel(str);
+ popup->setHeadingWidget(label);
+ HbAction * action = new HbAction(hbTrId("Back"), popup);
+ connect(action, SIGNAL(triggered()), this, SLOT(BackEvent()));
+ popup->setPrimaryAction(action);
+ popup->show();
+#else
+ QString url("http://www.baidu.com/s?wd=");
+ url.append(searchQuery);
+ QDesktopServices::openUrl(url);
+#endif
+ }
+void baiduplugin::BackEvent()
+ {
+ emit handleBackEvent();
+ }
+// ---------------------------------------------------------------------------
+// baiduplugin::deactivate()
+// ---------------------------------------------------------------------------
+//
+void baiduplugin::deactivatePlugin()
+ {
+ // Destroy everything but the initial view and data that takes a long time
+ // to reacquire when the plugin is deactivated
+ }
+
+// ---------------------------------------------------------------------------
+// baiduplugin::shutdown()
+// ---------------------------------------------------------------------------
+//
+void baiduplugin::shutdownPlugin()
+ {
+ // Destroy all views
+ emit shutdownCompleted(true);
+
+ //return true;
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_baiduplugin/src/t_baidupluginfactory.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Implementation of the search google online factory.
+ *
+ */
+
+#include <QtGui> // For Q_EXPORT_PLUGIN2
+
+#include "t_baidupluginfactory.h"
+#include "t_baiduplugin.h"
+
+
+OnlineSearchPlugin* baidupluginFactory::createPlugin() const
+{
+ return new baiduplugin();
+}
+
+Q_EXPORT_PLUGIN2(Baidu,baidupluginFactory)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_baiduplugin/t_baiduplugin.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+# Template version: 4.2
+HEADERS += ./inc/*.h
+
+
+SOURCES += ./src/*.cpp
+
+// HEADERS += onlinesearchplugin.h how to solve meta object problem?
+
+RESOURCES +=
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_baiduplugin/t_baiduplugin.pro Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,63 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: search test online project file
+#
+
+TEMPLATE = lib
+CONFIG += plugin hb
+TARGET = Baidu
+
+plugin.sources = Baidu.dll
+plugin.path = \resource\qt\plugins\onlinesearch
+
+DEPLOYMENT += plugin
+
+CONFIG(debug, debug|release) {
+ DESTDIR = debug
+} else {
+ DESTDIR = release
+}
+
+win32 {
+
+ LIBS += -L$$PWD/../../../../bin/debug
+}
+
+
+
+CONFIG += plugin debug_and_release
+
+QT += xml sql webkit network
+
+
+
+coverage:DEFINES += COVERAGE_MEASUREMENT
+
+DEPENDPATH += ./inc \
+ ./src
+
+INCLUDEPATH += ./inc/ \
+
+symbian: {
+ TARGET.UID3 = 0x2002A532
+ TARGET.EPOCALLOWDLLDATA=1
+ TARGET.CAPABILITY = ALL -TCB -DRM
+ INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+CONFIG += symbian_test
+}
+
+include(t_baiduplugin.pri)
+symbian:include(t_baiduplugin_installs_symbian.pri)
+win32:include(t_baiduplugin_installs_win32.pri)
+symbian:unix:include(t_baiduplugin_installs_unix.pri)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_baiduplugin/t_baiduplugin_installs_symbian.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+
+export.sources = resource/*.manifest
+export.path = /searchresources/plugins/onlineproviders
+
+pluginstub.sources = Baidu.dll
+pluginstub.path = /resource/qt/plugins/search
+
+DEPLOYMENT += export pluginstub
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_baiduplugin/t_baiduplugin_installs_unix.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,40 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+
+
+
+
+
+#
+# Release
+#
+
+r01.path = ../../../bin/release/resource/qt/plugins/search
+r01.files = ./release/*.so* \
+ ./resource/*.manifest
+
+INSTALLS += r01
+
+#
+# Debug
+#
+
+d01.path = ../../../bin/debug/resource/qt/plugins/search
+d01.files = ./debug/*.so* \
+ ./resource/*.manifest
+
+INSTALLS += d01
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_baiduplugin/t_baiduplugin_installs_win32.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,37 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+# Release
+#
+r01.path = $$PWD/../../../../bin/release/resource/qt/plugins/search
+r01.files = ./release/*.dll
+
+r02.path = $$PWD/../../../../bin/release/searchresources/plugins/onlineproviders
+r02.files = ./resource/*.manifest
+
+INSTALLS += r01 r02
+
+#
+# Debug
+#
+
+d01.path = $$PWD/../../../../bin/debug/resource/qt/plugins/search
+d01.files = ./debug/*.dll
+
+d02.path = $$PWD/../../../../bin/debug/searchresources/plugins/onlineproviders
+d02.files = ./resource/*.manifest
+
+INSTALLS += d01 d02
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_bingplugin/inc/onlinesearchplugin.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: OnlineSearchPlugin class definition
+ *
+ */
+
+#ifndef ONLINESEARCHPLUGIN_H
+#define ONLINESEARCHPLUGIN_H
+
+#include <QObject>
+
+/**
+ * @ingroup group_onlinesearchpluginmodel
+ * @brief Represents a plugin plugin in the framework.
+ *
+ * OnlineSearchPlugin is an interface through which setting plugin plugin can be
+ * executed in the search handlers.
+ *
+ * @lib ?library
+ * @since S60 ?S60_version
+ */
+
+class OnlineSearchPlugin : public QObject
+ {
+Q_OBJECT
+public:
+
+ /**
+ * Destructor.
+ * @since S60 ?S60_version.
+ */
+ virtual ~OnlineSearchPlugin()
+ {
+ }
+
+ /**
+ * Called by the search handlers during initialize cycle of the plugin, it is during
+ * this phase the plugin widget
+ * usually creates its initial view.
+ * Once the initialization is done, pluginInitialized signal must be
+ * emitted.
+ * @since S60 ?S60_version.
+ */
+ virtual void initializePlugin() = 0;
+
+ /**
+ * Called by the search handlers when the plugin becomes the current plugin.
+ * @since S60 ?S60_version.
+ */
+ virtual void activatePlugin() = 0;
+ /**
+ * Called by the search handlers when the plugin becomes the current plugin.
+ * @since S60 ?S60_version.
+ */
+ virtual void activatePlugin(const QString &searchQuery) = 0;
+
+ /**
+ * Called by the search handlers when the plugin is no longer being displayed.
+ */
+ virtual void deactivatePlugin() = 0;
+
+ /**
+ * Called by the search handlers before the plugin destructor is called.
+ * @param reason The reason why the search handlers is being killed.
+ */
+ virtual void shutdownPlugin() = 0;
+
+protected:
+
+ /**
+ * Constructor.
+ * @since S60 ?S60_version.
+ */
+ OnlineSearchPlugin()
+ {
+ }
+
+signals:
+
+ /**
+ * Emit this signal when changing the view inside the plugin.
+ * @param caller The calling plugin plugin instance.
+ * @param viewWidget The new plugin view widget to be shown.
+ */
+ void viewChanged();
+
+ /**
+ * Emit this signal to indicate initialization is done.
+ * @param caller The calling plugin plugin instance.
+ * @param success True if succeeded, false otherwise.
+ */
+ void pluginInitialized(bool success);
+
+ /**
+ * Emit this signal to indicate that the plugin plugin can be deleted.
+ * Note that this signal does not need to be emitted if true is returned
+ * from shutdownPlugin.
+ * @param caller The calling plugin plugin instance.
+ */
+ void shutdownCompleted(bool success);
+
+ /**
+ * Called by search handlers when back button is clicked in the plugin view.
+ * In this method the plugin plugin can implement internally showing and
+ * hiding GUI elements if the plugin has multiple 'views'.
+ */
+ void handleBackEvent();
+ };
+
+#endif // ONLINESEARCHPLUGIN_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_bingplugin/inc/t_bingplugin.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Declaration of the search google plugin.
+ *
+ */
+
+#ifndef T_BINGLUGIN_H
+#define T_BINGLUGIN_H
+
+#include <onlinesearchplugin.h>
+
+#include <QPointer>
+#include <QDate>
+
+class bingplugin : public OnlineSearchPlugin
+ {
+Q_OBJECT
+
+public:
+
+ // Default Constructor
+ bingplugin();
+ // Destructor
+ ~bingplugin();
+
+protected:
+
+ // Overrides from OnlineSearchPlugin
+ void initializePlugin();
+ void activatePlugin();
+ void activatePlugin(const QString &searchQuery);
+ void deactivatePlugin();
+ void shutdownPlugin();
+
+private slots:
+ void BackEvent();
+private:
+ };
+
+#endif // T_BINGLUGIN_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_bingplugin/inc/t_bingpluginfactory.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Declaration of the search google online factory.
+ *
+ */
+
+#ifndef BINGPLUGINFACTORY_H
+#define BINGPLUGINFACTORY_H
+
+#include <QObject>
+
+#include <OnlineSearchPluginfactory.h>
+
+class OnlineSearchPlugin;
+
+
+class bingpluginFactory : public QObject, public OnlineSearchPluginFactory
+{
+ Q_OBJECT
+ Q_INTERFACES(OnlineSearchPluginFactory)
+
+public:
+
+ // Wizard factory
+ OnlineSearchPlugin* createPlugin() const;
+};
+
+#endif // BINGPLUGINFACTORY_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_bingplugin/resource/t_bingplugin.manifest Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<plugin>
+ <runtime library="Bing.dll"
+ uri="com.nokia.search/plugin/Bing"/>
+</plugin>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_bingplugin/src/t_bingplugin.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: bingplugin.
+ *
+ */
+
+#include "t_bingplugin.h"
+
+#include <QDebug>
+#include <QGraphicsLayout>
+#include <QWidget>
+#include <QtWebKit/QGraphicsWebView>
+#include <QtGui/QApplication>
+#include <QGraphicsWidget>
+#include <hbdialog.h>
+#include <hbaction.h>
+#include <hblabel.h>
+#include <qdesktopservices.h>
+// ---------------------------------------------------------------------------
+// bingplugin::bingplugin()
+// ---------------------------------------------------------------------------
+//
+bingplugin::bingplugin()
+ {
+ // Set up plugin settings
+ }
+
+// ---------------------------------------------------------------------------
+// bingplugin::~bingplugin()
+// ---------------------------------------------------------------------------
+//
+bingplugin::~bingplugin()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// bingplugin::initialize()
+// ---------------------------------------------------------------------------
+//
+void bingplugin::initializePlugin()
+ {
+ emit pluginInitialized(true);
+ }
+
+// ---------------------------------------------------------------------------
+// bingplugin::activate()
+// ---------------------------------------------------------------------------
+//
+void bingplugin::activatePlugin()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// bingplugin::activate(const QString &)
+// ---------------------------------------------------------------------------
+//
+void bingplugin::activatePlugin(const QString &searchQuery)
+ {
+#ifdef __WINSCW__
+ HbDialog* popup = new HbDialog();
+ popup->setDismissPolicy(HbDialog::NoDismiss);
+ popup->setTimeout(HbDialog::NoTimeout);
+ QString str;
+ str.append("bing Search ");
+ str.append(searchQuery);
+ HbLabel *label = new HbLabel(str);
+ popup->setHeadingWidget(label);
+ HbAction * action = new HbAction(hbTrId("Back"), popup);
+ connect(action, SIGNAL(triggered()), this, SLOT(BackEvent()));
+ popup->setPrimaryAction(action);
+ popup->show();
+#else
+ QString url("http://www.bing.com/search?q=");
+ url.append(searchQuery);
+ url.append("&form=QBLH&qs=n&sk=");
+ QDesktopServices::openUrl(url);
+#endif
+ }
+void bingplugin::BackEvent()
+ {
+ emit handleBackEvent();
+ }
+// ---------------------------------------------------------------------------
+// bingplugin::deactivate()
+// ---------------------------------------------------------------------------
+//
+void bingplugin::deactivatePlugin()
+ {
+ // Destroy everything but the initial view and data that takes a long time
+ // to reacquire when the plugin is deactivated
+ }
+
+// ---------------------------------------------------------------------------
+// bingplugin::shutdown()
+// ---------------------------------------------------------------------------
+//
+void bingplugin::shutdownPlugin()
+ {
+ // Destroy all views
+ emit shutdownCompleted(true);
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_bingplugin/src/t_bingpluginfactory.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:Implementation of the search google online factory.
+ *
+ */
+
+#include <QtGui> // For Q_EXPORT_PLUGIN2
+
+#include "t_bingpluginfactory.h"
+#include "t_bingplugin.h"
+
+
+OnlineSearchPlugin* bingpluginFactory::createPlugin() const
+{
+ return new bingplugin();
+}
+
+Q_EXPORT_PLUGIN2(Bing,bingpluginFactory)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_bingplugin/t_bingplugin.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: search how-to verification online
+#
+
+HEADERS += ./inc/*.h
+
+
+SOURCES += ./src/*.cpp
+
+// HEADERS += onlinesearchplugin.h how to solve meta object problem?
+
+RESOURCES +=
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_bingplugin/t_bingplugin.pro Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,63 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: search test online project file
+#
+
+TEMPLATE = lib
+CONFIG += plugin hb
+TARGET = Bing
+
+plugin.sources = Bing.dll
+plugin.path = \resource\qt\plugins\onlinesearch
+
+DEPLOYMENT += plugin
+
+CONFIG(debug, debug|release) {
+ DESTDIR = debug
+} else {
+ DESTDIR = release
+}
+
+win32 {
+
+ LIBS += -L$$PWD/../../../../bin/debug
+}
+
+
+
+CONFIG += plugin debug_and_release
+
+QT += xml sql webkit network
+
+
+
+coverage:DEFINES += COVERAGE_MEASUREMENT
+
+DEPENDPATH += ./inc \
+ ./src
+
+INCLUDEPATH += ./inc/ \
+
+symbian: {
+ TARGET.UID3 = 0x2002A532
+ TARGET.EPOCALLOWDLLDATA=1
+ TARGET.CAPABILITY = ALL -TCB -DRM
+ INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+CONFIG += symbian_test
+}
+
+include(t_bingplugin.pri)
+symbian:include(t_bingplugin_installs_symbian.pri)
+win32:include(t_bingplugin_installs_win32.pri)
+symbian:unix:include(t_bingplugin_installs_unix.pri)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_bingplugin/t_bingplugin_installs_symbian.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,23 @@
+
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+export.sources = resource/*.manifest
+export.path = /searchresources/plugins/onlineproviders
+
+pluginstub.sources = Bing.dll
+pluginstub.path = /resource/qt/plugins/search
+
+DEPLOYMENT += export pluginstub
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_bingplugin/t_bingplugin_installs_unix.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,35 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+#
+# Release
+#
+
+r01.path = ../../../bin/release/resource/qt/plugins/search
+r01.files = ./release/*.so* \
+ ./resource/*.manifest
+
+INSTALLS += r01
+
+#
+# Debug
+#
+
+d01.path = ../../../bin/debug/resource/qt/plugins/search
+d01.files = ./debug/*.so* \
+ ./resource/*.manifest
+
+INSTALLS += d01
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_bingplugin/t_bingplugin_installs_win32.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,37 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+# Release
+#
+r01.path = $$PWD/../../../../bin/release/resource/qt/plugins/search
+r01.files = ./release/*.dll
+
+r02.path = $$PWD/../../../../bin/release/searchresources/plugins/onlineproviders
+r02.files = ./resource/*.manifest
+
+INSTALLS += r01 r02
+
+#
+# Debug
+#
+
+d01.path = $$PWD/../../../../bin/debug/resource/qt/plugins/search
+d01.files = ./debug/*.dll
+
+d02.path = $$PWD/../../../../bin/debug/searchresources/plugins/onlineproviders
+d02.files = ./resource/*.manifest
+
+INSTALLS += d01 d02
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_googleplugin/inc/onlinesearchplugin.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: OnlineSearchPlugin class definition
+ *
+ */
+
+#ifndef ONLINESEARCHPLUGIN_H
+#define ONLINESEARCHPLUGIN_H
+
+#include <QObject>
+
+/**
+ * @ingroup group_onlinesearchpluginmodel
+ * @brief Represents a plugin plugin in the framework.
+ *
+ * OnlineSearchPlugin is an interface through which setting plugin plugin can be
+ * executed in the search handlers.
+ *
+ * @lib ?library
+ * @since S60 ?S60_version
+ */
+
+class OnlineSearchPlugin : public QObject
+ {
+Q_OBJECT
+public:
+
+ /**
+ * Destructor.
+ * @since S60 ?S60_version.
+ */
+ virtual ~OnlineSearchPlugin()
+ {
+ }
+
+ /**
+ * Called by the search handlers during initialize cycle of the plugin, it is during
+ * this phase the plugin widget
+ * usually creates its initial view.
+ * Once the initialization is done, pluginInitialized signal must be
+ * emitted.
+ * @since S60 ?S60_version.
+ */
+ virtual void initializePlugin() = 0;
+
+ /**
+ * Called by the search handlers when the plugin becomes the current plugin.
+ * @since S60 ?S60_version.
+ */
+ virtual void activatePlugin() = 0;
+ /**
+ * Called by the search handlers when the plugin becomes the current plugin.
+ * @since S60 ?S60_version.
+ */
+ virtual void activatePlugin(const QString &searchQuery) = 0;
+
+ /**
+ * Called by the search handlers when the plugin is no longer being displayed.
+ */
+ virtual void deactivatePlugin() = 0;
+
+ /**
+ * Called by the search handlers before the plugin destructor is called.
+ * @param reason The reason why the search handlers is being killed.
+ */
+ virtual void shutdownPlugin() = 0;
+
+protected:
+
+ /**
+ * Constructor.
+ * @since S60 ?S60_version.
+ */
+ OnlineSearchPlugin()
+ {
+ }
+
+signals:
+
+ /**
+ * Emit this signal when changing the view inside the plugin.
+ * @param caller The calling plugin plugin instance.
+ * @param viewWidget The new plugin view widget to be shown.
+ */
+ void viewChanged();
+
+ /**
+ * Emit this signal to indicate initialization is done.
+ * @param caller The calling plugin plugin instance.
+ * @param success True if succeeded, false otherwise.
+ */
+ void pluginInitialized(bool success);
+
+ /**
+ * Emit this signal to indicate that the plugin plugin can be deleted.
+ * Note that this signal does not need to be emitted if true is returned
+ * from shutdownPlugin.
+ * @param caller The calling plugin plugin instance.
+ */
+ void shutdownCompleted(bool success);
+
+ /**
+ * Called by search handlers when back button is clicked in the plugin view.
+ * In this method the plugin plugin can implement internally showing and
+ * hiding GUI elements if the plugin has multiple 'views'.
+ */
+ void handleBackEvent();
+ };
+
+#endif // ONLINESEARCHPLUGIN_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_googleplugin/inc/t_googleplugin.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Declaration of the search google plugin
+ *
+ */
+
+#ifndef T_GOOGLEPLUGIN_H
+#define T_GOOGLEPLUGIN_H
+
+#include <onlinesearchplugin.h>
+
+#include <QPointer>
+#include <QDate>
+
+
+class googleplugin : public OnlineSearchPlugin
+{
+ Q_OBJECT
+
+public:
+
+ // Default Constructor
+ googleplugin();
+ // Destructor
+ ~googleplugin();
+
+protected:
+
+ // Overrides from OnlineSearchPlugin
+ void initializePlugin();
+ void activatePlugin();
+ void activatePlugin(const QString &searchQuery);
+ void deactivatePlugin();
+ void shutdownPlugin();
+private slots:
+ void BackEvent();
+
+
+private:
+};
+
+#endif // T_GOOGLEPLUGIN_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_googleplugin/inc/t_googlepluginfactory.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Declaration of the search google online factory.
+ *
+ */
+
+#ifndef GOOGLEPLUGINFACTORY_H
+#define GOOGLEPLUGINFACTORY_H
+
+#include <QObject>
+
+#include <OnlineSearchPluginfactory.h>
+
+class OnlineSearchPlugin;
+
+
+class googlepluginFactory : public QObject, public OnlineSearchPluginFactory
+{
+ Q_OBJECT
+ Q_INTERFACES(OnlineSearchPluginFactory)
+
+public:
+
+ // Wizard factory
+ OnlineSearchPlugin* createPlugin() const;
+};
+
+#endif // GOOGLEPLUGINFACTORY_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_googleplugin/resource/t_googleplugin.manifest Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<plugin>
+ <runtime library="google.dll"
+ uri="com.nokia.search/plugin/google"/>
+</plugin>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_googleplugin/src/t_googleplugin.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: googleplugin.
+ *
+ */
+
+#include "t_googleplugin.h"
+
+#include <QDebug>
+#include <QGraphicsLayout>
+#include <QWidget>
+#include <QtWebKit/QGraphicsWebView>
+#include <QtGui/QApplication>
+#include <QGraphicsWidget>
+#include <hbdialog.h>
+#include <hbaction.h>
+#include <hblabel.h>
+#include <qdesktopservices.h>
+// ---------------------------------------------------------------------------
+// googleplugin::googleplugin()
+// ---------------------------------------------------------------------------
+//
+googleplugin::googleplugin()
+ {
+ qDebug() << "googleplugin";
+ // Set up plugin settings
+ }
+
+// ---------------------------------------------------------------------------
+// googleplugin::~googleplugin()
+// ---------------------------------------------------------------------------
+//
+googleplugin::~googleplugin()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// googleplugin::initialize()
+// ---------------------------------------------------------------------------
+//
+void googleplugin::initializePlugin()
+ {
+ emit pluginInitialized(true);
+ }
+
+// ---------------------------------------------------------------------------
+// googleplugin::activate()
+// ---------------------------------------------------------------------------
+//
+void googleplugin::activatePlugin()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// googleplugin::activate(const QString &)
+// ---------------------------------------------------------------------------
+//
+void googleplugin::activatePlugin(const QString &searchQuery)
+ {
+ qDebug() << "search:activatePlugin" ;
+#ifdef __WINSCW__
+ qDebug() << "search:activatePlugin winscw" ;
+ HbDialog* popup = new HbDialog();
+ popup->setDismissPolicy(HbDialog::NoDismiss);
+ popup->setTimeout(HbDialog::NoTimeout);
+ QString str;
+ str.append(QString("google Search "));
+ str.append(searchQuery);
+ HbLabel *label = new HbLabel(str);
+ popup->setHeadingWidget(label);
+ HbAction * action = new HbAction(hbTrId("Back"), popup);
+ connect(action, SIGNAL(triggered()), this, SLOT(BackEvent()));
+ popup->setPrimaryAction(action);
+ popup->show();
+#else
+ qDebug() << "search:activatePlugin armvs" ;
+ QString url("http://www.google.co.in/search?hl=en&source=hp&q=");
+ url.append(searchQuery);
+ url.append("&meta=&aq=f&aqi=g10&aql=&oq=&gs_rfai=");
+ QDesktopServices::openUrl(url);
+#endif
+
+ }
+void googleplugin::BackEvent()
+ {
+ emit handleBackEvent();
+ }
+// ---------------------------------------------------------------------------
+// googleplugin::deactivate()
+// ---------------------------------------------------------------------------
+//
+void googleplugin::deactivatePlugin()
+ {
+ // Destroy everything but the initial view and data that takes a long time
+ // to reacquire when the plugin is deactivated
+ }
+
+// ---------------------------------------------------------------------------
+// googleplugin::shutdown()
+// ---------------------------------------------------------------------------
+//
+void googleplugin::shutdownPlugin()
+ {
+ // Destroy all views
+ emit shutdownCompleted(true);
+ //return true;
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_googleplugin/src/t_googlepluginfactory.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Implementation of the search google online factory.
+ *
+ */
+
+#include <QtGui> // For Q_EXPORT_PLUGIN2
+
+#include "t_googlepluginfactory.h"
+#include "t_googleplugin.h"
+
+
+OnlineSearchPlugin* googlepluginFactory::createPlugin() const
+{
+ qDebug() << "googlepluginFactory";
+ return new googleplugin();
+}
+
+Q_EXPORT_PLUGIN2(Google,googlepluginFactory)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_googleplugin/t_googleplugin.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: search how-to verification online
+#
+
+
+HEADERS += ./inc/*.h
+
+
+SOURCES += ./src/*.cpp
+
+// HEADERS += onlinesearchplugin.h how to solve meta object problem?
+
+RESOURCES +=
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_googleplugin/t_googleplugin.pro Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: search test online project file
+#
+
+
+TEMPLATE = lib
+CONFIG += plugin hb
+TARGET = Google
+
+plugin.sources = Google.dll
+plugin.path = \resource\qt\plugins\onlinesearch
+
+DEPLOYMENT += plugin
+
+CONFIG(debug, debug|release) {
+ DESTDIR = debug
+} else {
+ DESTDIR = release
+}
+
+win32 {
+
+ LIBS += -L$$PWD/../../../../bin/debug
+}
+
+
+
+CONFIG += plugin debug_and_release
+
+QT += xml sql webkit network
+
+
+
+coverage:DEFINES += COVERAGE_MEASUREMENT
+
+DEPENDPATH += ./inc \
+ ./src
+
+INCLUDEPATH += ./inc/ \
+
+symbian: {
+ TARGET.UID3 = 0x2002A532
+ TARGET.EPOCALLOWDLLDATA=1
+ TARGET.CAPABILITY = ALL -TCB -DRM
+ INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+CONFIG += symbian_test
+}
+
+include(t_googleplugin.pri)
+symbian:include(t_googleplugin_installs_symbian.pri)
+win32:include(t_googleplugin_installs_win32.pri)
+symbian:unix:include(t_googleplugin_installs_unix.pri)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_googleplugin/t_googleplugin_installs_symbian.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+export.sources = resource/*.manifest
+export.path = /searchresources/plugins/onlineproviders
+
+pluginstub.sources = Google.dll
+pluginstub.path = /resource/qt/plugins/search
+
+DEPLOYMENT += export pluginstub
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_googleplugin/t_googleplugin_installs_unix.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,35 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+#
+# Release
+#
+
+r01.path = ../../../bin/release/resource/qt/plugins/search
+r01.files = ./release/*.so* \
+ ./resource/*.manifest
+
+INSTALLS += r01
+
+#
+# Debug
+#
+
+d01.path = ../../../bin/debug/resource/qt/plugins/search
+d01.files = ./debug/*.so* \
+ ./resource/*.manifest
+
+INSTALLS += d01
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_googleplugin/t_googleplugin_installs_win32.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#
+# Release
+#
+
+#
+# Release
+#
+r01.path = $$PWD/../../../../bin/release/resource/qt/plugins/search
+r01.files = ./release/*.dll
+
+r02.path = $$PWD/../../../../bin/release/searchresources/plugins/onlineproviders
+r02.files = ./resource/*.manifest
+
+INSTALLS += r01 r02
+
+#
+# Debug
+#
+
+d01.path = $$PWD/../../../../bin/debug/resource/qt/plugins/search
+d01.files = ./debug/*.dll
+
+d02.path = $$PWD/../../../../bin/debug/searchresources/plugins/onlineproviders
+d02.files = ./resource/*.manifest
+
+INSTALLS += d01 d02
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_onlinehandler/inc/t_onlinehandler.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Tests for Onlinehandler class.
+ *
+ */
+
+#include <QtTest/QtTest>
+#include "onlinehandler.h"
+
+/**
+ * @test Test class for Onlinehandler modules.
+ */
+class SearchOnlineHandlerTest : public QObject
+ {
+Q_OBJECT
+
+public:
+ SearchOnlineHandlerTest();
+ ~SearchOnlineHandlerTest();
+
+private slots:
+ void init();
+ void initTestCase();
+ void cleanupTestCase();
+ void testsetDefaultProvider();
+ void testinitializePlugin();
+ void testactivatePlugin();
+ void testactivatePlugin1();
+ void testwriteSettings();
+ void testloadISPlugin();
+ void testunloadPlugin();
+ void testunloadPluginandExit();
+ void testbackEvent();
+
+ //IsEngine
+ /*
+ void testSelectedProvider();
+ void testSetSelectedProvider();
+ void testProviders();*///covered in above funtions
+ void testPerformWebSearch();
+ void testPerformInDeviceSearch();
+
+ //IsProviderdbManager & serviceprovider
+ /*
+ void testGetProviders();
+ void testGetCountryList();
+ void testSelectedProvider();
+ void testSetSelectedProvider();//covered in above funtions
+ */
+ };
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_onlinehandler/src/t_onlinehandler.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: test searchonlinehandler.
+ *
+ */
+#include "t_onlinehandler.h"
+#include "onlinehandler.h"
+#include <qsignalspy.h>
+#include "serviceprovider.h"
+#include "isengine.h"
+#include "isproviderdbmanager.h"
+
+SearchOnlineHandlerTest::SearchOnlineHandlerTest()
+ {
+ }
+SearchOnlineHandlerTest::~SearchOnlineHandlerTest()
+ {
+ }
+void SearchOnlineHandlerTest::init()
+ {
+ }
+void SearchOnlineHandlerTest::initTestCase()
+ {
+ }
+void SearchOnlineHandlerTest::cleanupTestCase()
+ {
+ }
+void SearchOnlineHandlerTest::testsetDefaultProvider()
+ {
+ OnlineHandler* onlinetestobj = new OnlineHandler();
+ onlinetestobj->readSettings();
+ if (onlinetestobj->mAvailableProviders.count())
+ {
+ onlinetestobj->mAvailableProviders.at(0);
+ int i = onlinetestobj->mAvailableProviders.at(0).Id();
+ onlinetestobj->setDefaultProvider(i);
+ onlinetestobj->mEng->SelectedProvider();
+ QCOMPARE(i,onlinetestobj->mEng->SelectedProvider()->Id());
+ }
+ delete onlinetestobj;
+ }
+void SearchOnlineHandlerTest::testinitializePlugin()
+ {
+ OnlineHandler* onlinetestobj = new OnlineHandler();
+ onlinetestobj->readSettings();
+ QSignalSpy spy(onlinetestobj, SIGNAL(pluginIntialized(bool)));
+ onlinetestobj->initializePlugin();
+ QCOMPARE(spy.count(), 1);
+ delete onlinetestobj;
+ }
+void SearchOnlineHandlerTest::testactivatePlugin()
+ {
+ OnlineHandler* onlinetestobj = new OnlineHandler();
+ onlinetestobj->readSettings();
+ onlinetestobj->initializePlugin();
+ onlinetestobj->activatePlugin();
+ /* delete onlinetestobj->mOnlinePlugin;
+ onlinetestobj->mOnlinePlugin = NULL;
+ onlinetestobj->activatePlugin();*/
+ delete onlinetestobj;
+ }
+void SearchOnlineHandlerTest::testactivatePlugin1()
+ {
+ OnlineHandler* onlinetestobj = new OnlineHandler();
+ onlinetestobj->readSettings();
+ onlinetestobj->initializePlugin();
+ onlinetestobj->activatePlugin("ab");
+ /*delete onlinetestobj->mOnlinePlugin;
+ onlinetestobj->mOnlinePlugin = NULL;
+ onlinetestobj->activatePlugin("ab");
+*/ delete onlinetestobj;
+ }
+void SearchOnlineHandlerTest::testwriteSettings()
+ {
+ OnlineHandler* onlinetestobj = new OnlineHandler();
+ onlinetestobj->readSettings();
+ if (onlinetestobj->mAvailableProviders.count())
+ {
+ onlinetestobj->writeSettings(
+ onlinetestobj->mAvailableProviders.at(0).Id());
+ }
+ delete onlinetestobj;
+ }
+void SearchOnlineHandlerTest::testloadISPlugin()
+ {
+ OnlineHandler* onlinetestobj = new OnlineHandler();
+ onlinetestobj->readSettings();
+ if (onlinetestobj->mAvailableProviders.count())
+ {
+ QSignalSpy spy(onlinetestobj, SIGNAL(pluginIntialized(bool)));
+ onlinetestobj->loadISPlugin(
+ onlinetestobj->mAvailableProviders.at(0).Id(), "ab");
+ QCOMPARE(spy.count(), 0);
+ }
+ delete onlinetestobj;
+ }
+void SearchOnlineHandlerTest::testunloadPlugin()
+ {
+ OnlineHandler* onlinetestobj = new OnlineHandler();
+ onlinetestobj->readSettings();
+ onlinetestobj->initializePlugin();
+ onlinetestobj->unloadPlugin();
+ delete onlinetestobj;
+ }
+void SearchOnlineHandlerTest::testunloadPluginandExit()
+ {
+ OnlineHandler* onlinetestobj = new OnlineHandler();
+ onlinetestobj->readSettings();
+ onlinetestobj->initializePlugin();
+ QSignalSpy spy(onlinetestobj, SIGNAL(pluginShutdown(bool)));
+ onlinetestobj->unloadPluginandExit();
+ QCOMPARE(spy.count(), 1);
+ delete onlinetestobj;
+ }
+
+void SearchOnlineHandlerTest::testbackEvent()
+ {
+ OnlineHandler* onlinetestobj = new OnlineHandler();
+ QSignalSpy spy(onlinetestobj, SIGNAL(backEventTriggered()));
+ onlinetestobj->backEvent();
+ QCOMPARE(spy.count(), 1);
+ delete onlinetestobj;
+ }
+
+void SearchOnlineHandlerTest::testPerformWebSearch()
+ {
+ /* OnlineHandler* onlinetestobj = new OnlineHandler();
+ onlinetestobj->readSettings();
+ if (onlinetestobj->mEng)
+ {
+ onlinetestobj->mEng->PerformWebSearch("string");
+ }
+ delete onlinetestobj;*/
+ }
+void SearchOnlineHandlerTest::testPerformInDeviceSearch()
+ {
+ /*OnlineHandler* onlinetestobj = new OnlineHandler();
+ onlinetestobj->readSettings();
+ if (onlinetestobj->mEng)
+ {
+ onlinetestobj->mEng->PerformInDeviceSearch("string");
+ }
+ delete onlinetestobj;*/
+ }
+
+#ifdef Q_OS_SYMBIAN
+
+//QTEST_MAIN corrected since crashes if TRAP not in correct place.
+//Will be corrected in later (estimate 4.6.0) Qt release for Symbian.
+int main(int argc, char *argv[])
+ {
+ QApplication app(argc, argv);
+ int error = 0;
+ TRAPD(err,
+ QTEST_DISABLE_KEYPAD_NAVIGATION
+ SearchOnlineHandlerTest tc;
+ error = QTest::qExec(&tc, argc, argv););
+ Q_UNUSED(err);
+ return error;
+ }
+#else //Q_OS_SYMBIAN
+QTEST_MAIN(SearchOnlineHandlerTest)
+#endif //Q_OS_SYMBIAN
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_onlinehandler/t_onlinehandler.pri Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#Header files
+HEADERS += ./inc/*.h
+
+#Source files
+SOURCES += ./src/*.cpp
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/t_onlinehandler/t_onlinehandler.pro Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,47 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: Search onlinehandler unit test project file
+#
+
+TEMPLATE = app
+
+
+LIBS += -lsearchonlinehandler
+LIBS += -lisengine
+LIBS += -lisproviderdbmanager
+
+INCLUDEPATH += .
+INCLUDEPATH += ../../inc \
+ ../../../inc
+
+
+CONFIG += qtestlib
+CONFIG += hb
+
+QT += xml \
+ sql
+DEFINES += SEARCH_UNITTESTING
+
+symbian {
+CONFIG += symbian_test
+TARGET.UID2 = 0x100039CE
+TARGET.CAPABILITY = ALL -TCB -DRM
+TARGET.EPOCSTACKSIZE = 0x14000 // 80kB
+TARGET.EPOCHEAPSIZE = 0x20000 0x800000 // 128kB - 16MB
+INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
+INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+}
+
+include(t_onlinehandler.pri)
+
Binary file searchui/onlinehandler/tsrc/testdb/providerdatabase.sq has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/onlinehandler/tsrc/tsrc.pro Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,30 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TEMPLATE = subdirs
+
+SUBDIRS += t_onlinehandler \
+t_baiduplugin \
+t_bingplugin \
+t_googleplugin
+
+CONFIG += ordered
+
+symbian: {
+ CONFIG += symbian_test
+BLD_INF_RULES.prj_exports += "testdb/providerdatabase.sq /epoc32/winscw/c/private/20022F35/providerdatabase.sq" \
+ "testdb/providerdatabase.sq /epoc32/data/z/private/20022F35/providerdatabase.sq"
+}
--- a/searchui/rom/search.iby Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/rom/search.iby Thu Jul 22 16:34:05 2010 +0100
@@ -27,11 +27,14 @@
// Application registration file.
data=DATAZ_/private/10003a3f/import/apps/Searchapplication_reg.rsc /private/10003a3f/import/apps/Searchapplication_reg.rsc
-data=DATAZ_/resource/apps/Searchapplication.mif /resource/apps/Searchapplication.mif
+
//SearchIndevice handler
file=/epoc32/release/armv5/urel/searchindevicehandler.dll SHARED_LIB_DIR/searchindevicehandler.dll
+//Searchonline handler
+file=/epoc32/release/armv5/urel/searchonlinehandler.dll SHARED_LIB_DIR/searchonlinehandler.dll
+
//runtime provider dll
--- a/searchui/runtimeproviders/searchruntimeprovider/searchruntimeprovider.pro Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/runtimeproviders/searchruntimeprovider/searchruntimeprovider.pro Thu Jul 22 16:34:05 2010 +0100
@@ -63,6 +63,16 @@
TARGET.CAPABILITY = ALL -TCB -DRM
appkey:DEFINES += S60APP_KEY
INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
+ INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+
+ defBlock = \
+ "$${LITERAL_HASH}if defined(EABI)" \
+ "DEFFILE ../eabi/" \
+ "$${LITERAL_HASH}else" \
+ "DEFFILE ../bwins/" \
+ "$${LITERAL_HASH}endif"
+
+ MMP_RULES += defBlock
#include(searchruntimeprovider_installs_symbian.pri)
# BLD_INF_RULES.prj_exports += "./inc/searchruntimeprovider.h |../../inc/" \
# "./inc/searchruntime.h |../../inc/"
--- a/searchui/runtimeproviders/searchruntimeprovider/src/searchruntime.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/runtimeproviders/searchruntimeprovider/src/searchruntime.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -23,23 +23,24 @@
#include <qstate.h>
#include <qfinalstate.h>
#include <qdebug.h>
-
+#include <hbapplication.h>
#include <hbmainwindow.h>
-
+#define hbApp qobject_cast<HbApplication*>(qApp)
// states
const char wizardProgressiveStateUri[] =
"search.nokia.com/state/wizardprogressivestate";
const char wizardSettingStateUri[] =
"search.nokia.com/state/wizardsettingstate";
-
+const char wizardOnlineStateUri[] =
+ "search.nokia.com/state/wizardonlinestate";
// ---------------------------------------------------------------------------
// searchRuntime::SearchRuntime
// ---------------------------------------------------------------------------
//
SearchRuntime::SearchRuntime(QObject* aParent) :
-QStateMachine(aParent),mWindow(0)
+ QStateMachine(aParent), mWindow(0)
{
createGuiServiceParts();
createStates();
@@ -52,7 +53,7 @@
SearchRuntime::~SearchRuntime()
{
delete mWindow;
- // delete mStateMachine;
+ // delete mStateMachine;
}
// ---------------------------------------------------------------------------
@@ -61,7 +62,7 @@
//
void SearchRuntime::handleStateMachineStarted()
{
- // emit started();
+ // emit started();
}
// ---------------------------------------------------------------------------
@@ -91,7 +92,7 @@
{
SearchStateProvider stateProvider;
-
+
QFinalState* finalState = new QFinalState();
this->addState(finalState);
@@ -105,43 +106,88 @@
QState* searchRootState = new QState(guiRootState);
-
- QState* wizardProgressiveState = stateProvider.createState(wizardProgressiveStateUri);
+ QState* wizardProgressiveState = stateProvider.createState(
+ wizardProgressiveStateUri);
// set state specific data
wizardProgressiveState->setParent(searchRootState);
wizardProgressiveState->setObjectName(wizardProgressiveStateUri);
-
- QState* wizardSettingState = stateProvider.createState(wizardSettingStateUri);
+ QState* wizardSettingState = stateProvider.createState(
+ wizardSettingStateUri);
wizardSettingState->setParent(searchRootState);
wizardSettingState->setObjectName(wizardSettingStateUri);
+ QState* wizardOnlineState = stateProvider.createState(
+ wizardOnlineStateUri);
+ wizardOnlineState->setParent(searchRootState);
+ wizardOnlineState->setObjectName(wizardOnlineStateUri);
+
+ // progressive to settings
wizardProgressiveState->addTransition(wizardProgressiveState,
- SIGNAL(settingsState()), wizardSettingState);
+ SIGNAL(switchProToSettingsState()), wizardSettingState);
- // From activated back to menu
+ // settings to progressive
wizardSettingState->addTransition(wizardSettingState,
- SIGNAL(backEventTriggered()), wizardProgressiveState);
-
+ SIGNAL(switchToProState()), wizardProgressiveState);
+
+ // online to settings
+ wizardOnlineState->addTransition(wizardOnlineState,
+ SIGNAL(switchOnlineToSettingsState()), wizardSettingState);
+
+ // settings to online
+ wizardSettingState->addTransition(wizardSettingState,
+ SIGNAL(switchToOnlineState()), wizardOnlineState);
+
connect(wizardSettingState, SIGNAL(clickstatus(bool)),
- wizardProgressiveState, SLOT(settingsaction(bool)));
+ wizardProgressiveState, SLOT(settingsaction(bool)));
connect(wizardSettingState, SIGNAL(publishSelectedCategory(int,bool)),
wizardProgressiveState, SLOT(getSettingCategory(int,bool)));
+
+ connect(wizardSettingState, SIGNAL(publishISProviderIcon(int,HbIcon)),
+ wizardProgressiveState, SLOT(slotISProvidersIcon(int,HbIcon)));
- connect(wizardSettingState, SIGNAL(customizeGoButton(bool)),
- wizardProgressiveState, SLOT(_customizeGoButton(bool)));
+ connect(wizardProgressiveState, SIGNAL(inDeviceSearchQuery(QString)),
+ wizardOnlineState, SLOT(slotIndeviceQuery(QString)));
+
+ connect(wizardProgressiveState, SIGNAL(launchLink(int,QString)),
+ wizardOnlineState, SLOT(slotlaunchLink(int,QString)));
+
+ connect(wizardOnlineState, SIGNAL(onlineSearchQuery(QString)),
+ wizardProgressiveState, SLOT(slotOnlineQuery(QString)));
// set initial state for statemachine
- searchRootState->setInitialState(wizardProgressiveState);
+ if (hbApp->activateReason() == Hb::ActivationReasonActivity)
+ {
+
+ QVariantHash params = hbApp->activateParams();
+ QString var = params.value("activityname").toString();
+
+ if (var == "SearchView")
+ {
+ searchRootState->setInitialState(wizardProgressiveState);
+ }
+ else if (var == "SearchDeviceQueryView")
+ {
+ searchRootState->setInitialState(wizardProgressiveState);
+
+ }
+ else if (var == "SearchWebQueryView")
+ {
+ searchRootState->setInitialState(wizardOnlineState);
+ }
+ }
+ else if (hbApp->activateReason() == Hb::ActivationReasonNormal)
+ {
+
+ searchRootState->setInitialState(wizardProgressiveState);
+
+ }
guiRootState->setInitialState(searchRootState);
this->setInitialState(parallel);
- connect(this, SIGNAL(started()),
- SLOT(handleStateMachineStarted()));
- connect(this, SIGNAL(stopped()),
- SLOT(handleStateMachineStopped()));
- connect(this, SIGNAL(finished()),
- SLOT(handleStateMachineStopped()));
+ connect(this, SIGNAL(started()), SLOT(handleStateMachineStarted()));
+ connect(this, SIGNAL(stopped()), SLOT(handleStateMachineStopped()));
+ connect(this, SIGNAL(finished()), SLOT(handleStateMachineStopped()));
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/searchapplication/inc/searchapplication.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: search application main class.
+ *
+ */
+
+#ifndef SEARCHAPPLICATION_H
+#define SEARCHAPPLICATION_H
+
+#include "search_global.h"
+
+#include <qobject.h>
+
+class QStateMachine;
+
+/**
+ * @ingroup group_searchsearchlication
+ * @brief Search application main class.
+ *
+ * Loads a runtime from a runtime provider plugin. Manages
+ * the runtime execution.
+ *
+ * @lib ?library
+ * @since S60 ?S60_version
+ */
+class SearchApplication : public QObject
+ {
+Q_OBJECT
+
+public:
+
+ /**
+ * Constructor.
+ * @since S60 ?S60_version.
+ * @param aParent Parent object.
+ */
+ SearchApplication(QObject* aParent = 0);
+
+ /**
+ * Destructor.
+ * @since S60 ?S60_version.
+ */
+ virtual ~SearchApplication();
+
+private:
+
+ Q_DISABLE_COPY(SearchApplication)
+
+signals:
+
+ /**
+ * Emitted when the search application needs to exit.
+ * @since S60 ?S60_version.
+ */
+ void exit();
+
+public slots:
+
+ /**
+ * Starts the runtime.
+ * @since S60 ?S60_version.
+ */
+ void start();
+
+ /**
+ * Stops the runtime.
+ * @since S60 ?S60_version.
+ */
+ void stop();
+
+private slots:
+
+ /**
+ * Called after the runtime has started.
+ * @since S60 ?S60_version.
+ */
+ void handleRuntimeStarted();
+
+ /**
+ * Called after the runtime has stopped.
+ * @since S60 ?S60_version.
+ */
+ void handleRuntimeStopped();
+
+ /**
+ * Called after the runtime has faulted.
+ * @since S60 ?S60_version.
+ */
+ void handleRuntimeFaulted();
+
+private:
+
+ /**
+ * Runtime.
+ */
+ QStateMachine* mRuntime;
+ };
+
+#endif//SEARCHAPPLICATION_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/searchapplication/src/searchapplication.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Search application main class.
+ *
+ */
+
+#include "searchapplication.h"
+#include <qstatemachine.h>
+#include <searchruntimeprovider.h>
+#include <searchruntime.h>
+
+// ---------------------------------------------------------------------------
+// SearchApplication::SearchApplication
+// ---------------------------------------------------------------------------
+//
+SearchApplication::SearchApplication(QObject* aParent) :
+ QObject(aParent), mRuntime(NULL)
+ {
+ SEARCH_FUNC_ENTRY("SEARCH::SearchApplication::SearchApplication");
+
+ SearchRuntimeProvider *interface = new SearchRuntimeProvider();
+ mRuntime = interface->createPlugin();
+ if (mRuntime)
+ {
+ mRuntime->setParent(this);
+ connect(mRuntime, SIGNAL(started()),this, SLOT(handleRuntimeStarted()));
+ connect(mRuntime, SIGNAL(stopped()),this, SLOT(handleRuntimeStopped()));
+ connect(mRuntime, SIGNAL(faulted()),this, SLOT(handleRuntimeFaulted()));
+ }
+ SEARCH_FUNC_EXIT("SEARCH::SearchApplication::SearchApplication");
+ }
+
+// ---------------------------------------------------------------------------
+// SearchApplication::~SearchApplication()
+// ---------------------------------------------------------------------------
+//
+SearchApplication::~SearchApplication()
+ {
+ if (mRuntime)
+ {
+ disconnect(mRuntime, SIGNAL(started()), this,
+ SLOT(handleRuntimeStarted()));
+ disconnect(mRuntime, SIGNAL(stopped()), this,
+ SLOT(handleRuntimeStopped()));
+ disconnect(mRuntime, SIGNAL(faulted()), this,
+ SLOT(handleRuntimeFaulted()));
+
+ delete mRuntime;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// SearchApplication::start()
+// ---------------------------------------------------------------------------
+//
+void SearchApplication::start()
+ {
+ SEARCH_FUNC_ENTRY("SEARCH::Search::start");
+
+ if (mRuntime)
+ {
+ mRuntime->start();
+ }
+ else
+ {
+ emit exit();
+ }
+
+ SEARCH_FUNC_EXIT("SEARCH::Search::start");
+ }
+
+// ---------------------------------------------------------------------------
+// SearchApplication::stop()
+// ---------------------------------------------------------------------------
+//
+void SearchApplication::stop()
+ {
+ SEARCH_FUNC_ENTRY("SEARCH::Search::stop");
+ if (mRuntime)
+ {
+ mRuntime->stop();
+ }
+
+ SEARCH_FUNC_EXIT("SEARCH::Search::stop");
+ }
+
+// ---------------------------------------------------------------------------
+// SearchApplication::handleRuntimeStarted()
+// ---------------------------------------------------------------------------
+//
+void SearchApplication::handleRuntimeStarted()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// SearchApplication::handleRuntimeStopped()
+// ---------------------------------------------------------------------------
+//
+void SearchApplication::handleRuntimeStopped()
+ {
+ emit exit();
+ }
+
+// ---------------------------------------------------------------------------
+// SearchApplication::handleRuntimeFaulted()
+// ---------------------------------------------------------------------------
+//
+void SearchApplication::handleRuntimeFaulted()
+ {
+ emit exit();
+ }
--- a/searchui/searchui.pro Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/searchui.pro Thu Jul 22 16:34:05 2010 +0100
@@ -11,11 +11,12 @@
#
# Contributors:
#
-# Description: SEARCH project file
+# Description: SEARCHUI project file
#
TEMPLATE = subdirs
-SUBDIRS += indevicehandler \
+SUBDIRS += onlinehandler \
+ indevicehandler \
stateproviders \
runtimeproviders \
searchapplication
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/stateproviders/searchstateprovider/inc/searchonlinestate.h Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+#ifndef SEARCH_STATES_ONLINE_H
+#define SEARCH_STATES_ONLINE_H
+#include <qstate.h>
+#include "search_global.h"
+#include <hbicon.h>
+SEARCH_CLASS( SearchStateProviderTest)
+
+class HbDocumentLoader;
+class HbView;
+class HbSearchPanel;
+class HbMainWindow;
+class OnlineHandler;
+/** @ingroup group_searchonlinestate
+ * @brief The state handles wizard activation and interaction.
+ *
+ * @see StateMachine
+ *
+ * @lib ?library
+ * @since S60 ?S60_version
+ */
+class SearchOnlineState : public QState
+ {
+Q_OBJECT
+public:
+
+public:
+
+ /**
+ * Constructor.
+ * @since S60 ?S60_version.
+ * @param aParent Owner.
+ */
+ SearchOnlineState(QState *aParent = 0);
+
+ /**
+ * Destructor.
+ * @since S60 ?S60_version.
+ */
+ virtual ~SearchOnlineState();
+
+protected:
+
+ /**
+ * @copydoc QState::onEntry()
+ */
+ void onEntry(QEvent *event);
+
+ /**
+ * @copydoc QState::onExit()
+ */
+ void onExit(QEvent *event);
+
+private:
+ /**
+ * deactivates the signals .
+ * @since S60 ?S60_version.
+ */
+ void deActivateSignals();
+
+ /**
+ * activates the signals .
+ * @since S60 ?S60_version.
+ */
+ void activateSignals();
+
+ void createui();
+public slots:
+
+ /**
+ * slot connects to search panel to initiate the online search
+ * @since S60 ?S60_version.
+ * @param aKeyword search keyword.
+ */
+ void startOnlineSearch(const QString &aKeyword);
+
+ /**
+ * slot connects to search panel to launch the settings delimiter
+ * @since S60 ?S60_version.
+ */
+ void setSettings();
+
+ /**
+ * slot connects to search panel to cancel the outstanding search
+ * @since S60 ?S60_version.
+ */
+ void cancelSearch();
+
+ /**
+ * slot connects to online handler to get notified when plugin is intialized
+ * @since S60 ?S60_version.
+ */
+ void slotpluginIntialized(bool);
+
+ /**
+ * slot connects to online handler to get notified when plugin is shutdown
+ * @since S60 ?S60_version.
+ */
+ void slotpluginShutdown(bool);
+
+ /**
+ * slot connects to online handler to get notified when view changed
+ * @since S60 ?S60_version.
+ */
+ void slotbackEventTriggered();
+
+ /**
+ * slot connects to progressive search state to get notified criteria in search panel
+ * @since S60 ?S60_version.
+ * @param aKeyword search keyword.
+ */
+ void slotIndeviceQuery(QString);
+
+ /**
+ * slot connects to progressive search state to launch the suggestion links
+ * @since S60 ?S60_version.
+ * @param aKeyword search keyword.
+ * @param id search provider id.
+ */
+ void slotlaunchLink(int, QString);
+
+ /**
+ * slot connects to main window to get notify when view is ready
+ * @since S60 ?S60_version.
+ */
+ void slotviewReady();
+
+signals:
+
+ /**
+ * Signalled when user selects an to switch the settings state
+ * setting state will be activated.
+ */
+ void switchOnlineToSettingsState();
+
+ /**
+ * Signalled when user change the state to progressive state
+ * setting state will be activated.
+ */
+ void onlineSearchQuery(QString);
+
+private:
+ HbMainWindow* mMainWindow;
+ /**
+ * main view.
+ * Own.
+ */
+ HbView* mView;
+
+ /**
+ * The searchpanel widget.
+ * Own.
+ */
+ HbSearchPanel* mSearchPanel;
+
+ /**
+ * HbDocumentLoader instance.
+ */
+ HbDocumentLoader* mDocumentLoader;
+
+ /**
+ * OnlineHandler instance.
+ */
+ OnlineHandler* mInternetHandler;
+
+ /**
+ * search keyword.
+ */
+ QString mSearchQuery;
+ bool mSearchReady;
+ bool mIndeviceQueryAvailable;
+ bool mIsUICreated;
+ /**
+ * friend class for unit testing
+ */
+ SEARCH_FRIEND_CLASS (SearchStateProviderTest)
+ };
+
+#endif //SEARCH_STATES_ONLINE_H
--- a/searchui/stateproviders/searchstateprovider/inc/searchprogressivestate.h Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/inc/searchprogressivestate.h Thu Jul 22 16:34:05 2010 +0100
@@ -18,7 +18,6 @@
#ifndef PROGRESSIVE_SEARCH_STATE_H
#define PROGRESSIVE_SEARCH_STATE_H
-#include <qabstractitemmodel.h>
#include <qstate.h>
#include <qstringlist.h>
#include <qdatetime.h>
@@ -30,11 +29,7 @@
#include "search_global.h"
#include <f32file.h>
-//Uncomment to enable performance measurements.
-//#define OST_TRACE_COMPILER_IN_USE
-
-#ifdef OST_TRACE_COMPILER_IN_USE
-
+#ifdef OST_TRACE_COMPILER_IN_USE //defined in Search_global.h
#define PERF_CAT_API_TIME_RESTART m_categorySearchApiTime.restart();
#define PERF_CAT_UI_TIME_RESTART m_categorySearchUiTime.restart();
#define PERF_CAT_TOTAL_TIME_RESTART m_totalSearchUiTime.restart();
@@ -46,7 +41,9 @@
#define PERF_CAT_GETDOC_TIME_ACCUMULATE m_getDocumentCatergoryTimeAccumulator += m_categoryGetDocumentApiTime.elapsed();
#define PERF_CAT_GETDOC_ACCUMULATOR_RESET m_getDocumentCatergoryTimeAccumulator = 0;
#define PERF_CAT_GETDOC_ACCUMULATOR_ENDLOG qDebug() << "Get Doc on category (API): " << mTemplist.at( mDatabasecount-1 ) << "took " << m_getDocumentCatergoryTimeAccumulator << "msec";
-
+#define PERF_RESULT_ITEM_LAUNCH_TIME_RESTART m_resultItemLaunchTime.restart();
+#define PERF_RESULT_ITEM_FOR_LAUNCHING(string) qDebug() <<"Result_Item_Launching: Launching "<<string ;
+#define PERF_RESULT_ITEM_LAUNCH_TIME_ENDLOG(string) qDebug() <<"Result_Item_Launching:"<<string<<"took "<<m_resultItemLaunchTime.elapsed()<<" msec";
#else
#define PERF_CAT_API_TIME_RESTART
@@ -60,19 +57,22 @@
#define PERF_CAT_GETDOC_TIME_ACCUMULATE
#define PERF_CAT_GETDOC_ACCUMULATOR_RESET
#define PERF_CAT_GETDOC_ACCUMULATOR_ENDLOG
-
+#define PERF_RESULT_ITEM_LAUNCH_TIME_RESTART
+#define PERF_RESULT_ITEM_FOR_LAUNCHING(string)
+#define PERF_RESULT_ITEM_LAUNCH_TIME_ENDLOG(string)
#endif //OST_TRACE_COMPILER_IN_USE
class HbMainWindow;
class HbView;
-class HbListView;
class HbDocumentLoader;
-class QStandardItemModel;
class HbSearchPanel;
class CFbsBitmap;
class InDeviceHandler;
class QCPixDocument;
-class NotesEditor;
+class NotesEditorInterface;
class EventViewerPluginInterface;
+class HbListWidget;
+class HbListWidgetItem;
+class QPluginLoader;
SEARCH_CLASS( SearchStateProviderTest)
/** @ingroup group_searchstateprovider
* @brief The state where progressive search state is shown
@@ -130,7 +130,7 @@
* get the application icon .
* @since S60 ?S60_version.
*/
- HbIcon getAppIconFromAppId(TUid auid);
+ HbIcon getAppIconFromAppIdL(TUid auid);
/**
* resizing the symbain icon .
@@ -172,7 +172,7 @@
* @since S60 ?S60_version.
* @param aIndex index of the activated item.
*/
- void openResultitem(QModelIndex aIndex);
+ void openResultitem(HbListWidgetItem * item);
/**
* slot connects to settings state to get the selected category information
@@ -196,12 +196,6 @@
void startNewSearch(const QString &aKeyword);
/**
- * slot connects to search state for internet search
- * @since S60 ?S60_version.
- */
- void _customizeGoButton(bool avalue);
-
- /**
* slot implemented to avoid repeated search for the same category
* selection when user search for mutiple times
* @since S60 ?S60_version.
@@ -211,23 +205,7 @@
/**
* slot connects to search state for internet search
* @since S60 ?S60_version.
- */
- void cancelSearch();
- /**
- * slot connects to model for rows insert completion
- * @since S60 ?S60_version.
- */
- void getrowsInserted();
-
- /**
- * slot connects to model for rows delete completion
- * @since S60 ?S60_version.
- */
- void getrowsRemoved();
- /**
- * slot added for Application manager
- * @since S60 ?S60_version.
- */
+ */
void handleOk(const QVariant& var);
@@ -244,6 +222,13 @@
*/
void _viewingCompleted();
+
+ void viewReady();
+
+ void slotOnlineQuery(QString);
+
+ void slotISProvidersIcon(int, HbIcon);
+
private:
/**
@@ -271,7 +256,7 @@
*
* @param aKeyword search keyword.
*/
- void createSuggestionLink(bool aFlag);
+ void createSuggestionLink();
/**
* Function to include corrrect Qimage format to be taken from bitmap
@@ -308,14 +293,29 @@
QStringList filterDoc(const QCPixDocument* aDoc, const QString& filter1,
const QString& filter2, const QString& filter3 = QString());
+ /**
+ * Function to convert bitmap to pixmap
+ */
+ void fromBitmapAndMaskToPixmapL(CFbsBitmap* fbsBitmap,
+ CFbsBitmap* fbsMask, QPixmap& pixmap);
+
+ /**
+ * Function to get pixmap
+ */
+ void GetPixmapByFilenameL(TDesC& fileName, const QSize &size,
+ QPixmap& pixmap);
+
signals:
/**
* Signalled when user selects an to switch the settings state
* setting state will be activated.
*/
- void settingsState();
+ void switchProToSettingsState();
+
+ void inDeviceSearchQuery(QString);
+ void launchLink(int,QString);
private:
HbMainWindow* mMainWindow;
@@ -330,7 +330,7 @@
* The List View widget.
* Own.
*/
- HbListView* mListView;
+ HbListWidget* mListView;
/**
* Document handler to load .docml.
@@ -344,11 +344,7 @@
*/
HbSearchPanel* mSearchPanel;
- /**
- * model for list view
- * Own.
- */
- QStandardItemModel* mModel;
+
/**
* qt interface for CPix engine
@@ -412,26 +408,76 @@
*
*/
bool loadSettings;
+
+ /**
+ *
+ * Icon List to be created in boot up for all categories
+ */
QList<HbIcon> mIconArray;
+
+ /**
+ * Hbicon to be created
+ *
+ */
HbIcon mIcon;
+
+ /**
+ * to get drive info
+ *
+ */
RFs iFs;
+ /**
+ * Calendar plugin info
+ *
+ */
EventViewerPluginInterface *calAgandaViewerPluginInstance;
- NotesEditor *notesEditor;
+
+ /**
+ * to create Notes editor
+ *
+ */
+ NotesEditorInterface *mNotesEditor;
+
+ /**
+ * to create Notes plugin loader
+ *
+ */
+ QPluginLoader *mNotespluginLoader;
+
+ QMap<int, HbIcon> mISprovidersIcon;
+
+ bool mOnlineQueryAvailable;
+
private:
+ /**
+ * Application manager handler to perform resultitem opening.
+ *
+ */
XQApplicationManager* mAiwMgr;
+
+ /**
+ * Request handler to to open resultItems
+ *
+ */
XQAiwRequest* mRequest;
+
+ /**
+ * ListView icon Size.
+ *
+ */
QSize mListViewIconSize;
#ifdef OST_TRACE_COMPILER_IN_USE
QTime m_totalSearchUiTime;
QTime m_categorySearchUiTime;
QTime m_categorySearchApiTime;
QTime m_categoryGetDocumentApiTime;
+ QTime m_resultItemLaunchTime;
//use long to safeguard overflow from long running operations.
- long m_getDocumentCatergoryTimeAccumulator;
+ long m_getDocumentCatergoryTimeAccumulator;
#endif
-SEARCH_FRIEND_CLASS (SearchStateProviderTest)
+ SEARCH_FRIEND_CLASS (SearchStateProviderTest)
};
--- a/searchui/stateproviders/searchstateprovider/inc/searchsettingsstate.h Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/inc/searchsettingsstate.h Thu Jul 22 16:34:05 2010 +0100
@@ -14,14 +14,12 @@
* Description:
*
*/
-
#ifndef SEARCH_STATES_SETTINGS_H
#define SEARCH_STATES_SETTINGS_H
-
#include <qstate.h>
#include <qabstractitemmodel.h>
#include "search_global.h"
-
+#include <hbicon.h>
SEARCH_CLASS( SearchStateProviderTest)
class QGraphicsWidget;
@@ -85,7 +83,6 @@
private:
-
/**
* checking whether internet search is selected
* @since S60 ?S60_version.
@@ -93,10 +90,10 @@
void isInternetOn();
public slots:
- /**
- * Called when it receive the selected category information from the settingwidget class
- * @since S60 ?S60_version.
- */
+ /**
+ * Called when it receive the selected category information from the settingwidget class
+ * @since S60 ?S60_version.
+ */
void getItemCategory(int, bool);
@@ -106,14 +103,19 @@
*/
void handleBackEvent(bool);
+ void slotISProvidersIcon(HbIcon icon, int id);
+
signals:
/**
* Emitted when the menu state is to be activated.
* @since S60 ?S60_version.
*/
- void backEventTriggered();
-
+
+ void switchToProState();
+
+ void settingslaunched();
+
/**
* Emitted when ok/cancel clicked on settings page
* @since S60 ?S60_version.
@@ -130,7 +132,9 @@
* Emitted when internet search is selectead
* @since S60 ?S60_version.
*/
- void customizeGoButton(bool);
+ void switchToOnlineState();
+
+ void publishISProviderIcon(int, HbIcon);
private:
@@ -154,7 +158,7 @@
/**
* friend class for unit testing
*/
-SEARCH_FRIEND_CLASS (SearchStateProviderTest)
+ SEARCH_FRIEND_CLASS (SearchStateProviderTest)
};
#endif //SEARCH_STATES_SETTINGS_H
--- a/searchui/stateproviders/searchstateprovider/inc/settingswidget.h Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/inc/settingswidget.h Thu Jul 22 16:34:05 2010 +0100
@@ -21,6 +21,8 @@
#include <qlist.h>
#include <hbgridview.h>
#include <search_global.h>
+#include <hbicon.h>
+class OnlineHandler;
class HbCheckBox;
class HbDialog;
class QSignalMapper;
@@ -73,7 +75,7 @@
*
*/
void loadDeviceSettings();
-
+
/**
* Load default settings for search categories to ini file
*
@@ -91,27 +93,30 @@
*
*/
void storeDefaultSettings();
-
+
/**
* setting up gui for the settings widget
*/
void createGui();
-
+
/**
* Filter out categories from the sql database provided by the engine
* for only those categories that have been successfully harvested
*/
void preparecategories();
-
-
+
/**
- * initilize the settings wizard while entering to the setting state
- */
+ * initilize the settings wizard while entering to the setting state
+ */
void initialize();
-
+
+ void setSettingsFilePath();
+
+ void loadIS();
+
public slots:
/**
* will be called when settings OK is clicked
@@ -126,10 +131,16 @@
*/
void itemChecked(int);
/**
- * slot called while clicking items added to the combobox
- */
+ * slot called while clicking items added to the combobox
+ */
void q_currentIndexChanged(int);
+
+ void slotproviderDetails(QString, HbIcon, int);
+
+ void slotdefaultProvider(const int);
+
+ void slotitemSelected(int);
signals:
/**
* Emitted when setting closed
@@ -146,6 +157,8 @@
*
*/
void selectedItemCategory(int, bool);
+
+ void ISProvidersIcon(HbIcon,int);
private:
/**
@@ -177,30 +190,30 @@
QStringList mDeviceListDisplay;
/**
- * list of hardcoded device categories:cretaed to
- * set up default category values to the ini file
- */
+ * list of hardcoded device categories:cretaed to
+ * set up default category values to the ini file
+ */
QStringList mDeviceCategoryRefList;
/**
- * intermediate variable to store selected category values
- */
+ * intermediate variable to store selected category values
+ */
QList<bool> mDeviceMapping;
/**
* list of hardcoded service providers
*/
- QStringList internetCategoryList;
+ //QStringList internetCategoryList;
/**
* for unit testing
*/
QStringList mCategoryList;
/**
- * DocumentLoader variable for the setting widget
- */
+ * DocumentLoader variable for the setting widget
+ */
HbDocumentLoader* mDocumentLoader;
-
+
/**
* Dataform for the settingwidget
*/
@@ -208,12 +221,12 @@
HbDataForm* dataform;
/**
- * Dataform model
- */
+ * Dataform model
+ */
HbDataFormModel* mModel;
/**
- * variable for customizing each item the in the dataform
- */
+ * variable for customizing each item the in the dataform
+ */
QList<HbDataFormModelItem*> mModelItemList;
@@ -223,18 +236,24 @@
int mSelectedProvider;
/**
- * Radio buttion list for internet search categories
- */
+ * Radio buttion list for internet search categories
+ */
HbRadioButtonList* mradiolist;
-
+
/**
* combobox items
- */
- HbComboBox *comboBox ;
+ */
+ HbComboBox *comboBox;
bool mInstialize;
bool mchangestate;
+
+ OnlineHandler *mInternetHandler;
+ // QStringList mServiceProviders;
+ QMap<int, QString> mServiceProviders;
+
+ QString mSettingFileName;
SEARCH_FRIEND_CLASS (SearchStateProviderTest)
};
#endif
--- a/searchui/stateproviders/searchstateprovider/resources/searchstateprovider.docml Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/resources/searchstateprovider.docml Thu Jul 22 16:34:05 2010 +0100
@@ -2,16 +2,10 @@
<hbdocument version="1.0">
<widget name="tocView" type="HbView">
<widget name="content" role="HbView:widget" type="HbWidget">
- <widget name="listView" type="HbListView">
- <widget name="prototype" role="HbAbstractView:prototype" type="HbListViewItem">
- <enums name="graphicsSize" value="LargeIcon"/>
- </widget>
- <string name="layoutName" value="default"/>
- <sizehint height="47.7612un" type="PREFERRED" width="35.8209un"/>
+ <widget name="searchPanel" type="HbSearchPanel">
+ <sizepolicy horizontalPolicy="Preferred" horizontalStretch="0" verticalPolicy="Preferred" verticalStretch="0"/>
</widget>
- <widget name="searchPanel" type="HbSearchPanel">
- <sizepolicy horizontalPolicy="MinimumExpanding" horizontalStretch="0" verticalPolicy="Preferred" verticalStretch="0"/>
- </widget>
+ <widget name="listView" type="HbListWidget"/>
<layout orientation="Vertical" type="linear">
<linearitem itemname="listView"/>
<linearitem itemname="searchPanel"/>
@@ -21,6 +15,5 @@
</widget>
<metadata activeUIState="Common ui state" display="NHD portrait" unit="un">
<uistate name="Common ui state" sections="#common"/>
- <dummydata objectName="listView" section="#common" value="0"/>
</metadata>
</hbdocument>
--- a/searchui/stateproviders/searchstateprovider/searchstateprovider.pro Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/searchstateprovider.pro Thu Jul 22 16:34:05 2010 +0100
@@ -36,8 +36,6 @@
LIBS += -L$$PWD/../../../bin/debug
}
-
-LIBS += -lstatemodel
LIBS += -lsearchindevicehandler
LIBS += -lxqservice
LIBS += -lqcpixsearchclient
@@ -46,8 +44,14 @@
LIBS += -laknicon
LIBS += -lapgrfx
LIBS += -lbitgdi
-LIBS += -lnoteseditor
-
+#LIBS += -lnoteseditor
+LIBS += -lxqutils
+LIBS += -lsearchonlinehandler
+LIBS += -lapparc
+LIBS += -lefsrv
+LIBS += -lapgrfx
+LIBS += -lws32
+LIBS += -lavkon
coverage:DEFINES += COVERAGE_MEASUREMENT
@@ -63,8 +67,9 @@
INCLUDEPATH += ./inc \
../../inc \
- ../../indevicehandler/inc
-
+ ../../onlinehandler/inc \
+ ../../indevicehandler/inc
+
symbian {
@@ -73,6 +78,16 @@
TARGET.EPOCALLOWDLLDATA=1
TARGET.CAPABILITY = ALL -TCB -DRM
INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
+ INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+
+ defBlock = \
+ "$${LITERAL_HASH}if defined(EABI)" \
+ "DEFFILE ../eabi/" \
+ "$${LITERAL_HASH}else" \
+ "DEFFILE ../bwins/" \
+ "$${LITERAL_HASH}endif"
+
+ MMP_RULES += defBlock
#include(searchstateprovider_installs_symbian.pri)
# BLD_INF_RULES.prj_exports += "./inc/searchstateprovider.h |../../inc/"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/stateproviders/searchstateprovider/src/searchonlinestate.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,274 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Implements the wizard activation and interactions.
+ *
+ */
+
+#include "searchonlinestate.h"
+#include "onlinehandler.h"
+#include <hbdocumentloader.h>
+#include <hbview.h>
+#include <hblabel.h>
+#include <hbstackedwidget.h>
+#include <hbicon.h>
+#include <hbinstance.h>
+#include <hbaction.h>
+#include <qstandarditemmodel.h>
+#include <qdebug.h>
+#include <qgraphicswidget.h>
+#include <qdir.h>
+#include <hbsearchpanel.h>
+#include <hbapplication.h>
+#define hbApp qobject_cast<HbApplication*>(qApp)
+const char *SEARCHONLINESTATE_DOCML = ":/xml/searchstateprovider.docml";
+const char *ONLINE_TOC_VIEW = "tocView";
+const char *ONLINE_TUT_SEARCHPANEL_WIDGET = "searchPanel";
+
+// ---------------------------------------------------------------------------
+// SearchOnlineState::SearchOnlineState
+// ---------------------------------------------------------------------------
+//
+SearchOnlineState::SearchOnlineState(QState *parent) :
+ QState(parent), mMainWindow(NULL), mView(NULL), mSearchPanel(NULL),
+ mDocumentLoader(NULL)
+ {
+
+ mInternetHandler = new OnlineHandler();
+ mSearchReady = true;
+ mIndeviceQueryAvailable = false;
+ mIsUICreated = false;
+ //activateSignals();
+ }
+// ---------------------------------------------------------------------------
+// SearchOnlineState::~SearchOnlineState
+// ---------------------------------------------------------------------------
+//
+SearchOnlineState::~SearchOnlineState()
+ {
+ delete mDocumentLoader;
+ delete mInternetHandler;
+ }
+void SearchOnlineState::createui()
+ {
+ mMainWindow = hbInstance->allMainWindows().at(0);
+ mDocumentLoader = new HbDocumentLoader();
+ bool ok = false;
+ mDocumentLoader->load(SEARCHONLINESTATE_DOCML, &ok);
+
+ QGraphicsWidget *widget = mDocumentLoader->findWidget(ONLINE_TOC_VIEW);
+ Q_ASSERT_X(ok && (widget != 0), "ONLINE_TOC_VIEW", "invalid view");
+
+ mView = qobject_cast<HbView*> (widget);
+ if (mView)
+ {
+ mView->setTitle(hbTrId("txt_search_title_search"));
+ }
+
+ mSearchPanel = qobject_cast<HbSearchPanel *> (
+ mDocumentLoader->findWidget(ONLINE_TUT_SEARCHPANEL_WIDGET));
+ if (mSearchPanel)
+ {
+ mSearchPanel->setSearchOptionsEnabled(true);
+
+ mSearchPanel->setProgressive(false);
+
+ mSearchPanel->setPlaceholderText(hbTrId(
+ "txt_search_dialog_search_internet"));
+
+ mSearchPanel->setCancelEnabled(false);
+ }
+ if (mView && mMainWindow)
+ {
+ mMainWindow->addView(mView);
+ mMainWindow->setCurrentView(mView);
+ }
+ }
+// ---------------------------------------------------------------------------
+// SearchOnlineState::onEntry
+// ---------------------------------------------------------------------------
+//
+void SearchOnlineState::onEntry(QEvent *event)
+ {
+ qDebug() << "search:SearchOnlineState::onEntry";
+ QState::onEntry(event);
+ if (!mIsUICreated)
+ {
+ createui();
+ mIsUICreated = true;
+ }
+
+ activateSignals();
+ // If this is not the current view, we're getting back from plugin view
+ if (mMainWindow)
+ {
+ if (mMainWindow->currentView() != mView)
+ {
+ mMainWindow->setCurrentView(mView, true);
+ }
+ mMainWindow->show();
+ }
+ if (mIndeviceQueryAvailable)
+ {
+ mSearchPanel->setCriteria(mSearchQuery);
+ mIndeviceQueryAvailable = false;
+ }
+
+ }
+// ---------------------------------------------------------------------------
+// SearchOnlineState::onExit
+// ---------------------------------------------------------------------------
+//
+void SearchOnlineState::onExit(QEvent *event)
+ {
+ QState::onExit(event);
+ deActivateSignals();
+ }
+// ---------------------------------------------------------------------------
+// SearchProgressiveState::activateSignals
+// ---------------------------------------------------------------------------
+void SearchOnlineState::activateSignals()
+ {
+ if (mSearchPanel)
+ {
+ connect(mSearchPanel, SIGNAL(criteriaChanged(QString)), this,
+ SLOT(startOnlineSearch(QString)));
+ connect(mSearchPanel, SIGNAL(searchOptionsClicked()), this,
+ SLOT(setSettings()));
+ connect(mSearchPanel, SIGNAL(exitClicked()), this,
+ SLOT(cancelSearch()));
+ }
+ if (mInternetHandler)
+ {
+
+ connect(mInternetHandler, SIGNAL(pluginIntialized(bool)), this,
+ SLOT(slotpluginIntialized(bool)));
+ connect(mInternetHandler, SIGNAL(pluginShutdown(bool)), this,
+ SLOT(slotpluginShutdown(bool)));
+ connect(mInternetHandler, SIGNAL(backEventTriggered()), this,
+ SLOT(slotbackEventTriggered()));
+ }
+ connect(mMainWindow, SIGNAL(viewReady()), this, SLOT(slotviewReady()));
+ }
+// ---------------------------------------------------------------------------
+// SearchProgressiveState::deActivateSignals
+// ---------------------------------------------------------------------------
+void SearchOnlineState::deActivateSignals()
+ {
+ if (mSearchPanel)
+ {
+ disconnect(mSearchPanel, SIGNAL(criteriaChanged(QString)), this,
+ SLOT(startOnlineSearch(QString)));
+ disconnect(mSearchPanel, SIGNAL(searchOptionsClicked()), this,
+ SLOT(setSettings()));
+ disconnect(mSearchPanel, SIGNAL(exitClicked()), this,
+ SLOT(cancelSearch()));
+ }
+ if (mInternetHandler)
+ {
+ disconnect(mInternetHandler, SIGNAL(pluginIntialized(bool)), this,
+ SLOT(slotpluginIntialized(bool)));
+ disconnect(mInternetHandler, SIGNAL(pluginShutdown(bool)), this,
+ SLOT(slotpluginShutdown(bool)));
+ disconnect(mInternetHandler, SIGNAL(backEventTriggered()), this,
+ SLOT(slotbackEventTriggered()));
+ }
+ disconnect(mMainWindow, SIGNAL(viewReady()), this, SLOT(slotviewReady()));
+ }
+// ---------------------------------------------------------------------------
+// SearchOnlineState::startOnlineSearch
+// ---------------------------------------------------------------------------
+void SearchOnlineState::startOnlineSearch(const QString &query)
+ {
+ mSearchQuery = query;
+ // if (mSearchReady)
+ {
+ mInternetHandler->readSettings();
+ mInternetHandler->initializePlugin();
+ }
+ // load online handlers
+ }
+// ---------------------------------------------------------------------------
+// SearchOnlineState::setSettings
+// ---------------------------------------------------------------------------
+void SearchOnlineState::setSettings()
+ {
+ if (mSearchQuery.length())
+ emit onlineSearchQuery(mSearchQuery);
+ emit switchOnlineToSettingsState();
+ }
+// ---------------------------------------------------------------------------
+// SearchOnlineState::cancelSearch
+// ---------------------------------------------------------------------------
+void SearchOnlineState::cancelSearch()
+ {
+ // unload handlers
+ }
+// ---------------------------------------------------------------------------
+// SearchOnlineState::slotpluginIntialized
+// ---------------------------------------------------------------------------
+void SearchOnlineState::slotpluginIntialized(bool status)
+ {
+ if (status)
+ mInternetHandler->activatePlugin(mSearchQuery);
+ }
+// ---------------------------------------------------------------------------
+// SearchOnlineState::slotpluginShutdown
+// ---------------------------------------------------------------------------
+void SearchOnlineState::slotpluginShutdown(bool status)
+ {
+ mSearchReady = status;
+ if (!mSearchReady)
+ mInternetHandler->unloadPluginandExit();
+ }
+// ---------------------------------------------------------------------------
+// SearchOnlineState::slotbackEventTriggered
+// ---------------------------------------------------------------------------
+void SearchOnlineState::slotbackEventTriggered()
+ {
+ mInternetHandler->unloadPluginandExit();
+ }
+// ---------------------------------------------------------------------------
+// SearchOnlineState::slotIndeviceQuery
+// ---------------------------------------------------------------------------
+void SearchOnlineState::slotIndeviceQuery(QString str)
+ {
+ mSearchQuery = str;
+ mIndeviceQueryAvailable = true;
+ }
+// ---------------------------------------------------------------------------
+// SearchOnlineState::slotlaunchLink
+// ---------------------------------------------------------------------------
+void SearchOnlineState::slotlaunchLink(int id, QString query)
+ {
+ mInternetHandler->loadISPlugin(id, query);
+ }
+// ---------------------------------------------------------------------------
+// SearchOnlineState::slotviewReady
+// ---------------------------------------------------------------------------
+void SearchOnlineState::slotviewReady()
+ {
+ if (hbApp)
+ {
+ if (hbApp->activateReason() == Hb::ActivationReasonActivity)
+ {
+ QVariantHash params = hbApp->activateParams();
+ QString searchKey = params.value("query").toString();
+ if (searchKey.length() > 0)
+ {
+ mSearchPanel->setCriteria(searchKey);
+ startOnlineSearch(searchKey);
+ }
+ }
+ }//PERF_APP_LAUNCH_END("SearchAppplication View is ready");
+ }
--- a/searchui/stateproviders/searchstateprovider/src/searchprogressivestate.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/src/searchprogressivestate.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -24,15 +24,10 @@
#include <hbicon.h>
#include <hbmenu.h>
#include <hbinstance.h>
-#include <hblistview.h>
#include <hbdocumentloader.h>
#include <hbsearchpanel.h>
#include <hbaction.h>
-#include <qstandarditemmodel.h>
#include <hbframebackground.h>
-#include <hbabstractviewitem.h>
-#include <hbframebackground.h>
-#include <hblistviewitem.h>
#include <hbapplication.h>
#include <qsortfilterproxymodel.h>
#include <AknsUtils.h>
@@ -42,15 +37,23 @@
#include <fbs.h>
#include <AknInternalIconUtils.h>
#include <AknIconUtils.h>
-#include <apgcli.h>
+#include <apaidpartner.h>
#include <qpluginloader.h>
#include <eventviewerplugininterface.h>
-#include <noteseditor.h>
+#include <noteseditorinterface.h>
#include <w32std.h>
#include <apgtask.h>
#include <apgcli.h>
#include <AknTaskList.h>
#include <apacmdln.h>
+#include <xqconversions.h>
+#include <apparc.h>
+#include <qdesktopservices.h>
+#include <hblistwidget.h>
+#include <hblistwidgetitem.h>
+#include <hbabstractviewitem.h>
+#include <hblistviewitem.h>
+#define hbApp qobject_cast<HbApplication*>(qApp)
const char *SEARCHSTATEPROVIDER_DOCML = ":/xml/searchstateprovider.docml";
const char *TOC_VIEW = "tocView";
const char *TUT_SEARCHPANEL_WIDGET = "searchPanel";
@@ -61,12 +64,11 @@
// ---------------------------------------------------------------------------
SearchProgressiveState::SearchProgressiveState(QState *parent) :
QState(parent), mMainWindow(NULL), mView(NULL), mListView(NULL),
- mDocumentLoader(NULL), mModel(NULL), mSearchHandler(NULL),
- notesEditor(0), mAiwMgr(0), mRequest(0)
+ mDocumentLoader(NULL), mSearchHandler(NULL), mNotesEditor(0),
+ mAiwMgr(0), mRequest(0)
{
mMainWindow = hbInstance->allMainWindows().at(0);
- mModel = new QStandardItemModel(this);
mAiwMgr = new XQApplicationManager;
@@ -83,7 +85,7 @@
mView->setTitle(hbTrId("txt_search_title_search"));
}
- mListView = qobject_cast<HbListView *> (mDocumentLoader->findWidget(
+ mListView = qobject_cast<HbListWidget *> (mDocumentLoader->findWidget(
TUT_LIST_VIEW));
Q_ASSERT_X(ok && (mListView != 0), "TUT_LIST_VIEW", "invalid viewocML file");
@@ -97,6 +99,7 @@
HbListViewItem *prototypeListView = qobject_cast<HbListViewItem *> (
prototype);
+ prototypeListView->setGraphicsSize(HbListViewItem::LargeIcon);
if (prototypeListView)
{
HbStyle style;
@@ -106,7 +109,6 @@
mListViewIconSize = size.toSize();
prototypeListView->setTextFormat(Qt::RichText);
}
- mListView->setModel(mModel, prototype);
HbAbstractItemView::ItemAnimations noCreationAndRemovalAnimations =
HbAbstractItemView::All;
@@ -120,6 +122,12 @@
if (mSearchPanel)
{
mSearchPanel->setSearchOptionsEnabled(true);
+
+ mSearchPanel->setPlaceholderText(hbTrId(
+ "txt_search_dialog_search_device"));
+
+ mSearchPanel->setCancelEnabled(false);
+ mSearchPanel->setFocus();
}
constructHandlers();
@@ -138,20 +146,20 @@
//Icon creation in array
RArray<TUid> appUid;
appUid.Append(TUid::Uid(0x20022EF9));//contact
- appUid.Append(TUid::Uid(0x10207C62));//media(audio)
- appUid.Append(TUid::Uid(0x200211FE));//video not assigned
+ appUid.Append(TUid::Uid(0x10207C62));//audio
+ appUid.Append(TUid::Uid(0x200211FE));//video
appUid.Append(TUid::Uid(0x20000A14));//image
appUid.Append(TUid::Uid(0x2001FE79));//msg
- appUid.Append(TUid::Uid(0x20022F35));//email not assigned
+ appUid.Append(TUid::Uid(0x200255BA));//email
appUid.Append(TUid::Uid(0x10005901));//calender
appUid.Append(TUid::Uid(0x20029F80));//notes
//appUid.Append(TUid::Uid(0x20022F35));//application
- appUid.Append(TUid::Uid(0x20022F35));//bookmark not assigned
+ appUid.Append(TUid::Uid(0x10008D39));//bookmark
appUid.Append(TUid::Uid(0x2002BCC0));//files
for (int i = 0; i < appUid.Count(); i++)
{
- mIconArray.append(getAppIconFromAppId(appUid[i]));
+ TRAP_IGNORE(mIconArray.append(getAppIconFromAppIdL(appUid[i])));
}
#ifdef OST_TRACE_COMPILER_IN_USE
//start() the timers to avoid worrying abt having to start()/restart() later
@@ -161,6 +169,25 @@
m_categoryGetDocumentApiTime.start();
m_getDocumentCatergoryTimeAccumulator = 0;
#endif
+
+ //Notes Editor Interface loading
+ QDir dir(NOTES_EDITOR_PLUGIN_PATH);
+ QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME);
+
+ // Create plugin loader.
+ mNotespluginLoader = new QPluginLoader(pluginName);
+
+ if (mNotespluginLoader)
+ {
+ // Load the plugin.
+ mNotespluginLoader->load();
+
+ QObject *plugin = qobject_cast<QObject*> (
+ mNotespluginLoader->instance());
+ mNotesEditor = qobject_cast<NotesEditorInterface*> (plugin);
+ }
+
+ mOnlineQueryAvailable = false;
}
// ---------------------------------------------------------------------------
// SearchProgressiveState::~SearchProgressiveState
@@ -171,10 +198,6 @@
{
delete mAiwMgr;
}
- if (mModel)
- {
- delete mModel;
- }
if (mDocumentLoader)
{
delete mDocumentLoader;
@@ -183,9 +206,10 @@
{
delete mSearchHandlerList.at(i);
}
- if(notesEditor)
+ if (mNotespluginLoader)
{
- delete notesEditor;
+ mNotespluginLoader->unload();
+ delete mNotespluginLoader;
}
}
// ---------------------------------------------------------------------------
@@ -221,7 +245,7 @@
}
case 4:
{
- handler->setCategory("email");
+ handler->setCategory("msg email");
break;
}
case 5:
@@ -273,10 +297,15 @@
}
if (loadSettings)
{
- emit settingsState();
+ emit switchProToSettingsState();
loadSettings = false;
}
setSelectedCategories();
+ if (mOnlineQueryAvailable)
+ {
+ mSearchPanel->setCriteria(mOriginalString);
+ mOnlineQueryAvailable = false;
+ }
}
// ---------------------------------------------------------------------------
// SearchProgressiveState::onExit
@@ -302,8 +331,8 @@
}
if (mListView)
{
- connect(mListView, SIGNAL(activated(const QModelIndex)), this,
- SLOT(openResultitem(const QModelIndex)));
+ connect(mListView, SIGNAL(activated(HbListWidgetItem *)), this,
+ SLOT(openResultitem(HbListWidgetItem *)));
}
if (mSearchPanel)
{
@@ -311,16 +340,10 @@
SLOT(startNewSearch(QString)));
connect(mSearchPanel, SIGNAL(searchOptionsClicked()), this,
SLOT(setSettings()));
- connect(mSearchPanel, SIGNAL(exitClicked()), this,
- SLOT(cancelSearch()));
}
- if (mModel)
- {
- connect(mModel, SIGNAL(rowsInserted(QModelIndex,int,int)), this,
- SLOT(getrowsInserted()));
- connect(mModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), this,
- SLOT(getrowsRemoved()));
- }
+
+ connect(mMainWindow, SIGNAL(viewReady()), this, SLOT(viewReady()));
+
}
// ---------------------------------------------------------------------------
// SearchProgressiveState::deActivateSignals
@@ -338,8 +361,8 @@
}
if (mListView)
{
- disconnect(mListView, SIGNAL(activated(const QModelIndex)), this,
- SLOT(openResultitem(const QModelIndex)));
+ disconnect(mListView, SIGNAL(activated(HbListWidgetItem *)), this,
+ SLOT(openResultitem(HbListWidgetItem *)));
}
if (mSearchPanel)
{
@@ -347,16 +370,8 @@
SLOT(startNewSearch(QString)));
disconnect(mSearchPanel, SIGNAL(searchOptionsClicked()), this,
SLOT(setSettings()));
- disconnect(mSearchPanel, SIGNAL(exitClicked()), this,
- SLOT(cancelSearch()));
}
- if (mModel)
- {
- disconnect(mModel, SIGNAL(rowsInserted(QModelIndex,int,int)), this,
- SLOT(getrowsInserted()));
- disconnect(mModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), this,
- SLOT(getrowsRemoved()));
- }
+ disconnect(mMainWindow, SIGNAL(viewReady()), this, SLOT(viewReady()));
}
// ---------------------------------------------------------------------------
// SearchProgressiveState::onAsyncSearchComplete
@@ -397,19 +412,7 @@
QStringList liststr;
QString secondrow = aDoc->excerpt();
QString firstrow;
- //-------------- html tag creation-------------------
- /* QString htmlTagPre = QString("<u>");
- QString htmlTagPost = QString("</u>");
- int insertpt = secondrow.indexOf(mOriginalString, 0, Qt::CaseInsensitive);
- if (insertpt >= 0)
- {
- secondrow.insert(insertpt, htmlTagPre);
-
- secondrow.insert(insertpt + mOriginalString.length()
- + htmlTagPre.length(), htmlTagPost);
- }
-*/ //--------------------Html Tag Creation completed------------
- QStandardItem* listitem = new QStandardItem();
+ HbListWidgetItem* listitem = new HbListWidgetItem();
if (aDoc->baseAppClass().contains("contact"))
{
@@ -451,7 +454,7 @@
}
else if (aDoc->baseAppClass().contains("video"))
{
- QStringList videoList = filterDoc(aDoc, "Title", "MediaId","Name");
+ QStringList videoList = filterDoc(aDoc, "Title", "MediaId", "Name");
if (videoList.value(0, "").length())
{
firstrow.append(videoList.at(0));
@@ -481,6 +484,20 @@
listitem->setData(imageList.at(1), Qt::UserRole + 2);
}
}
+ else if (aDoc->baseAppClass().contains("msg email"))
+ {
+ qDebug() << "searchui:on Get doc email";
+ QStringList emailList = filterDoc(aDoc, "Sender", "MailBoxId",
+ "FolderId");
+
+ qDebug() << "searchui:recipients" << emailList.at(0) << emailList.at(
+ 1) << emailList.at(2);
+ firstrow.append(emailList.at(0));
+ listitem->setData(emailList.at(1), Qt::UserRole + 2);
+ listitem->setData(emailList.at(2), Qt::UserRole + 3);
+ liststr << firstrow << secondrow;
+ listitem->setData(mIconArray.at(5), Qt::DecorationRole);
+ }
else if (aDoc->baseAppClass().contains("msg"))
{
QStringList msgList = filterDoc(aDoc, "Subject", "Body");
@@ -499,12 +516,7 @@
}
liststr << firstrow << secondrow;
listitem->setData(mIconArray.at(4), Qt::DecorationRole);
- }
- else if (aDoc->baseAppClass().contains("email"))
- {
- firstrow.append(filterDoc(aDoc, "Subject"));
- liststr << firstrow << secondrow;
- }
+ }
else if (aDoc->baseAppClass().contains("calendar"))
{
firstrow.append(filterDoc(aDoc, "Summary"));
@@ -531,8 +543,8 @@
firstrow.append(filterDoc(aDoc, "Name"));
liststr << firstrow;
bool ok;
- listitem->setData(getAppIconFromAppId(TUid::Uid(aDoc->docId().toInt(
- &ok, 16))), Qt::DecorationRole);
+ TRAP_IGNORE(listitem->setData(getAppIconFromAppIdL(TUid::Uid(aDoc->docId().toInt(
+ &ok, 16))), Qt::DecorationRole));
}
else if (aDoc->baseAppClass().contains("bookmark"))
{
@@ -542,6 +554,8 @@
firstrow = "UnKnown";
}
liststr << firstrow << secondrow;
+ listitem->setData(secondrow, Qt::UserRole + 2);
+ listitem->setData(mIconArray.at(8), Qt::DecorationRole);
}
else if (aDoc->baseAppClass().contains("file"))
{
@@ -551,24 +565,12 @@
liststr << firstrow << secondrow;
listitem->setData(mIconArray.at(9), Qt::DecorationRole);
}
- listitem->setData(liststr, Qt::DisplayRole);
+ listitem->setText(firstrow);
+ listitem->setSecondaryText(secondrow);
listitem->setData(aDoc->docId(), Qt::UserRole);
listitem->setData(aDoc->baseAppClass(), Qt::UserRole + 1);
- mModel->appendRow(listitem);
- delete aDoc;
- }
-// ---------------------------------------------------------------------------
-// SearchProgressiveState::getSettingCategory
-// ---------------------------------------------------------------------------
-void SearchProgressiveState::getSettingCategory(int item, bool avalue)
- {
- mSelectedCategory.insert(item, avalue);
- }
-// ---------------------------------------------------------------------------
-// SearchProgressiveState::getrowsInserted
-// ---------------------------------------------------------------------------
-void SearchProgressiveState::getrowsInserted()
- {
+ mListView->addItem(listitem);
+
mResultparser++;
if (mResultparser < mResultcount)
{
@@ -580,42 +582,28 @@
PERF_CAT_GETDOC_ACCUMULATOR_ENDLOG
searchOnCategory(mSearchString);
}
+ delete aDoc;
}
// ---------------------------------------------------------------------------
-// SearchProgressiveState::getrowsRemoved
+// SearchProgressiveState::getSettingCategory
// ---------------------------------------------------------------------------
-void SearchProgressiveState::getrowsRemoved()
+void SearchProgressiveState::getSettingCategory(int item, bool avalue)
{
- if (mModel->rowCount() != 0)
- {
- mModel->removeRow(0);
- }
- else
- {
- mListView->reset();
- if (mOriginalString.length())
- {
- mDatabasecount = 0;
- /*mSearchString = "$prefix(\"";
- mSearchString += mOriginalString;
- mSearchString += "\")";*/
- mSearchString = mOriginalString;
- mSearchString.append('*');
- searchOnCategory(mSearchString);
- }
- }
+ mSelectedCategory.insert(item, avalue);
}
// ---------------------------------------------------------------------------
// SearchProgressiveState::openResultitem
// ---------------------------------------------------------------------------
-void SearchProgressiveState::openResultitem(QModelIndex index)
+void SearchProgressiveState::openResultitem(HbListWidgetItem * item)
{
- QStandardItem* item = mModel->itemFromIndex(index);
+ if (item == NULL)
+ return;PERF_RESULT_ITEM_LAUNCH_TIME_RESTART
QList<QVariant> args;
bool t;
mRequest = NULL;
if (item->data(Qt::UserRole + 1).toString().contains("contact"))
{
+ PERF_RESULT_ITEM_FOR_LAUNCHING("contact")
mRequest = mAiwMgr->create("com.nokia.services.phonebookservices",
"Fetch", "open(int)", false);
@@ -624,6 +612,9 @@
}
else if (item->data(Qt::UserRole + 1).toString().contains("bookmark"))
{
+ PERF_RESULT_ITEM_FOR_LAUNCHING("bookmark")
+ QDesktopServices::openUrl(item->data(Qt::UserRole + 2).toString());
+PERF_RESULT_ITEM_LAUNCH_TIME_ENDLOG ("")
}
else if (item->data(Qt::UserRole + 1).toString().contains("calendar"))
@@ -631,10 +622,10 @@
QDir pluginDir = QDir(QString("z:/resource/qt/plugins/calendar"));
QPluginLoader *calAgandaViewerPluginLoader = new QPluginLoader(
pluginDir.absoluteFilePath(QString(
- "agendaeventviewerplugin.qtplugin")));
+ "agendaeventviewerplugin.qtplugin")));
calAgandaViewerPluginInstance = qobject_cast<
- EventViewerPluginInterface *> (
+ EventViewerPluginInterface *> (
calAgandaViewerPluginLoader->instance());
connect(calAgandaViewerPluginInstance, SIGNAL(viewingCompleted()),
@@ -646,62 +637,64 @@
}
else if (item->data(Qt::UserRole + 1).toString().contains("applications"))
{
- TRAPD(err,
- {LaunchApplicationL(TUid::Uid((item->data(Qt::UserRole)).toString().toInt(&t, 16)));})
- if (err == KErrNone)
- {
- }
+ PERF_RESULT_ITEM_FOR_LAUNCHING("applications")
+ TRAP_IGNORE(LaunchApplicationL(TUid::Uid((item->data(Qt::UserRole)).toString().toInt(&t, 16))));
+ PERF_RESULT_ITEM_LAUNCH_TIME_ENDLOG("")
}
else if (item->data(Qt::UserRole + 1).toString().contains("file"))
{
+ PERF_RESULT_ITEM_FOR_LAUNCHING("file")
+ QString uid = item->data(Qt::UserRole).toString();
+ QFile file(uid);
+ mRequest = mAiwMgr->create(file, false);
+ args << file.fileName();
}
- else if (item->data(Qt::UserRole + 1).toString().contains("video"))
+ else if ((item->data(Qt::UserRole + 1).toString().contains("video"))
+ || (item->data(Qt::UserRole + 1).toString().contains("audio"))
+ || (item->data(Qt::UserRole + 1).toString().contains("image")))
{
- mRequest = mAiwMgr->create("com.nokia.videos", "IVideoView",
- "playMedia(QString)", false);
-
+ PERF_RESULT_ITEM_FOR_LAUNCHING("media")
QString uid = getDrivefromMediaId(
item->data(Qt::UserRole + 2).toString());
uid.append(':');
uid.append(item->data(Qt::UserRole).toString());
- args << uid;
+ QFile file(uid);
+ mRequest = mAiwMgr->create(file, false);
+ args << file.fileName();
}
- else if (item->data(Qt::UserRole + 1).toString().contains("audio"))
- {
- QString uid = getDrivefromMediaId(
- item->data(Qt::UserRole + 2).toString());
- uid.append(':');
- uid.append(item->data(Qt::UserRole).toString());
- mRequest = mAiwMgr->create("musicplayer",
- "com.nokia.symbian.IFileView", "view(QString)", false);
- args << uid;
- }
- else if (item->data(Qt::UserRole + 1).toString().contains("image"))
- {
- QString uid = getDrivefromMediaId(
- item->data(Qt::UserRole + 2).toString());
- uid.append(':');
- uid.append(item->data(Qt::UserRole).toString());
- mRequest = mAiwMgr->create("com.nokia.services.media",
- "com.nokia.symbian.IFileView", "view(QString)", false);
- args << uid;
- }
+
else if (item->data(Qt::UserRole + 1).toString().contains("notes"))
{
- if (!notesEditor)
+ PERF_RESULT_ITEM_FOR_LAUNCHING("notes")
+ if(mNotesEditor)
{
- notesEditor = new NotesEditor(this);
+ mNotesEditor->edit(item->data(Qt::UserRole).toInt());
}
- notesEditor->edit(item->data(Qt::UserRole).toInt());
+ PERF_RESULT_ITEM_LAUNCH_TIME_ENDLOG("")
+ }
+ else if (item->data(Qt::UserRole + 1).toString().contains("msg email"))
+ {
+
+ mRequest = mAiwMgr->create("nmail",
+ "com.nokia.symbian.IEmailMessageView",
+ "viewMessage(QVariant,QVariant,QVariant)", false);
+
+ args << item->data(Qt::UserRole + 2).toULongLong(&t) << item->data(
+ Qt::UserRole + 3).toULongLong(&t) << item->data(Qt::UserRole).toULongLong(&t);
}
else if (item->data(Qt::UserRole + 1).toString().contains("msg"))
{
+ PERF_RESULT_ITEM_FOR_LAUNCHING("msg")
mRequest = mAiwMgr->create("com.nokia.services.hbserviceprovider",
"conversationview", "view(int)", false);
int uid = (item->data(Qt::UserRole)).toInt(&t);
args << uid;
}
+ else if(item->data(Qt::UserRole + 1).toString().contains("links"))
+ {
+ emit launchLink((item->data(Qt::UserRole)).toInt(&t),mOriginalString);
+ }
if (mRequest)
{
connect(mRequest, SIGNAL(requestOk(const QVariant&)), this,
@@ -710,6 +703,7 @@
SLOT(handleError(int,const QString&)));// Connect error handling signal or apply lastError function instead.
mRequest->setArguments(args);
if (!mRequest->send())// Make the request
+
{
qDebug() << "AIW-ERROR: Send failed" << mRequest->lastError();
}
@@ -731,6 +725,7 @@
void SearchProgressiveState::handleOk(const QVariant& var)
{
Q_UNUSED(var);
+PERF_RESULT_ITEM_LAUNCH_TIME_ENDLOG ("")
}
// ---------------------------------------------------------------------------
// SearchProgressiveState::handleError
@@ -743,15 +738,20 @@
// ---------------------------------------------------------------------------
// SearchProgressiveState::createSuggestionLink
// ---------------------------------------------------------------------------
-void SearchProgressiveState::createSuggestionLink(bool aFlag)
+void SearchProgressiveState::createSuggestionLink()
{
- QStandardItem* listitem = new QStandardItem();
- if (!aFlag)
+ QString linkString = QString(hbTrId("txt_search_list_search_for_1").arg(
+ mOriginalString));
+ QMapIterator<int, HbIcon> i(mISprovidersIcon);
+ while (i.hasNext())
{
- QString linkString = QString(hbTrId("txt_search_list_search_for_1").arg(mOriginalString));
- mLinkindex = mModel->rowCount();
- listitem->setData(linkString, Qt::DisplayRole);
- mModel->appendRow(listitem);
+ i.next();
+ HbListWidgetItem* listitem = new HbListWidgetItem();
+ listitem->setText(linkString);
+ listitem->setData(i.key(), Qt::UserRole);
+ listitem->setData(i.value(), Qt::DecorationRole);
+ listitem->setData("links", Qt::UserRole + 1);
+ mListView->addItem(listitem);
}
}
// ---------------------------------------------------------------------------
@@ -761,11 +761,12 @@
{
if (aKeyword.length())
{
- QStandardItem* listitem = new QStandardItem();
+ HbListWidgetItem* listitem = new HbListWidgetItem();
QString noResultMsg = QString("<align=\"center\">" + hbTrId(
"txt_search_list_no_match_found"));
- listitem->setData(noResultMsg, Qt::DisplayRole);
- mModel->appendRow(listitem);
+ listitem->setText(noResultMsg);
+ mListView->addItem(listitem);
+
}
}
// ---------------------------------------------------------------------------
@@ -773,10 +774,7 @@
// ---------------------------------------------------------------------------
void SearchProgressiveState::clear()
{
- if (mModel)
- {
- mModel->removeRows(0, mModel->rowCount());
- }
+ mListView->clear();
}
// ---------------------------------------------------------------------------
// SearchProgressiveState::searchOnCategory
@@ -840,15 +838,20 @@
{
PERF_CAT_API_TIME_RESTART
mSearchHandler->searchAsync(aKeyword, "_aggregate");
+
+ }
+ else
+ {
+ searchOnCategory(mSearchString);
}
}
else if (mDatabasecount >= mTemplist.count())
{
PERF_TOTAL_UI_ENDLOG
- if (mModel->rowCount() == 0 && aKeyword.length() != 0)
+ if (mListView->count() == 0 && aKeyword.length() != 0)
{
noResultsFound(mOriginalString);
- createSuggestionLink(0);
+ createSuggestionLink();
}
return;
}
@@ -864,20 +867,20 @@
{
mSearchHandlerList.at(i)->cancelLastSearch();
}
- if (mModel->rowCount() != 0)
+ if (mListView->count() != 0)
{
clear();
}
- else if (mOriginalString.length())
+ if (mOriginalString.length())
{
mDatabasecount = 0;
mLinkindex = 0;
//Prefix query
- /*mSearchString = "$prefix(\"";
+ mSearchString = "$prefix(\"";
mSearchString += mOriginalString;
- mSearchString += "\")";*/
- mSearchString = mOriginalString;
- mSearchString.append('*');
+ mSearchString += "\")";
+ /*mSearchString = mOriginalString;
+ mSearchString.append('*');*/
searchOnCategory(mSearchString);
}
}
@@ -887,24 +890,9 @@
void SearchProgressiveState::setSettings()
{
mTempSelectedCategory = mSelectedCategory;
- emit settingsState();
- }
-// ---------------------------------------------------------------------------
-// SearchProgressiveState::_customizeGoButton
-// ---------------------------------------------------------------------------
-void SearchProgressiveState::_customizeGoButton(bool avalue)
- {
- if (mSearchPanel)
- {
- if (avalue)
- {
- mSearchPanel->setProgressive(false);
- }
- else
- {
- mSearchPanel->setProgressive(true);
- }
- }
+ if (mOriginalString.length())
+ emit inDeviceSearchQuery(mOriginalString);
+ emit switchProToSettingsState();
}
// ---------------------------------------------------------------------------
// SearchProgressiveState::settingsaction
@@ -961,7 +949,7 @@
case 3://Messages& emails
{
mTemplist.append("msg");
- //mTemplist.append("email");
+ mTemplist.append("email");
break;
}
case 4://Calender& notes
@@ -988,7 +976,7 @@
}
}
}
- if (mTemplist.count() == 8)
+ if (mTemplist.count() == 9)
isrootsearch = true;
if (isrootsearch)
{
@@ -997,84 +985,108 @@
}
}
// ---------------------------------------------------------------------------
-// SearchProgressiveState::cancelSearch
-// ---------------------------------------------------------------------------
-void SearchProgressiveState::cancelSearch()
- {
- for (int i = 0; i < mSearchHandlerList.count(); i++)
- {
- mSearchHandlerList.at(i)->cancelLastSearch();
- }
- }
-// ---------------------------------------------------------------------------
// SearchProgressiveState::getAppIconFromAppId
// ---------------------------------------------------------------------------
-HbIcon SearchProgressiveState::getAppIconFromAppId(TUid auid)
+HbIcon SearchProgressiveState::getAppIconFromAppIdL(TUid auid)
{
HbIcon icon;
- CAknIcon* aknIcon = NULL;
- CFbsBitmap* bitmap = NULL;
- CFbsBitmap* mask = NULL;
- QPixmap pixmap;
- MAknsSkinInstance* skin = AknsUtils::SkinInstance();
- if (skin)
+ RApaLsSession apaLsSession;
+ CleanupClosePushL(apaLsSession);
+ User::LeaveIfError(apaLsSession.Connect());
+ CApaAppServiceInfoArray* skinArray(NULL);
+ TRAPD( err, skinArray = apaLsSession.GetAppServiceOpaqueDataLC(auid, TUid::Uid(0x2002DCF3));
+ if (err == KErrNone && skinArray )
+ {
+ TArray<TApaAppServiceInfo> tmpArray( skinArray->Array() );
+ if ( tmpArray.Count() )
+ {
+ TPtrC8 opaque(tmpArray[0].OpaqueData());
+ const TPtrC16 iconName((TText16*) opaque.Ptr(),(opaque.Length()+1)>>1);
+ icon = HbIcon( XQConversions:: s60DescToQString( iconName ) );
+ }
+ }
+ CleanupStack::PopAndDestroy(skinArray);
+ );
+ if (icon.isNull() || !(icon.size().isValid()))
{
- TRAPD( err,
- {
- AknsUtils::CreateAppIconLC( skin, auid,
- EAknsAppIconTypeList, bitmap, mask );
- CleanupStack::Pop(2); //for trap
- }
- );
- if (err == KErrNone)
+ TSize iconSize(mListViewIconSize.width(), mListViewIconSize.height());
+ CApaMaskedBitmap* apaMaskedBitmap = CApaMaskedBitmap::NewLC();
+ TInt err = apaLsSession.GetAppIcon(auid, iconSize, *apaMaskedBitmap);
+ TInt iconsCount(0);
+ apaLsSession.NumberOfOwnDefinedIcons(auid, iconsCount);
+ QPixmap pixmap;
+ if ((err == KErrNone) && (iconsCount > 0))
{
- TRAPD( err1,
- {aknIcon = CAknIcon::NewL();
- aknIcon->SetBitmap(bitmap);
- aknIcon->SetMask(mask);});
- if (err1 == KErrNone)
- {
- }
- }
- }
- if (aknIcon)
- {
- //need to disable compression to properly convert the bitmap
- AknIconUtils::DisableCompression(aknIcon->Bitmap());
- AknIconUtils::SetSize(aknIcon->Bitmap(), TSize(mListViewIconSize.width(),
- mListViewIconSize.height()),
- EAspectRatioPreservedAndUnusedSpaceRemoved);
- if (aknIcon->Bitmap()->Header().iCompression == ENoBitmapCompression)
- {
- pixmap = fromSymbianCFbsBitmap(aknIcon->Bitmap());
- QPixmap mask = fromSymbianCFbsBitmap(aknIcon->Mask());
- pixmap.setAlphaChannel(mask);
+ fromBitmapAndMaskToPixmapL(apaMaskedBitmap,
+ apaMaskedBitmap->Mask(), pixmap);
+ pixmap = pixmap.scaled(mListViewIconSize,
+ Qt::KeepAspectRatioByExpanding);
+ icon = HbIcon(QIcon(pixmap));
}
else
{
- CFbsBitmap *temp(NULL);
- TRAPD( err,
- {temp = copyBitmapLC(aknIcon->Bitmap());
- pixmap = fromSymbianCFbsBitmap(temp);
- CleanupStack::PopAndDestroy();});
- if (err == KErrNone)
+ HBufC* fileNameFromApparc;
+ TInt err2 = apaLsSession.GetAppIcon(auid, fileNameFromApparc);
+ CleanupStack::PushL(fileNameFromApparc);
+ if (err2 == KErrNone)
{
- TRAPD( err1,
- {temp = copyBitmapLC(aknIcon->Mask());
- QPixmap mask = fromSymbianCFbsBitmap(temp);
- CleanupStack::PopAndDestroy();
- pixmap.setAlphaChannel(mask);});
- if (err1 == KErrNone)
+ QString fileName = XQConversions::s60DescToQString(
+ fileNameFromApparc->Des());
+ if (fileName.contains(QString(".mif")))
{
+ TPtr ptr(fileNameFromApparc->Des());
+ GetPixmapByFilenameL(ptr, mListViewIconSize, pixmap);
+ pixmap = pixmap.scaled(mListViewIconSize,
+ Qt::KeepAspectRatioByExpanding);
+ icon = HbIcon(QIcon(pixmap));
}
}
+ CleanupStack::Pop(fileNameFromApparc);
}
- pixmap = pixmap.scaled(mListViewIconSize, Qt::KeepAspectRatioByExpanding);
- icon = HbIcon(QIcon(pixmap));
+ CleanupStack::PopAndDestroy(apaMaskedBitmap);
}
+ CleanupStack::PopAndDestroy(&apaLsSession);
+
+ if (icon.isNull() || !(icon.size().isValid()))
+ icon = HbIcon("qtg_large_application");
return icon;
}
// ---------------------------------------------------------------------------
+// SearchProgressiveState::GetPixmapByFilenameL
+// ---------------------------------------------------------------------------
+void SearchProgressiveState::GetPixmapByFilenameL(TDesC& fileName,
+ const QSize &size, QPixmap& pixmap)
+ {
+ CFbsBitmap *bitamp(0);
+ CFbsBitmap *mask(0);
+
+ if (AknIconUtils::IsMifFile(fileName))
+ {
+ // SVG icon
+ // SVG always has only one icon
+ TInt bitmapIndex = 0;
+ TInt maskIndex = 1;
+ AknIconUtils::ValidateLogicalAppIconId(fileName, bitmapIndex,
+ maskIndex);
+
+ AknIconUtils::CreateIconLC(bitamp, mask, fileName, bitmapIndex,
+ maskIndex);
+ }
+
+ AknIconUtils::DisableCompression(bitamp);
+ AknIconUtils::SetSize(bitamp, TSize(size.width(), size.height()),
+ EAspectRatioPreservedAndUnusedSpaceRemoved);
+
+ AknIconUtils::DisableCompression(mask);
+ AknIconUtils::SetSize(mask, TSize(size.width(), size.height()),
+ EAspectRatioPreservedAndUnusedSpaceRemoved);
+
+ fromBitmapAndMaskToPixmapL(bitamp, mask, pixmap);
+
+ // bitmap and icon, AknsUtils::CreateIconLC doesn't specify the order
+ CleanupStack::Pop(2);
+ }
+// ---------------------------------------------------------------------------
// SearchProgressiveState::TDisplayMode2Format
// ---------------------------------------------------------------------------
QImage::Format SearchProgressiveState::TDisplayMode2Format(TDisplayMode mode)
@@ -1147,6 +1159,31 @@
return bmp;
}
// ---------------------------------------------------------------------------
+// SearchProgressiveState::fromBitmapAndMaskToPixmapL
+// ---------------------------------------------------------------------------
+void SearchProgressiveState::fromBitmapAndMaskToPixmapL(
+ CFbsBitmap* fbsBitmap, CFbsBitmap* fbsMask, QPixmap& pixmap)
+ {
+ if (fbsBitmap->Header().iCompression == ENoBitmapCompression)
+ {
+ pixmap = fromSymbianCFbsBitmap(fbsBitmap);
+ QPixmap mask = fromSymbianCFbsBitmap(fbsMask);
+ pixmap.setAlphaChannel(mask);
+ }
+ else
+ { // we need special handling for icons in 9.2 (NGA)
+ // let's hope that in future it will be in QT code
+ CFbsBitmap *temp(NULL);
+ temp = copyBitmapLC(fbsBitmap);
+ pixmap = fromSymbianCFbsBitmap(temp);
+ CleanupStack::PopAndDestroy();
+ temp = copyBitmapLC(fbsMask);
+ QPixmap mask = fromSymbianCFbsBitmap(temp);
+ CleanupStack::PopAndDestroy();
+ pixmap.setAlphaChannel(mask);
+ }
+ }
+// ---------------------------------------------------------------------------
// SearchProgressiveState::filterDoc
// ---------------------------------------------------------------------------
QString SearchProgressiveState::filterDoc(const QCPixDocument* aDoc,
@@ -1281,6 +1318,7 @@
CleanupStack::PopAndDestroy(&appArcSession);
}
CleanupStack::PopAndDestroy(&wsSession);
+PERF_RESULT_ITEM_LAUNCH_TIME_ENDLOG ("")
}
// ---------------------------------------------------------------------------
// SearchProgressiveState::_viewingCompleted
@@ -1289,4 +1327,30 @@
{
if (calAgandaViewerPluginInstance)
calAgandaViewerPluginInstance->deleteLater();
+PERF_RESULT_ITEM_LAUNCH_TIME_ENDLOG ("")
}
+// ---------------------------------------------------------------------------
+// SearchProgressiveState::viewReady
+// ---------------------------------------------------------------------------
+void SearchProgressiveState::viewReady()
+ {
+ if (hbApp)
+ {
+ if (hbApp->activateReason() == Hb::ActivationReasonActivity)
+ {
+ QVariantHash params = hbApp->activateParams();
+ QString searchKey = params.value("query").toString();
+ if (searchKey.length() > 0)
+ mSearchPanel->setCriteria(searchKey);
+ }
+ }PERF_APP_LAUNCH_END("SearchAppplication View is ready");
+ }
+void SearchProgressiveState::slotOnlineQuery(QString str)
+ {
+ mOriginalString = str;
+ mOnlineQueryAvailable = true;
+ }
+void SearchProgressiveState::slotISProvidersIcon(int id, HbIcon icon)
+ {
+ mISprovidersIcon.insert(id, icon);
+ }
--- a/searchui/stateproviders/searchstateprovider/src/searchsettingsstate.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/src/searchsettingsstate.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -46,6 +46,9 @@
connect(mWidget, SIGNAL(selectedItemCategory(int, bool)), this,
SLOT(getItemCategory(int, bool)));
+
+ connect(mWidget, SIGNAL(ISProvidersIcon(HbIcon, int)), this,
+ SLOT(slotISProvidersIcon(HbIcon, int)));
}
// ---------------------------------------------------------------------------
@@ -59,6 +62,15 @@
}
// ---------------------------------------------------------------------------
+// SearchSettingsState::slotISProvidersIcon
+// ---------------------------------------------------------------------------
+//
+void SearchSettingsState::slotISProvidersIcon(HbIcon icon, int id)
+ {
+ emit publishISProviderIcon(id,icon);
+ }
+
+// ---------------------------------------------------------------------------
// SearchSettingsState::getItemCategory
// ---------------------------------------------------------------------------
//
@@ -74,19 +86,21 @@
{
qDebug() << "search:SearchSettingsState::onEntry";
QState::onEntry(event);
+ emit settingslaunched();
if (minitialCount)
{
mWidget->loadBaseSettings();
mWidget->loadDeviceSettings();
+ mWidget->loadIS();
isInternetOn();
minitialCount = false;
- emit backEventTriggered();
+ // isInternetOn();
+ //emit backEventTriggered();
}
else
{
-
mWidget->launchSettingWidget();
- }
+ }
}
// ---------------------------------------------------------------------------
// SearchSettingsState::onExit
@@ -103,7 +117,6 @@
//
void SearchSettingsState::handleBackEvent(bool aStatus)
{
- emit backEventTriggered();
if (mWidget)
{
isInternetOn();
@@ -118,10 +131,10 @@
{
if (mWidget->isInternetSearchOptionSelected())
{
- emit customizeGoButton(true);
+ emit switchToOnlineState();
}
else
{
- emit customizeGoButton(false);
+ emit switchToProState();
}
}
--- a/searchui/stateproviders/searchstateprovider/src/searchstateprovider.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/src/searchstateprovider.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -19,6 +19,7 @@
#include "searchprogressivestate.h"
#include "searchinitstate.h"
#include "searchsettingsstate.h"
+#include "searchonlinestate.h"
#include <qstate.h>
#include <qdebug.h>
@@ -31,6 +32,8 @@
"search.nokia.com/state/wizardprogressivestate";
const char wizardSettingStateUri[] =
"search.nokia.com/state/wizardsettingstate";
+const char wizardOnlineStateUri[] =
+ "search.nokia.com/state/wizardonlinestate";
// ---------------------------------------------------------------------------
// searchStateProvider::searchStateProvider()
@@ -59,6 +62,10 @@
{
return new SearchInitState();
}
+ else if (uri == wizardOnlineStateUri)
+ {
+ return new SearchOnlineState();
+ }
qDebug() << "SEARCH: No state found for mUri: " << uri;
return NULL;
--- a/searchui/stateproviders/searchstateprovider/src/settingswidget.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/src/settingswidget.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -38,6 +38,7 @@
#include <qsqldatabase.h>
#include <qsqlquery.h>
#include <cpixcontentinfocommon.h>
+#include "onlinehandler.h"
const char *DELIMETER_DOCML = ":/xml/delimeterscreen.docml";
const char *DIALOG = "dialog";
const char *DATAFORM = "dataForm";
@@ -48,8 +49,10 @@
//----------------------------------------------------------------------------------------------------------------------------
SettingsWidget::SettingsWidget() :
signalMapper(NULL), popup(NULL), mDocumentLoader(NULL), dataform(NULL),
- mModel(NULL),mSelectedScope(0),mSelectedProvider(0),comboBox(NULL)
+ mModel(NULL), mSelectedScope(0), mSelectedProvider(0), comboBox(
+ NULL), mInternetHandler(NULL)
{
+ setSettingsFilePath();
for (int i = 0; i < 8; i++)
{
mDeviceMapping.append(false);
@@ -61,6 +64,7 @@
mchangestate = true;
mInstialize = true;
isInternetSelected = false;
+
storeDefaultSettings();
}
//----------------------------------------------------------------------------------------------------------------------------
@@ -72,7 +76,7 @@
bool ok = false;
if (!mDocumentLoader)
{
- mDocumentLoader = new HbDocumentLoader();
+ mDocumentLoader = new HbDocumentLoader();
mDocumentLoader->load(DELIMETER_DOCML, &ok);
}
QGraphicsWidget *widget = NULL;
@@ -132,17 +136,16 @@
HbDataFormModelItem::ComboBoxItem, hbTrId(
"txt_search_info_select_search_scope"));
- themeComboGeneral->setContentWidgetData(QString("items"), mCategoryList);
+ themeComboGeneral->setContentWidgetData("items", mCategoryList);
- themeComboGeneral->setContentWidgetData(QString("currentIndex"),
- mSelectedScope);
+ themeComboGeneral->setContentWidgetData("currentIndex", mSelectedScope);
QModelIndex index = mModel->indexFromItem(themeComboGeneral);
- HbDataFormViewItem *formItem = static_cast<HbDataFormViewItem *> (dataform->itemByIndex(index));
+ HbDataFormViewItem *formItem =
+ static_cast<HbDataFormViewItem *> (dataform->itemByIndex(index));
- comboBox =
- static_cast<HbComboBox*> (formItem->dataItemContentWidget());
+ comboBox = static_cast<HbComboBox*> (formItem->dataItemContentWidget());
q_currentIndexChanged(mSelectedScope);
@@ -161,7 +164,7 @@
mModel->removeItem(mModelItemList.at(i));
}
mModelItemList.clear();
- // int ret = mModel->rowCount();
+ // int ret = mModel->rowCount();
if (!avalue) //device category creation
{
isInternetSelected = false;
@@ -175,7 +178,9 @@
mModelItemList.append(mModelItem);
QModelIndex index = mModel->indexFromItem(mModelItem);
- HbDataFormViewItem *formItem = static_cast<HbDataFormViewItem *> (dataform->itemByIndex(index));
+ HbDataFormViewItem *formItem =
+ static_cast<HbDataFormViewItem *> (dataform->itemByIndex(
+ index));
checkboxitem
= static_cast<HbCheckBox*> (formItem->dataItemContentWidget());
@@ -201,25 +206,36 @@
HbDataFormModelItem* mModelItem = mModel->appendDataFormItem(
HbDataFormModelItem::RadioButtonListItem);
mModelItemList.append(mModelItem);
+ QStringList internetCategoryList;
+ QMapIterator<int, QString> i(mServiceProviders);
+ int selectedindex = 0;
+ int Iterator = 0;
+ while (i.hasNext())
+ {
+ i.next();
+ if (i.key() == mSelectedProvider)
+ selectedindex = Iterator;
+ Iterator++;
+ internetCategoryList.append(i.value());
+ qDebug() << i.value();
+ }
mModelItem->setContentWidgetData("items", internetCategoryList);
+ mModelItem->setContentWidgetData("previewMode",
+ HbRadioButtonList::NoPreview);
+
+ mModelItem->setContentWidgetData("selected", selectedindex);
+
QModelIndex index = mModel->indexFromItem(mModelItem);
- HbDataFormViewItem *formItem = static_cast<HbDataFormViewItem *> (dataform->itemByIndex(index));
-
+ HbDataFormViewItem *formItem =
+ static_cast<HbDataFormViewItem *> (dataform->itemByIndex(
+ index));
mradiolist
= static_cast<HbRadioButtonList*> (formItem->dataItemContentWidget());
- mradiolist->setPreviewMode(HbRadioButtonList::NoPreview);
-
- mradiolist->setSelected(mSelectedProvider);
connect(mradiolist, SIGNAL(itemSelected(int)), this,
- SLOT(q_itemSelected(int)));
-
- for (int i = 0; i < mActions.count(); i++)
- popup->removeAction(mActions.at(i));
- popup->addActions(mActions);
- popup->removeAction(mActions.at(0));
+ SLOT(slotitemSelected(int)));
}
}
//----------------------------------------------------------------------------------------------------------------------------
@@ -229,8 +245,6 @@
void SettingsWidget::preparecategories()
{
// read form database
-
-
QString mConnectionName("cpixcontentinfo.sq");
QString mDatabaseName("c:\\Private\\2001f6fb\\cpixcontentinfo.sq");
@@ -254,24 +268,24 @@
{
mCategoryDbMapping.insert(category_name, true);
}
- qDebug() <<"string db= "<<category_name;
+ qDebug() << "string db= " << category_name;
}
- db.close();
-
- /* mCategoryDbMapping.insert("Contacts", true);
- mCategoryDbMapping.insert("Audios", true);
- mCategoryDbMapping.insert("Images", true);
- mCategoryDbMapping.insert("Videos", true);
- mCategoryDbMapping.insert("Messages", true);
- mCategoryDbMapping.insert("email", true);
- mCategoryDbMapping.insert("Calendar", true);
- mCategoryDbMapping.insert("Notes", true);
- mCategoryDbMapping.insert("Applications", true);
- mCategoryDbMapping.insert("Bookmarks", true);
- mCategoryDbMapping.insert("Files", true); */
-
- // mCategoryDbMapping.insert("email", true); // to remove once email starts working
-
+ db.close();
+
+ /* mCategoryDbMapping.insert("Contacts", true);
+ mCategoryDbMapping.insert("Audios", true);
+ mCategoryDbMapping.insert("Images", true);
+ mCategoryDbMapping.insert("Videos", true);
+ mCategoryDbMapping.insert("Messages", true);
+ mCategoryDbMapping.insert("email", true);
+ mCategoryDbMapping.insert("Calendar", true);
+ mCategoryDbMapping.insert("Notes", true);
+ mCategoryDbMapping.insert("Applications", true);
+ mCategoryDbMapping.insert("Bookmarks", true);
+ mCategoryDbMapping.insert("Files", true); */
+
+ // mCategoryDbMapping.insert("email", true); // to remove once email starts working
+
mDeviceListDisplay.append(hbTrId("txt_search_list_select_all"));
mDeviceMapping.insert(0, true);
@@ -281,9 +295,8 @@
mDeviceListDisplay.append(hbTrId("txt_search_list_contatcs"));
}
- if (mCategoryDbMapping.value("Audios")
- || mCategoryDbMapping.value("Images") || mCategoryDbMapping.value(
- "Videos"))
+ if (mCategoryDbMapping.value("Audios") || mCategoryDbMapping.value(
+ "Images") || mCategoryDbMapping.value("Videos"))
{
mDeviceListDisplay.append(hbTrId("txt_search_list_media"));
mDeviceMapping.insert(2, true);
@@ -320,10 +333,17 @@
mDeviceListDisplay.append(hbTrId("txt_search_list_all_other_files"));
mDeviceMapping.insert(7, true);
}
- internetCategoryList = (QStringList());
+ // internetCategoryList = (QStringList() << "Google" << "Bing" << "Yahoo");
- mCategoryList = (QStringList() << hbTrId("txt_search_list_device")
- << hbTrId("txt_search_list_internet"));
+ if (mServiceProviders.count())
+ {
+ mCategoryList = (QStringList() << hbTrId("txt_search_list_device")
+ << hbTrId("txt_search_list_internet"));
+ }
+ else
+ {
+ mCategoryList = (QStringList() << hbTrId("txt_search_list_device"));
+ }
}
//----------------------------------------------------------------------------------------------------------------------------
@@ -342,6 +362,7 @@
mModelItemList.clear();
mActions.clear();
delete mDocumentLoader;
+ delete mInternetHandler;
//delete popup;
}
//----------------------------------------------------------------------------------------------------------------------------
@@ -374,12 +395,15 @@
noItemSelected = false;
}
}
- for (int i = 0; i < mActions.count(); i++)
- popup->removeAction(mActions.at(i));
- popup->addActions(mActions);
- if (noItemSelected)
+ if (!isInternetSelected)
{
- popup->removeAction(mActions.at(0));
+ for (int i = 0; i < mActions.count(); i++)
+ popup->removeAction(mActions.at(i));
+ popup->addActions(mActions);
+ if (noItemSelected)
+ {
+ popup->removeAction(mActions.at(0));
+ }
}
}
//----------------------------------------------------------------------------------------------------------------------------
@@ -465,7 +489,8 @@
void SettingsWidget::storeSettingsToiniFile()
{
- QSettings appSettings("search.ini", QSettings::IniFormat);
+ QSettings appSettings(mSettingFileName, QSettings::IniFormat);
+ isInternetSelected ? (mSelectedScope = 1) : (mSelectedScope = 0);
appSettings.setValue("selectedcategory", mSelectedScope);
appSettings.setValue("devicecount", mDeviceCategoryRefList.count());
if (!isInternetSelected)
@@ -495,8 +520,7 @@
}
}
- appSettings.setValue("internetcount", internetCategoryList.count());
- appSettings.setValue("selectedprovider", mSelectedProvider);
+
}
//----------------------------------------------------------------------------------------------------------------------------
//void SettingsWidget::loadBaseSettings()
@@ -504,26 +528,10 @@
//----------------------------------------------------------------------------------------------------------------------------
void SettingsWidget::loadBaseSettings()
{
- QSettings appSettings("search.ini", QSettings::IniFormat);
- int value;
- if (!(appSettings.contains("selectedcategory")))
- {
- value = 0;
- }
- else
- {
- value = appSettings.value("selectedcategory").toInt();
- }
- mSelectedScope = value;
- if (mSelectedScope)
- {
- isInternetSelected = true;
- }
- else
- {
- isInternetSelected = false;
- }
- mSelectedProvider = appSettings.value("selectedprovider").toInt();
+ QSettings appSettings(mSettingFileName, QSettings::IniFormat);
+ mSelectedScope = appSettings.value("selectedcategory", 0).toInt();
+ mSelectedScope ? (isInternetSelected = true) : (isInternetSelected
+ = false);
}
//----------------------------------------------------------------------------------------------------------------------------
@@ -532,22 +540,16 @@
//----------------------------------------------------------------------------------------------------------------------------
void SettingsWidget::loadDeviceSettings()
{
- QSettings appSettings("search.ini", QSettings::IniFormat);
+ QSettings appSettings(mSettingFileName, QSettings::IniFormat);
int value;
if (!isInternetSelected)
{
int j = 0;
for (int i = 0; i < mDeviceCategoryRefList.count(); i++)
{
- if (!(appSettings.contains(mDeviceCategoryRefList.at(i))))
- {
- value = 1;
- }
- else
- {
- value
- = appSettings.value(mDeviceCategoryRefList.at(i)).toInt();
- }
+ value
+ = appSettings.value(mDeviceCategoryRefList.at(i), 1).toInt();
+
if (mDeviceMapping.count() && mDeviceCheckBoxList.count()
&& mDeviceMapping.at(i))
{
@@ -561,14 +563,10 @@
}
j++;
}
- if (value) // get the setting before ui preparation
- {
- emit selectedItemCategory(i, true);
- }
- else
- {
- emit selectedItemCategory(i, false);
- }
+ value
+ ? (emit selectedItemCategory(i, true))
+ : (emit selectedItemCategory(i, false));
+
}
}
}
@@ -588,16 +586,56 @@
//----------------------------------------------------------------------------------------------------------------------------
void SettingsWidget::storeDefaultSettings()
{
- QSettings appSettings("search.ini", QSettings::IniFormat);
+ QSettings appSettings(mSettingFileName, QSettings::IniFormat);
if (!appSettings.contains("selectedcategory")) // change the settings for the first time only
{
mSelectedScope = 0;
- mSelectedProvider = 0;
appSettings.setValue("selectedcategory", mSelectedScope);
appSettings.setValue("devicecount", mDeviceCategoryRefList.count());
for (int i = 0; i < mDeviceCategoryRefList.count(); i++)
appSettings.setValue(mDeviceCategoryRefList.at(i), 1);
- appSettings.setValue("internetcount", internetCategoryList.count());
- appSettings.setValue("selectedprovider", mSelectedProvider);
}
}
+void SettingsWidget::slotproviderDetails(QString name, HbIcon icon, int id)
+ {
+ mServiceProviders.insert(id, name);
+ emit ISProvidersIcon(icon, id);
+ }
+void SettingsWidget::slotdefaultProvider(const int value)
+ {
+ mSelectedProvider = value;
+ }
+void SettingsWidget::slotitemSelected(int value)
+ {
+ QMapIterator<int, QString> i(mServiceProviders);
+ int selectedindex = 0;
+ while (i.hasNext())
+ {
+ i.next();
+ if (selectedindex == value)
+ {
+ mInternetHandler->setDefaultProvider(i.key());
+ break;
+ }
+ selectedindex++;
+ }
+ }
+void SettingsWidget::setSettingsFilePath()
+ {
+ mSettingFileName.append(QDir::currentPath());
+ mSettingFileName.append(QString("/searchsettings.ini"));
+ }
+void SettingsWidget::loadIS()
+ {
+ if (!mInternetHandler)
+ {
+ mInternetHandler = new OnlineHandler();
+ connect(mInternetHandler,
+ SIGNAL(providerDetails(QString, HbIcon, int)), this,
+ SLOT(slotproviderDetails(QString, HbIcon, int)));
+
+ connect(mInternetHandler, SIGNAL(defaultProvider(const int)), this,
+ SLOT(slotdefaultProvider(const int)));
+ mInternetHandler->readSettings();
+ }
+ }
--- a/searchui/stateproviders/searchstateprovider/tsrc/t_searchstateprovider/inc/t_searchstateprovider.h Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/tsrc/t_searchstateprovider/inc/t_searchstateprovider.h Thu Jul 22 16:34:05 2010 +0100
@@ -17,7 +17,6 @@
#include <QtTest/QtTest>
#include "searchstateprovider.h"
-#include "hsistateprovider.h"
class HbMainWindow;
class HbAbstractViewItem;
@@ -58,22 +57,16 @@
void testopenResultitem();
void testgetSettingCategory();
void testsetSettings();
- void teststartNewSearch();
- void test_customizeGoButton();
+ void teststartNewSearch();
void testsettingsaction();
void testcancelSearch();
- void testgetrowsInserted();
- void testgetrowsRemoved();
void testhandleOkError();
- void test_viewingCompleted();
- void testsearchOnCategory();
void testclear();
void testnoResultsFound();
void testcreateSuggestionLink();
void testTDisplayMode2Format();
- void testfromSymbianCFbsBitmap();
void testgetDrivefromMediaId();
- void testLaunchApplicationL();
+ void testLaunchApplication();
void testfilterDoc();
/**
@@ -128,27 +121,12 @@
* @return True if state was created successfully, false otherwise.
* @since S60 ?S60_version.
*/
- bool verifyStateCreation(const QString& uri);
-
- /**
- * Helper method testing existence of state
- *
- * @param states List of states.
- * @param library Name of the library/plugin that contains the state.
- * @param uri Unique state identificator.
- *
- * @return True if state was found, false otherwise.
- * @since S60 ?S60_version.
- */
- bool findStateInStateList(const QList<HsStateToken>& states,
- const QString& library, const QString& uri);
-
- //void setContentServiceProperty(QState* state);
+ bool verifyStateCreation(const QString& uri);
HbMainWindow* mainWindow();
private:
- // FtuContentService* mFtuContentService;
+
HbMainWindow *mMainWindow;
};
--- a/searchui/stateproviders/searchstateprovider/tsrc/t_searchstateprovider/src/t_searchinitstate.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/tsrc/t_searchstateprovider/src/t_searchinitstate.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#include "t_searchstateprovider.h"
#include "searchinitstate.h"
// ---------------------------------------------------------------------------
--- a/searchui/stateproviders/searchstateprovider/tsrc/t_searchstateprovider/src/t_searchprogressivestate.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/tsrc/t_searchstateprovider/src/t_searchprogressivestate.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -1,24 +1,9 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#include "t_searchstateprovider.h"
#include "searchprogressivestate.h"
#include <qsignalspy.h>
#include "indevicehandler.h"
-#include <qstandarditemmodel.h>
+#include <hblistwidget.h>
+#include <hblistwidgetitem.h>
#include <fbs.h>
#include <AknsUtils.h>
#include <bitdev.h>
@@ -45,7 +30,6 @@
QVERIFY(progressiveState->mListView);
QVERIFY(progressiveState->mDocumentLoader);
QVERIFY(progressiveState->mSearchPanel);
- QVERIFY(progressiveState->mModel);
//QVERIFY(progressiveState->mSearchHandler);
delete progressiveState;
@@ -85,6 +69,7 @@
progressiveState->getSettingCategory(6, true);
progressiveState->getSettingCategory(7, true);
progressiveState->setSelectedCategories();
+ QVERIFY(progressiveState->mTemplist.count());
delete progressiveState;
}
void SearchStateProviderTest::testgetAppIconFromAppId()
@@ -112,16 +97,22 @@
SearchProgressiveState* progressiveState = new SearchProgressiveState();
QEvent *event = new QEvent(QEvent::None);
progressiveState->onEntry(event);
- progressiveState->mSearchHandler
- = progressiveState->mSearchHandlerList.at(1);
- progressiveState->onAsyncSearchComplete(-1, 10);
- QCOMPARE(progressiveState->mResultcount,0);
+ progressiveState->getSettingCategory(0, true);
+ progressiveState->getSettingCategory(1, true);
+ progressiveState->getSettingCategory(2, true);
+ progressiveState->getSettingCategory(3, true);
+ progressiveState->getSettingCategory(4, true);
+ progressiveState->getSettingCategory(5, true);
+ progressiveState->getSettingCategory(6, true);
+ progressiveState->getSettingCategory(7, true);
- progressiveState->onAsyncSearchComplete(0, -1);
- QCOMPARE(progressiveState->mResultcount,0);
- progressiveState->mSearchHandler->searchAsync("txt", "_aggregate");
- QTest::qWait(100);
- //QCOMPARE(progressiveState->mResultcount,10);
+ progressiveState->mSearchHandler
+ = progressiveState->mSearchHandlerList.at(2);
+
+
+ progressiveState->mSearchHandler->searchAsync("jpg*", "_aggregate");
+ QTest::qWait(2000);
+ QVERIFY(progressiveState->mResultcount);
delete progressiveState;
// delete wind;
@@ -139,14 +130,14 @@
progressiveState->onEntry(event);
// progressiveState->mSearchHandler = progressiveState->mSearchHandlerList.at(1);
progressiveState->onGetDocumentComplete(0, NULL);
- QCOMPARE(progressiveState->mModel->rowCount(),0);
+ QCOMPARE(progressiveState->mListView->count(),0);
progressiveState->onGetDocumentComplete(-1, NULL);
- QCOMPARE(progressiveState->mModel->rowCount(),0);
- progressiveState->startNewSearch("d");
+ QCOMPARE(progressiveState->mListView->count(),0);
+ progressiveState->startNewSearch("contact");
QTest::qWait(2000);
- int i = progressiveState->mModel->rowCount();
- QVERIFY(progressiveState->mModel->rowCount());
+ int i = progressiveState->mListView->count();
+ QVERIFY(progressiveState->mListView->count());
delete progressiveState;
// delete wind;
}
@@ -159,14 +150,37 @@
SearchProgressiveState* progressiveState = new SearchProgressiveState();
QEvent *event = new QEvent(QEvent::None);
- progressiveState->mSelectedCategory.insert(1, true);
+ progressiveState->getSettingCategory(0, true);
+ progressiveState->getSettingCategory(1, true);
+ progressiveState->getSettingCategory(2, true);
+ progressiveState->getSettingCategory(3, true);
+ progressiveState->getSettingCategory(4, true);
+ progressiveState->getSettingCategory(5, true);
+ progressiveState->getSettingCategory(6, true);
+ progressiveState->getSettingCategory(7, true);
+
progressiveState->onEntry(event);
- progressiveState->startNewSearch("a");
- QTest::qWait(100);
- progressiveState->cancelSearch();
+ progressiveState->startNewSearch("Creat");
+ QTest::qWait(2000);
+
//code for getting the model index from model
- QModelIndex index = progressiveState->mModel->index(0, 0);
- progressiveState->openResultitem(index);
+ /*QModelIndex index = progressiveState->mModel->index(0, 0);
+ progressiveState->openResultitem(index);
+ QTest::qWait(200);
+ progressiveState->startNewSearch("jpg");
+ QTest::qWait(200);
+ progressiveState->cancelSearch();
+ //code for getting the model index from model
+ index = progressiveState->mModel->index(0, 0);
+ progressiveState->openResultitem(index);
+
+ QTest::qWait(200);
+ progressiveState->startNewSearch("note");
+ QTest::qWait(200);
+ progressiveState->cancelSearch();
+ //code for getting the model index from model
+ index = progressiveState->mModel->index(3, 0);
+ progressiveState->openResultitem(index);*/
delete progressiveState;
// delete wind;
}
@@ -181,8 +195,15 @@
QEvent *event = new QEvent(QEvent::None);
progressiveState->onEntry(event);
+ progressiveState->getSettingCategory(0, false);
+ progressiveState->getSettingCategory(1, false);
+ progressiveState->getSettingCategory(2, false);
+ progressiveState->getSettingCategory(4, false);
+ progressiveState->getSettingCategory(5, false);
+ progressiveState->getSettingCategory(6, false);
+ progressiveState->getSettingCategory(7, false);
progressiveState->getSettingCategory(3, true);
- QCOMPARE(progressiveState->mSelectedCategory.count(),1);
+ QCOMPARE(progressiveState->mSelectedCategory.count(),8);
delete progressiveState;
// delete wind;
}
@@ -204,20 +225,19 @@
{
SearchProgressiveState* progressiveState = new SearchProgressiveState();
QEvent *event = new QEvent(QEvent::None);
- progressiveState->mSelectedCategory.insert(5, true);
progressiveState->onEntry(event);
- progressiveState->startNewSearch("d");
- delete progressiveState;
- }
-void SearchStateProviderTest::test_customizeGoButton()
- {
- SearchProgressiveState* progressiveState = new SearchProgressiveState();
- QEvent *event = new QEvent(QEvent::None);
- progressiveState->onEntry(event);
- progressiveState->_customizeGoButton(true);
- QVERIFY(!(progressiveState->mSearchPanel->isProgressive()));
- progressiveState->_customizeGoButton(false);
- QVERIFY(progressiveState->mSearchPanel->isProgressive());
+ progressiveState->getSettingCategory(0, true);
+ progressiveState->getSettingCategory(1, true);
+ progressiveState->getSettingCategory(2, true);
+ progressiveState->getSettingCategory(3, true);
+ progressiveState->getSettingCategory(4, true);
+ progressiveState->getSettingCategory(5, true);
+ progressiveState->getSettingCategory(6, true);
+ progressiveState->getSettingCategory(7, true);
+
+ progressiveState->startNewSearch("jpg");
+ QTest::qWait(2000);
+ QVERIFY(progressiveState->mListView->count());
delete progressiveState;
}
// ---------------------------------------------------------------------------
@@ -234,7 +254,6 @@
QCOMPARE(progressiveState->mResultcount, 0);
progressiveState->settingsaction(true);
QTest::qWait(50);
- progressiveState->cancelSearch();
QCOMPARE(progressiveState->mResultcount, 0);
delete progressiveState;
}
@@ -249,18 +268,10 @@
progressiveState->onEntry(event);
progressiveState->getSettingCategory(5, true);
progressiveState->startNewSearch("d");
- progressiveState->cancelSearch();
delete progressiveState;
}
-void SearchStateProviderTest::testgetrowsInserted()
- {
- }
-void SearchStateProviderTest::testgetrowsRemoved()
- {
-
- }
void SearchStateProviderTest::testhandleOkError()
{
SearchProgressiveState* progressiveState = new SearchProgressiveState();
@@ -272,17 +283,7 @@
progressiveState->handleError(ret, QString());
delete progressiveState;
}
-void SearchStateProviderTest::test_viewingCompleted()
- {
- }
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-//
-void SearchStateProviderTest::testsearchOnCategory()
- {
-
- }
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
@@ -293,9 +294,9 @@
progressiveState->onEntry(event);
progressiveState->noResultsFound("aaa");
- QCOMPARE(progressiveState->mModel->rowCount(),1);
+ QCOMPARE(progressiveState->mListView->count(),1);
progressiveState->clear();
- QCOMPARE(progressiveState->mModel->rowCount(),0);
+ QCOMPARE(progressiveState->mListView->count(),0);
delete progressiveState;
}
@@ -310,10 +311,10 @@
progressiveState->onEntry(event);
progressiveState->noResultsFound(NULL);
- QCOMPARE(progressiveState->mModel->rowCount(),0);
+ QCOMPARE(progressiveState->mListView->count(),0);
progressiveState->noResultsFound("aaa");
- QCOMPARE(progressiveState->mModel->rowCount(),1);
+ QCOMPARE(progressiveState->mListView->count(),1);
delete progressiveState;
}
@@ -325,12 +326,9 @@
{
SearchProgressiveState* progressiveState = new SearchProgressiveState();
QEvent *event = new QEvent(QEvent::None);
- progressiveState->onEntry(event);
-
- progressiveState->createSuggestionLink(true);
- QCOMPARE(progressiveState->mModel->rowCount(), 0);
- progressiveState->createSuggestionLink(false);
- QCOMPARE(progressiveState->mModel->rowCount(), 1);
+ progressiveState->onEntry(event);
+ progressiveState->createSuggestionLink();
+ QCOMPARE(progressiveState->mListView->count(), 1);
delete progressiveState;
}
void SearchStateProviderTest::testTDisplayMode2Format()
@@ -361,10 +359,10 @@
delete progressiveState;
}
-void SearchStateProviderTest::testfromSymbianCFbsBitmap()
- {
- }
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
void SearchStateProviderTest::testgetDrivefromMediaId()
{
SearchProgressiveState* progressiveState = new SearchProgressiveState();
@@ -379,20 +377,21 @@
progressiveState->mSelectedCategory.insert(2, true);
progressiveState->onEntry(event);
progressiveState->startNewSearch("3gpp");
- QTest::qWait(200);
- QModelIndex index = progressiveState->mModel->index(1, 0);
- QStandardItem* item = progressiveState->mModel->itemFromIndex(index);
+ QTest::qWait(200);
+
+ HbListWidgetItem* item = progressiveState->mListView->item(0);
+ if(item)
QString uid = progressiveState->getDrivefromMediaId(item->data(
Qt::UserRole + 2).toString());
//QVERIFY(uid.length());
delete progressiveState;
}
-void SearchStateProviderTest::testLaunchApplicationL()
+void SearchStateProviderTest::testLaunchApplication()
{
SearchProgressiveState* progressiveState = new SearchProgressiveState();
QEvent *event = new QEvent(QEvent::None);
progressiveState->onEntry(event);
- progressiveState->LaunchApplicationL(TUid::Uid(0x20011383));
+ // progressiveState->LaunchApplicationL(TUid::Uid(0x20011383));
delete progressiveState;
}
// ---------------------------------------------------------------------------
--- a/searchui/stateproviders/searchstateprovider/tsrc/t_searchstateprovider/src/t_searchsettingsstate.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/tsrc/t_searchstateprovider/src/t_searchsettingsstate.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#include "t_searchstateprovider.h"
#include "searchsettingsstate.h"
--- a/searchui/stateproviders/searchstateprovider/tsrc/t_searchstateprovider/src/t_searchstateprovider.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/tsrc/t_searchstateprovider/src/t_searchstateprovider.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -19,8 +19,6 @@
//#include "searchruntimeprovider.h"
#include "searchstateprovider.h"
-#include <hsstatefactory.h>
-
#include <qmetatype.h>
#include <qstate.h>
@@ -51,8 +49,8 @@
//
void SearchStateProviderTest::init()
{
-
- // delete mMainWindow;
+
+ // delete mMainWindow;
}
// ---------------------------------------------------------------------------
@@ -68,7 +66,7 @@
//
void SearchStateProviderTest::cleanupTestCase()
{
-
+
}
// ---------------------------------------------------------------------------
@@ -78,15 +76,15 @@
{
SearchStateProvider provider;
- /* QVERIFY(provider.mWizardMenuStateToken.mLibrary == "searchstateprovider.dll");
- QVERIFY(provider.mWizardMenuStateToken.mUri == "search.nokia.com/state/wizardprogressivestate");
+ /* QVERIFY(provider.mWizardMenuStateToken.mLibrary == "searchstateprovider.dll");
+ QVERIFY(provider.mWizardMenuStateToken.mUri == "search.nokia.com/state/wizardprogressivestate");
- QVERIFY(provider.mWizardActivatedStateToken.mLibrary == "searchstateprovider.dll");
- QVERIFY(provider.mWizardActivatedStateToken.mUri == "search.nokia.com/state/wizardsettingstate");
+ QVERIFY(provider.mWizardActivatedStateToken.mLibrary == "searchstateprovider.dll");
+ QVERIFY(provider.mWizardActivatedStateToken.mUri == "search.nokia.com/state/wizardsettingstate");
- QVERIFY(provider.mInitStateToken.mLibrary == "searchstateprovider.dll");
- QVERIFY(provider.mInitStateToken.mUri == "search.nokia.com/state/initstate");
- */ }
+ QVERIFY(provider.mInitStateToken.mLibrary == "searchstateprovider.dll");
+ QVERIFY(provider.mInitStateToken.mUri == "search.nokia.com/state/initstate");
+ */}
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
@@ -94,23 +92,19 @@
void SearchStateProviderTest::testStates()
{
/* SearchStateProvider provider;
- QList<HsStateToken> states = provider.states();
-
- QCOMPARE(states.count(), 3);
+
+ QCOMPARE(states.count(), 3);
- QVERIFY(findStateInStateList(states, "searchstateprovider.dll","search.nokia.com/state/wizardprogressivestate"));
- QVERIFY(findStateInStateList(states, "searchstateprovider.dll","search.nokia.com/state/wizardsettingstate"));
- QVERIFY(findStateInStateList(states, "searchstateprovider.dll","search.nokia.com/state/initstate"));
- */ }
+ */}
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void SearchStateProviderTest::testCreateProgressiveState()
{
-
+
QVERIFY(verifyStateCreation("search.nokia.com/state/wizardprogressivestate"));
- // delete wind;
+ // delete wind;
}
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
@@ -119,7 +113,7 @@
{
//HbMainWindow* wind = mainWindow();
QVERIFY(verifyStateCreation("search.nokia.com/state/wizardsettingstate"));
- // delete wind;
+ // delete wind;
}
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
@@ -128,16 +122,15 @@
{
//HbMainWindow* wind = mainWindow();
QVERIFY(verifyStateCreation("search.nokia.com/state/initstate"));
- // delete wind;
+ // delete wind;
}
-
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
bool SearchStateProviderTest::verifyStateCreation(const QString& uri)
{
- SearchStateProvider provider;
+ SearchStateProvider provider;
QState* state = provider.createState(uri);
bool result = (state != NULL);
if (state)
@@ -150,23 +143,6 @@
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
-bool SearchStateProviderTest::findStateInStateList(
- const QList<HsStateToken>& states, const QString& library,
- const QString& uri)
- {
- foreach(HsStateToken token, states)
- {
- if (token.mLibrary == library && token.mUri == uri)
- {
- return true;
- }
- }
- return false;
- }
-
-// ---------------------------------------------------------------------------
-// ---------------------------------------------------------------------------
-//
HbMainWindow* SearchStateProviderTest::mainWindow()
{
int count = HbInstance::instance()->allMainWindows().count();
@@ -185,7 +161,7 @@
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
- int error =0;
+ int error = 0;
TRAPD(err,
QTEST_DISABLE_KEYPAD_NAVIGATION
SearchStateProviderTest tc;
--- a/searchui/stateproviders/searchstateprovider/tsrc/t_searchstateprovider/src/t_settingswidget.cpp Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/tsrc/t_searchstateprovider/src/t_settingswidget.cpp Thu Jul 22 16:34:05 2010 +0100
@@ -1,19 +1,3 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
#include "t_searchstateprovider.h"
#include "settingswidget.h"
#include <qlist.h>
--- a/searchui/stateproviders/searchstateprovider/tsrc/t_searchstateprovider/t_searchstateprovider.pro Fri Jun 11 16:24:16 2010 +0100
+++ b/searchui/stateproviders/searchstateprovider/tsrc/t_searchstateprovider/t_searchstateprovider.pro Thu Jul 22 16:34:05 2010 +0100
@@ -33,10 +33,6 @@
DESTDIR = $$PWD/../../../../../bin/debug/
}
-#LIBS += -lappservices
-LIBS += -lstatemodel
-#LIBS += -searchstateprovider.dll
-#LIBS += -searchruntimeprovider.dll
LIBS += -lsearchindevicehandler
LIBS += -lxqservice
LIBS += -lqcpixsearchclient
@@ -45,8 +41,14 @@
LIBS += -laknicon
LIBS += -lapgrfx
LIBS += -lbitgdi
-LIBS += -lnoteseditor
-
+LIBS += -lsearchonlinehandler
+LIBS += -lxqutils
+LIBS += -lapparc
+LIBS += -lefsrv
+LIBS += -lapgrfx
+LIBS += -lws32
+LIBS += -lavkon
+
CONFIG += qtestlib \
symbian_test \
debug_and_release \
@@ -67,15 +69,17 @@
./inc \
../../inc \
../../../../inc \
- ../../../../indevicehandler/inc
+ ../../../../indevicehandler/inc \
+ ../../../../onlinehandler/inc
symbian {
CONFIG += symbian_test
TARGET.UID2 = 0x100039CE
TARGET.UID3 = 0x20026F9A
TARGET.CAPABILITY = CAP_APPLICATION AllFiles
TARGET.EPOCSTACKSIZE = 0x14000 // 80kB
-TARGET.EPOCHEAPSIZE = 0x20000 0x1000000 // 128kB - 16MB
+TARGET.EPOCHEAPSIZE = 0x20000 0x800000 // 128kB - 16MB
INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
+INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
}
include(t_searchstateprovider.pri)
Binary file searchui/tsrc/indexdb/data/applications/_1/_0.cfs has changed
Binary file searchui/tsrc/indexdb/data/applications/_1/deletable has changed
Binary file searchui/tsrc/indexdb/data/applications/_1/segments has changed
Binary file searchui/tsrc/indexdb/data/bluesky.jpg has changed
Binary file searchui/tsrc/indexdb/data/bookmark/_1/_0.cfs has changed
Binary file searchui/tsrc/indexdb/data/bookmark/_1/deletable has changed
Binary file searchui/tsrc/indexdb/data/bookmark/_1/segments has changed
Binary file searchui/tsrc/indexdb/data/calendar/_1/_0.cfs has changed
Binary file searchui/tsrc/indexdb/data/calendar/_1/deletable has changed
Binary file searchui/tsrc/indexdb/data/calendar/_1/segments has changed
Binary file searchui/tsrc/indexdb/data/contact/_1/_0.cfs has changed
Binary file searchui/tsrc/indexdb/data/contact/_1/deletable has changed
Binary file searchui/tsrc/indexdb/data/contact/_1/segments has changed
Binary file searchui/tsrc/indexdb/data/cpixcontentinfo.sq has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/tsrc/indexdb/data/cpixreg.txt Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,31 @@
+@0:root applications=C:\Private\2001f6f7\indexing\indexdb\root\applications
+@0:root bookmark=C:\Private\2001f6f7\indexing\indexdb\root\bookmark
+@0:root calendar=C:\Private\2001f6f7\indexing\indexdb\root\calendar
+@0:root contact=C:\Private\2001f6f7\indexing\indexdb\root\contact
+@0:root notes=C:\Private\2001f6f7\indexing\indexdb\root\notes
+@c:root file content=C:\Private\2001f6f7\indexing\indexdb\root\file\content
+@c:root file folder=C:\Private\2001f6f7\indexing\indexdb\root\file\folder
+@c:root media audio=C:\Private\2001f6f7\indexing\indexdb\root\media\audio
+@c:root media image=C:\Private\2001f6f7\indexing\indexdb\root\media\image
+@c:root media video=C:\Private\2001f6f7\indexing\indexdb\root\media\video
+@c:root msg smsmms=C:\Private\2001f6f7\indexing\indexdb\root\msg\smsmms
+@t:root file content=T:\Private\2001f6f7\indexing\indexdb\root\file\content
+@t:root file folder=T:\Private\2001f6f7\indexing\indexdb\root\file\folder
+@t:root media audio=T:\Private\2001f6f7\indexing\indexdb\root\media\audio
+@t:root media image=T:\Private\2001f6f7\indexing\indexdb\root\media\image
+@t:root media video=T:\Private\2001f6f7\indexing\indexdb\root\media\video
+@u:root file content=U:\Private\2001f6f7\indexing\indexdb\root\file\content
+@u:root file folder=U:\Private\2001f6f7\indexing\indexdb\root\file\folder
+@u:root media audio=U:\Private\2001f6f7\indexing\indexdb\root\media\audio
+@u:root media image=U:\Private\2001f6f7\indexing\indexdb\root\media\image
+@u:root media video=U:\Private\2001f6f7\indexing\indexdb\root\media\video
+@x:root file content=X:\Private\2001f6f7\indexing\indexdb\root\file\content
+@x:root file folder=X:\Private\2001f6f7\indexing\indexdb\root\file\folder
+@x:root media audio=X:\Private\2001f6f7\indexing\indexdb\root\media\audio
+@x:root media image=X:\Private\2001f6f7\indexing\indexdb\root\media\image
+@x:root media video=X:\Private\2001f6f7\indexing\indexdb\root\media\video
+@y:root file content=Y:\Private\2001f6f7\indexing\indexdb\root\file\content
+@y:root file folder=Y:\Private\2001f6f7\indexing\indexdb\root\file\folder
+@y:root media audio=Y:\Private\2001f6f7\indexing\indexdb\root\media\audio
+@y:root media image=Y:\Private\2001f6f7\indexing\indexdb\root\media\image
+@y:root media video=Y:\Private\2001f6f7\indexing\indexdb\root\media\video
Binary file searchui/tsrc/indexdb/data/file/content/_0/_0.cfs has changed
Binary file searchui/tsrc/indexdb/data/file/content/_0/deletable has changed
Binary file searchui/tsrc/indexdb/data/file/content/_0/segments has changed
Binary file searchui/tsrc/indexdb/data/file/folder/_1/_0.cfs has changed
Binary file searchui/tsrc/indexdb/data/file/folder/_1/deletable has changed
Binary file searchui/tsrc/indexdb/data/file/folder/_1/segments has changed
Binary file searchui/tsrc/indexdb/data/jungle.jpg has changed
Binary file searchui/tsrc/indexdb/data/media/audio/_1/_0.cfs has changed
Binary file searchui/tsrc/indexdb/data/media/audio/_1/deletable has changed
Binary file searchui/tsrc/indexdb/data/media/audio/_1/segments has changed
Binary file searchui/tsrc/indexdb/data/media/image/_1/_0.cfs has changed
Binary file searchui/tsrc/indexdb/data/media/image/_1/deletable has changed
Binary file searchui/tsrc/indexdb/data/media/image/_1/segments has changed
Binary file searchui/tsrc/indexdb/data/media/video/_0/_0.cfs has changed
Binary file searchui/tsrc/indexdb/data/media/video/_0/deletable has changed
Binary file searchui/tsrc/indexdb/data/media/video/_0/segments has changed
Binary file searchui/tsrc/indexdb/data/mountain.jpg has changed
Binary file searchui/tsrc/indexdb/data/msg/smsmms/_1/_0.cfs has changed
Binary file searchui/tsrc/indexdb/data/msg/smsmms/_1/deletable has changed
Binary file searchui/tsrc/indexdb/data/msg/smsmms/_1/segments has changed
Binary file searchui/tsrc/indexdb/data/notes/_1/_0.cfs has changed
Binary file searchui/tsrc/indexdb/data/notes/_1/deletable has changed
Binary file searchui/tsrc/indexdb/data/notes/_1/segments has changed
Binary file searchui/tsrc/indexdb/data/rock.jpg has changed
Binary file searchui/tsrc/indexdb/data/sea.jpg has changed
Binary file searchui/tsrc/indexdb/data/snow.jpg has changed
Binary file searchui/tsrc/indexdb/data/tree.jpg has changed
Binary file searchui/tsrc/indexdb/data/water.jpg has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/tsrc/indexdb/indexdb.pro Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: indexdb
+#
+TEMPLATE = subdirs
+symbian{
+ BLD_INF_RULES.prj_exports += "data/water.jpg \epoc32\winscw\c\data\water.jpg" \
+ "data/sea.jpg \epoc32\winscw\c\data\sea.jpg" \
+ "data/rock.jpg \epoc32\winscw\c\data\tree.jpg" \
+ "data/bluesky.jpg \epoc32\winscw\c\data\bluesky.jpg" \
+ "data/jungle.jpg \epoc32\winscw\c\data\jungle.jpg" \
+ "data/snow.jpg \epoc32\winscw\c\data\snow.jpg" \
+ "data/mountain.jpg \epoc32\winscw\c\data\mountain.jpg "
+
+
+
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/searchui/tsrc/tsrc.pro Thu Jul 22 16:34:05 2010 +0100
@@ -0,0 +1,33 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TEMPLATE = subdirs
+
+SUBDIRS += indexdb \
+../indevicehandler/tsrc \
+ ../stateproviders/searchstateprovider/tsrc \
+../onlinehandler/tsrc
+
+
+
+CONFIG += ordered
+
+
+
+
+symbian: {
+ CONFIG += symbian_test
+}
--- a/sis/cpixsearchapp_stub.pkg Fri Jun 11 16:24:16 2010 +0100
+++ b/sis/cpixsearchapp_stub.pkg Thu Jul 22 16:34:05 2010 +0100
@@ -1,18 +1,3 @@
-;
-; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-; All rights reserved.
-; This component and the accompanying materials are made available
-; under the terms of "Eclipse Public License v1.0"
-; which accompanies this distribution, and is available
-; at the URL "http://www.eclipse.org/legal/epl-v10.html".
-;
-; Initial Contributors:
-; Nokia Corporation - initial contribution.
-;
-; Contributors:
-;
-; Description:
-;