harvesterplugins/file/src/cfileplugin.cpp
changeset 2 208a4ba3894c
parent 0 ccd0fd43f247
child 3 6832643895f7
--- a/harvesterplugins/file/src/cfileplugin.cpp	Mon Apr 19 14:40:05 2010 +0300
+++ b/harvesterplugins/file/src/cfileplugin.cpp	Mon May 03 12:32:15 2010 +0300
@@ -30,6 +30,12 @@
 #include <common.h>
 
 #include <ccpixindexer.h>
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "cfilepluginTraces.h"
+#endif
+
+
 
 // local declarations and functions
 namespace {
@@ -37,10 +43,19 @@
 _LIT(KCPixSearchServerPrivateDirectory, "\\Private\\2001f6f7\\");
 _LIT(KPathIndexDbPath, CPIX_INDEVICE_INDEXDB);
 
-_LIT(KPathTrailer, "\\root\\file");
-_LIT(KFileBaseAppClassGeneric, ":root file");
+_LIT(KPathFolder, "\\root\\file\\folder");
+_LIT(KPathFileContent, "\\root\\file\\content");
+_LIT(KFileBaseAppClassContent, "root file content");
+_LIT(KFileBaseAppClassFolder, "root file folder");
 _LIT(KFilePluginAtSign, "@");
 _LIT(KFilePluginColon, ":");
+_LIT(KNameField, "Name");
+_LIT(KExtensionField, "Extension");
+_LIT(KMimeTypeFile, FILE_MIMETYPE);
+_LIT(KMimeTypeFolder , FOLDER_MIMETYPE);
+_LIT(KMimeTypeField , CPIX_MIMETYPE_FIELD);
+
+#define CONSTANT_TO_PTR16(ptr, c) TPtrC16 ptr; ptr.Set((const TUint16*)c,User::StringLength(c) );
 
 /**
 * MapFileToDrive - returns the TDriveNumber that the file is located on.
@@ -91,6 +106,34 @@
 
 } // anonymous namespace
 
+
+TBool CFilePlugin::IsFileTypeMedia(const TDesC& aExt)
+    {
+    
+    const TText* KMediaExt[] = {_S("txt"),_S("pdf"), _S("jpg"),_S("mp3"), _S("jpeg"), _S("wma"), _S("3gp"), _S("mpg4"),
+                                _S("avi"), _S("jpf"), _S("mbm"), _S("png"), _S("gif"), _S("bmp"),  _S("mp4"), _S("mpeg4"),
+                                _S("m4v"), _S("m4a"), _S("3gpp"), _S("3g2"), _S("aac"), _S("amr"), _S("wmv"), _S("divx"),
+                                _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")};
+    
+    const TInt count = sizeof( KMediaExt ) / sizeof( TText* );
+    
+    TBool isValid = false;
+    
+    for (TInt i = 0; i < count; i++)
+        {
+        CONSTANT_TO_PTR16(type, KMediaExt[i]);
+        if(!aExt.Compare(type))
+            {
+            isValid = true;
+            break;
+            }
+        }    
+    return isValid;
+    }
+
 CFilePlugin* CFilePlugin::NewL()
     {
     CFilePlugin* instance = CFilePlugin::NewLC();
@@ -111,6 +154,7 @@
     for (TInt i=EDriveA; i<=EDriveZ; i++)
         {
         iIndexer[i] = NULL; //Initialize to NULL
+        iFolderIndexer[i] = NULL;
         }
     }
 
@@ -138,10 +182,12 @@
 	{
     User::LeaveIfError( iFs.Connect() );
     TInt err = iFs.AddPlugin(KFastFindFSPluginFile);
+    OstTrace1( TRACE_NORMAL, CFILEPLUGIN_CONSTRUCTL, "CFilePlugin::ConstructL;iFs.AddPlugin=%d", err );
     CPIXLOGSTRING2("CFilePlugin::ConstructL, iFs.AddPlugin: %i", err);
     if ( err != KErrAlreadyExists )
     	{
     	err = iFs.MountPlugin(KFastFindFSPluginName);
+    	OstTrace1( TRACE_NORMAL, DUP1_CFILEPLUGIN_CONSTRUCTL, "CFilePlugin::ConstructL;iFs.MountPlugin=%d", err );
     	CPIXLOGSTRING2("CFilePlugin::ConstructL, iFs.MountPlugin: %i", err);
     	}
     // check if already up, unload and reload
@@ -149,15 +195,19 @@
     	{
     	// dismount
     	TInt err = iFs.DismountPlugin(KFastFindFSPluginName);
+	    OstTrace1( TRACE_NORMAL, DUP2_CFILEPLUGIN_CONSTRUCTL, "CFilePlugin::ConstructL;iFs.DismountPlugin=%d", err );
 	    CPIXLOGSTRING2("CFilePlugin::ConstructL(), iFs.DismountPlugin: %i", err);
 		err = iFs.RemovePlugin(KFastFindFSPluginName);
+		OstTrace1( TRACE_NORMAL, DUP3_CFILEPLUGIN_CONSTRUCTL, "CFilePlugin::ConstructL;iFs.RemovePlugin=%d", err );
 		CPIXLOGSTRING2("CFilePlugin::ConstructL(), iFs.RemovePlugin: %i", err);
 		// if no error reload
 		if ( err == KErrNone )
 			{
 			err = iFs.AddPlugin(KFastFindFSPluginFile);
+			OstTrace1( TRACE_NORMAL, DUP4_CFILEPLUGIN_CONSTRUCTL, "CFilePlugin::ConstructL;iFs.AddPlugin=%d", err );
 			CPIXLOGSTRING2("CFilePlugin::ConstructL, iFs.AddPlugin: %i", err);
 			err = iFs.MountPlugin(KFastFindFSPluginName);
+			OstTrace1( TRACE_NORMAL, DUP5_CFILEPLUGIN_CONSTRUCTL, "CFilePlugin::ConstructL;iFs.MountPlugin=%d", err );
 			CPIXLOGSTRING2("CFilePlugin::ConstructL, iFs.MountPlugin: %i", err);
 			}
     	}
@@ -174,6 +224,7 @@
     if (!iIsMonitorInit)
         {
         error = iMonitor->Initialize();
+        OstTrace1( TRACE_NORMAL, CFILEPLUGIN_STARTPLUGINL, "CFilePlugin::StartPluginL;Monitor Error=%d", error );
         CPIXLOGSTRING2("CFilePlugin::StartMonitoring, error: %i", error );
         iIsMonitorInit = ETrue;
         }
@@ -182,11 +233,13 @@
     if (error == KErrNone && iIsMonitorInit)
         {
         iMonitor->StartMonitoring();
+        OstTrace0( TRACE_NORMAL, DUP1_CFILEPLUGIN_STARTPLUGINL, "CFilePlugin::StartMonitoring - iFileMonitor->StartMonitoring " );
         CPIXLOGSTRING("CFilePlugin::StartMonitoring - iFileMonitor->StartMonitoring ");
         }
 
     iMmcMonitor->StartMonitoring();
 
+    OstTrace0( TRACE_NORMAL, DUP2_CFILEPLUGIN_STARTPLUGINL, "END CFilePlugin::StartMonitoring" );
     CPIXLOGSTRING("END CFilePlugin::StartMonitoring");
 
     // Add harvesters for each non removable drive
@@ -215,47 +268,65 @@
 
 void CFilePlugin::MountL(TDriveNumber aMedia, TBool aForceReharvest)
     {
+    OstTraceFunctionEntry0( CFILEPLUGIN_MOUNTL_ENTRY );
     CPIXLOGSTRING("ENTER CFilePlugin::MountL");
     // Check if already exists
-    if (iIndexer[aMedia])
+    if (iIndexer[aMedia] && iFolderIndexer[aMedia])
         return;
 
     // Add Notifications paths prior to opening IndexDB.
     AddNotificationPathsL(aMedia);
 
-    // Form the baseappclass for this media
-    TBuf<KFilePluginBaseAppClassMaxLen> baseAppClass;
-    FormBaseAppClass(aMedia, baseAppClass);
-
-    // Define this volume
-    HBufC* path = DatabasePathLC(aMedia);
-    User::LeaveIfError(iSearchSession.DefineVolume(baseAppClass, *path));
+    // Form the baseappclass for folder
+    TBuf<KFilePluginBaseAppClassMaxLen> baseFolderAppClass;
+    FormBaseAppClass(aMedia,KFileBaseAppClassFolder, baseFolderAppClass);
+    //Form the baseappclass for content
+    TBuf<KFilePluginBaseAppClassMaxLen> baseContentAppClass;
+    FormBaseAppClass(aMedia,KFileBaseAppClassContent, baseContentAppClass);
+    
+    // Define volume for folder and content index database
+    HBufC* path = DatabasePathLC(aMedia,KPathFolder);
+    User::LeaveIfError(iSearchSession.DefineVolume(baseFolderAppClass, *path));
     CleanupStack::PopAndDestroy(path);
     
+    HBufC* contentpath = DatabasePathLC(aMedia,KPathFileContent);
+    User::LeaveIfError(iSearchSession.DefineVolume(baseContentAppClass, *contentpath));
+    CleanupStack::PopAndDestroy(contentpath);
+    
     // construct and open the database
     iIndexer[aMedia] = CCPixIndexer::NewL(iSearchSession);
-    iIndexer[aMedia]->OpenDatabaseL(baseAppClass);
+    iIndexer[aMedia]->OpenDatabaseL(baseContentAppClass);
+    
+    iFolderIndexer[aMedia]= CCPixIndexer::NewL(iSearchSession);
+    iFolderIndexer[aMedia]->OpenDatabaseL(baseFolderAppClass);
 
     // Add to harvesting queue
-    iObserver->AddHarvestingQueue(this, baseAppClass, aForceReharvest);
+    iObserver->AddHarvestingQueue(this, baseContentAppClass, aForceReharvest);
+    
     CPIXLOGSTRING("END CFilePlugin::MountL");
+    OstTraceFunctionExit0( CFILEPLUGIN_MOUNTL_EXIT );
     }
 
 void CFilePlugin::UnMount(TDriveNumber aMedia, TBool aUndefineAsWell)
     {
+    OstTraceFunctionEntry0( CFILEPLUGIN_UNMOUNT_ENTRY );
     CPIXLOGSTRING("ENTER CFilePlugin::UnMount ");
     // Check if already exists
-    if (!iIndexer[aMedia])
+    if (!iIndexer[aMedia] && !iFolderIndexer[aMedia])
         {
+        OstTraceFunctionExit0( CFILEPLUGIN_UNMOUNT_EXIT );
         return;
         }
 
-    // Form the baseappclass for this media
-    TBuf<KFilePluginBaseAppClassMaxLen> baseAppClass;
-    FormBaseAppClass(aMedia, baseAppClass);
+    // Form the baseappclass for folder
+    TBuf<KFilePluginBaseAppClassMaxLen> baseFolderAppClass;
+    FormBaseAppClass(aMedia,KFileBaseAppClassFolder, baseFolderAppClass);
+    //Form the baseappclass for content
+    TBuf<KFilePluginBaseAppClassMaxLen> baseContentAppClass;
+    FormBaseAppClass(aMedia,KFileBaseAppClassContent, baseContentAppClass);
 
     // Remove from harvesting queue
-    iObserver->RemoveHarvestingQueue(this, baseAppClass);
+    iObserver->RemoveHarvestingQueue(this, baseContentAppClass);
     
     // Delete the index object
     if (iIndexer[aMedia])
@@ -263,18 +334,26 @@
         delete iIndexer[aMedia];
         iIndexer[aMedia] = NULL;
         }
-
+    
+    if (iFolderIndexer[aMedia])
+        {
+        delete iFolderIndexer[aMedia];
+        iFolderIndexer[aMedia] = NULL;
+        }
     RemoveNotificationPaths(aMedia);
 
     if (aUndefineAsWell)
         {
-        iSearchSession.UnDefineVolume(baseAppClass);
+        iSearchSession.UnDefineVolume(baseFolderAppClass);
+        iSearchSession.UnDefineVolume(baseContentAppClass);
         }
     CPIXLOGSTRING("END CFilePlugin::UnMount ");
+    OstTraceFunctionExit0( DUP1_CFILEPLUGIN_UNMOUNT_EXIT );
     }
 
 void CFilePlugin::StartHarvestingL(const TDesC& aQualifiedBaseAppClass)
     {
+    OstTraceFunctionEntry0( CFILEPLUGIN_STARTHARVESTINGL_ENTRY );
     CPIXLOGSTRING("ENTER CFilePlugin::StartHarvestingL ");
     // Map base app class to a drive number
     TDriveNumber drive(EDriveA); //Initialize to get rid of compiler warning.
@@ -284,7 +363,7 @@
         }
 
     // Leave if no indexer for this drive
-    if (!iIndexer[drive])
+    if (!iIndexer[drive] && !iFolderIndexer[drive])
         {
         User::Leave(KErrGeneral);
         }
@@ -294,17 +373,20 @@
 #endif
     // Reset the database
     iIndexer[drive]->ResetL();
-
+    iFolderIndexer[drive]->ResetL();
+    
     // Start the actual harvest
     iHarvester->StartL(drive);
     CPIXLOGSTRING("END CFilePlugin::StartHarvestingL ");
+    OstTraceFunctionExit0( CFILEPLUGIN_STARTHARVESTINGL_EXIT );
     }
 
-void CFilePlugin::CreateFileIndexItemL(const TDesC& aFilename, TCPixActionType aActionType)
+void CFilePlugin::CreateContentIndexItemL(const TDesC& aFilename, TCPixActionType aActionType)
     {
     TFileName lowerCaseFilename(aFilename);
     lowerCaseFilename.LowerCase();
 
+    OstTraceExt2( TRACE_NORMAL, DUP1_CFILEPLUGIN_CREATECONTENTINDEXITEML, "CFilePlugin::CreateContentIndexItemL;lowerCaseFilename=%S;aActionType=%d", lowerCaseFilename, aActionType );
     CPIXLOGSTRING3("CFilePlugin::CreateFileIndexItemL lowerCaseFilename = %S aActionType = %d ", 
 					&lowerCaseFilename, aActionType);
 
@@ -312,8 +394,10 @@
 	User::LeaveIfError( MapFileToDrive( lowerCaseFilename, drive ) );
 
 	CCPixIndexer* indexer = iIndexer[drive];
+    
 	if (!indexer)
 		{
+		OstTrace0( TRACE_NORMAL, DUP2_CFILEPLUGIN_CREATECONTENTINDEXITEML, "CFilePlugin::CreateFileIndexItemL(): Could not map file to drive." );
 		CPIXLOGSTRING("CFilePlugin::CreateFileIndexItemL(): Could not map file to drive.");
 		return;
 		}
@@ -323,6 +407,7 @@
 		{
 #ifdef _DEBUG
 		TRAPD(err, indexer->DeleteL(lowerCaseFilename));
+		OstTrace1( TRACE_NORMAL, CFILEPLUGIN_CREATECONTENTINDEXITEML, "CFilePlugin::CreateContentIndexItemL;DeleteL returned=%d", err );
 		CPIXLOGSTRING2("CFilePlugin::CreateFileIndexItemL(): DeleteL returned %d.", err);
 #else   
 		TRAP_IGNORE( indexer->DeleteL(lowerCaseFilename) );
@@ -338,6 +423,7 @@
 			{
 #ifdef _DEBUG
 			TRAPD(err, indexer->AddL(*index_item));
+	        OstTrace1( TRACE_NORMAL, DUP3_CFILEPLUGIN_CREATECONTENTINDEXITEML, "CFilePlugin::CreateContentIndexItemL;AddL returned=%d", err );
 	        CPIXLOGSTRING2("CFilePlugin::CreateFileIndexItemL(): AddL returned %d.", err);
 #else
 			TRAP_IGNORE( indexer->AddL(*index_item) );
@@ -347,51 +433,144 @@
 			{
 #ifdef _DEBUG		
 			TRAPD(err, indexer->UpdateL(*index_item));
+	        OstTrace1( TRACE_NORMAL, DUP4_CFILEPLUGIN_CREATECONTENTINDEXITEML, "CFilePlugin::CreateContentIndexItemL;UpdateL returned=%d", err );
 	        CPIXLOGSTRING2("CFilePlugin::CreateFileIndexItemL(): UpdateL returned %d.", err);
 #else
 			TRAP_IGNORE( indexer->UpdateL(*index_item) );
 #endif
 			}
 		CleanupStack::PopAndDestroy(index_item);
-		}
+		}    
+    }
+
+void CFilePlugin::CreateFolderFileIndexItemL(const TDesC& aFilename, TCPixActionType aActionType, TBool aIsDir)
+    {    
+    CSearchDocument* index_item = NULL;
+    TBool isMediaFile = false;
+    TFileName lowerCaseFilename(aFilename);    
+    lowerCaseFilename.LowerCase();        
+    
+    // Adding the file entry to folder index,check for file or folder entry,
+    //if file, extract the extension
+    if (!aIsDir)
+        {
+        TFileName extension; 
+        TInt pos = lowerCaseFilename.LocateReverse('.');
+        if (pos > 0)
+            {
+            extension.Copy(lowerCaseFilename.Mid(pos+1));
+            isMediaFile = IsFileTypeMedia(extension);
+            }
+        }
+    //Check for extension type, if media items do not index them
+    if(!isMediaFile)
+        {
+        OstTraceExt2( TRACE_NORMAL, CFILEPLUGIN_CREATEFOLDERFILEINDEXITEML, "CFilePlugin::CreateFolderFileIndexItemL;lowerCaseFilename=%S;aActionType=%d", lowerCaseFilename, aActionType );
+        CPIXLOGSTRING3("CFilePlugin::CreateFolderFileIndexItemL lowerCaseFilename = %S aActionType = %d ", 
+                                                    &lowerCaseFilename, aActionType);
+
+        TDriveNumber drive(EDriveA);
+        User::LeaveIfError( MapFileToDrive( lowerCaseFilename, drive ) );    
+
+        CCPixIndexer* indexer = iFolderIndexer[drive];
+        if (!indexer)
+            {
+            OstTrace0( TRACE_NORMAL, DUP1_CFILEPLUGIN_CREATEFOLDERFILEINDEXITEML, "CFilePlugin::CreateFolderFileIndexItemL(): Could not map file to drive." );
+            CPIXLOGSTRING("CFilePlugin::CreateFolderFileIndexItemL(): Could not map file to drive.");
+            return;
+            }
+        
+        if (aActionType == ECPixRemoveAction)
+            {
+    #ifdef _DEBUG
+            TRAPD(err, indexer->DeleteL(lowerCaseFilename));
+            OstTrace1( TRACE_NORMAL, DUP2_CFILEPLUGIN_CREATEFOLDERFILEINDEXITEML, "CFilePlugin::CreateFolderFileIndexItemL;DeleteL returned=%d", err );
+            CPIXLOGSTRING2("CFilePlugin::CreateFolderFileIndexItemL(): DeleteL returned %d.", err);
+    #else
+            TRAP_IGNORE( indexer->DeleteL(lowerCaseFilename) );
+    #endif
+            }
+        else
+            {
+            index_item = CreateCpixDocumentL(lowerCaseFilename, aIsDir);
+            
+            if( aActionType == ECPixAddAction )
+                {
+    #ifdef _DEBUG
+                TRAPD(err, indexer->AddL(*index_item));
+                OstTrace1( TRACE_NORMAL, DUP3_CFILEPLUGIN_CREATEFOLDERFILEINDEXITEML, "CFilePlugin::CreateFolderFileIndexItemL;AddL returned=%d", err );
+                CPIXLOGSTRING2("CFilePlugin::CreateFolderFileIndexItemL(): AddL returned %d.", err);
+    #else
+                TRAP_IGNORE( indexer->AddL(*index_item) );
+    #endif
+                }
+            else if( aActionType == ECPixUpdateAction )
+                {
+    #ifdef _DEBUG
+                TRAPD(err, indexer->UpdateL(*index_item));
+                OstTrace1( TRACE_NORMAL, DUP4_CFILEPLUGIN_CREATEFOLDERFILEINDEXITEML, "CFilePlugin::CreateFolderFileIndexItemL;UpdateL returned=%d", err );
+                CPIXLOGSTRING2("CFilePlugin::CreateFolderFileIndexItemL(): UpdateL returned %d.", err);
+    #else
+                TRAP_IGNORE( indexer->UpdateL(*index_item) );
+    #endif
+                }
+            delete index_item;
+            }
+        }    
     }
 
 void CFilePlugin::HarvestingCompleted(TDriveNumber aDriveNumber, TInt aError)
     {
+    OstTraceFunctionEntry0( CFILEPLUGIN_HARVESTINGCOMPLETED_ENTRY );
     CPIXLOGSTRING("ENTER CFilePlugin::HarvestingCompleted ");
 
     if (iIndexer[aDriveNumber])
         {
         Flush(*iIndexer[aDriveNumber]);
         }
-    TBuf<KFilePluginBaseAppClassMaxLen> baseAppClass;
-    FormBaseAppClass(TDriveNumber(aDriveNumber), baseAppClass);
+    if (iFolderIndexer[aDriveNumber])
+        {
+        Flush(*iFolderIndexer[aDriveNumber]);
+        }
+    
+    //Form baseapp class for folder and content database
+    TBuf<KFilePluginBaseAppClassMaxLen> baseContentAppClass;
+    FormBaseAppClass(TDriveNumber(aDriveNumber),KFileBaseAppClassContent, baseContentAppClass);    
+    
+    iObserver->HarvestingCompleted(this, baseContentAppClass, aError);    
+    
 #ifdef __PERFORMANCE_DATA
     TRAP_IGNORE( UpdatePerformaceDataL(aDriveNumber) );
 #endif
-    iObserver->HarvestingCompleted(this, baseAppClass, aError);
+
 
     CPIXLOGSTRING("END CFilePlugin::HarvestingCompleted ");
+    OstTraceFunctionExit0( CFILEPLUGIN_HARVESTINGCOMPLETED_EXIT );
     }
 
 void CFilePlugin::AddNotificationPathsL(const TDriveNumber aDriveNumber)
     {
+    OstTraceFunctionEntry0( CFILEPLUGIN_ADDNOTIFICATIONPATHSL_ENTRY );
     CPIXLOGSTRING("ENTER CFilePlugin::AddNotificationPathsL ");
     iMonitor->AddNotificationPathsL(aDriveNumber);
     iHarvester->AddIgnorePathsL(aDriveNumber);
     CPIXLOGSTRING("END CFilePlugin::AddNotificationPathsL ");
+    OstTraceFunctionExit0( CFILEPLUGIN_ADDNOTIFICATIONPATHSL_EXIT );
     }
 
 void CFilePlugin::RemoveNotificationPaths(const TDriveNumber aDriveNumber)
     {
+    OstTraceFunctionEntry0( CFILEPLUGIN_REMOVENOTIFICATIONPATHS_ENTRY );
     CPIXLOGSTRING("ENTER CFilePlugin::RemoveNotificationPaths");
     iMonitor->RemoveNotificationPaths(aDriveNumber);
     iHarvester->RemoveIgnorePaths(aDriveNumber);
     CPIXLOGSTRING("END CFilePlugin::RemoveNotificationPaths");
+    OstTraceFunctionExit0( CFILEPLUGIN_REMOVENOTIFICATIONPATHS_EXIT );
     }
 
-TInt CFilePlugin::FormBaseAppClass(TDriveNumber aMedia, TDes& aBaseAppClass)
+TInt CFilePlugin::FormBaseAppClass(TDriveNumber aMedia, const TDesC& aGenericAppClass, TDes& aBaseAppClass)
     {
+    OstTraceFunctionEntry0( CFILEPLUGIN_FORMBASEAPPCLASS_ENTRY );
     CPIXLOGSTRING("ENTER CFilePlugin::FormBaseAppClass");
     TChar chr;
     const TInt ret = RFs::DriveToChar(aMedia, chr);
@@ -400,19 +579,22 @@
         aBaseAppClass.Copy(KFilePluginAtSign);
         aBaseAppClass.Append(chr);
         aBaseAppClass.LowerCase();
-        aBaseAppClass.Append(KFileBaseAppClassGeneric);
+        aBaseAppClass.Append(KFilePluginColon);
+        aBaseAppClass.Append(aGenericAppClass);
         }
 
     CPIXLOGSTRING("END CFilePlugin::FormBaseAppClass");
+    OstTraceFunctionExit0( CFILEPLUGIN_FORMBASEAPPCLASS_EXIT );
     return ret;
     }
 
-HBufC* CFilePlugin::DatabasePathLC(TDriveNumber aMedia)
+HBufC* CFilePlugin::DatabasePathLC(TDriveNumber aMedia,const TDesC& aPath)
     {
+    OstTraceFunctionEntry0( CFILEPLUGIN_DATABASEPATHLC_ENTRY );
     CPIXLOGSTRING("ENTER CFilePlugin::DatabasePathLC");
     // Allocate extra space for root path e.g. "C:\\Private\\2001f6f7\\"
     const TInt KRootPathMaxLength = 30;
-    HBufC* indexDbPath = HBufC::NewLC(KRootPathMaxLength + KPathIndexDbPath().Length() + KPathTrailer().Length());
+    HBufC* indexDbPath = HBufC::NewLC(KRootPathMaxLength + KPathIndexDbPath().Length() + aPath.Length());
     TPtr indexDbPathPtr = indexDbPath->Des();
 
     // Data caging implementation
@@ -428,12 +610,53 @@
     indexDbPathPtr.Append(KCPixSearchServerPrivateDirectory);
 
     indexDbPathPtr.Append(KPathIndexDbPath);
-    indexDbPathPtr.Append(KPathTrailer);
+    indexDbPathPtr.Append(aPath);
 
     CPIXLOGSTRING("END CFilePlugin::DatabasePathLC");
+    OstTraceFunctionExit0( CFILEPLUGIN_DATABASEPATHLC_EXIT );
     return indexDbPath;
     }
 
+CSearchDocument* CFilePlugin::CreateCpixDocumentL(const TDesC& aFilePath, TBool aIsDir)
+    {
+    
+    CSearchDocument* index_item = CSearchDocument::NewLC(aFilePath, KFileBaseAppClassFolder);
+        
+    TParse file;
+    file.Set(aFilePath, NULL, NULL);
+    
+    TFileName fileFoldername; 
+    TInt pos = aFilePath.LocateReverse('\\');
+    if (pos > 0)
+        {
+        fileFoldername.Copy(aFilePath.Mid(pos+1));
+        index_item->AddFieldL(KNameField, fileFoldername);
+        }
+    
+    //check for the extension, for folders names store the extension field as NULL
+    //adding Mimetype and Extension field
+    if(!aIsDir)
+       {
+        if( file.ExtPresent())
+            {
+            TPtrC extension = file.Ext();
+            index_item->AddFieldL(KExtensionField, extension);
+            }
+        index_item->AddFieldL(KMimeTypeField, KMimeTypeFile, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
+       }
+    else
+        {
+        index_item->AddFieldL(KExtensionField, KNullDesC);
+        index_item->AddFieldL(KMimeTypeField, KMimeTypeFolder, CDocumentField::EStoreYes | CDocumentField::EIndexUnTokenized);
+        }   
+    
+    //Add excerpt field
+    index_item->AddExcerptL(aFilePath);
+    
+    CleanupStack::Pop(index_item);
+    return index_item;
+    }
+
 #ifdef __PERFORMANCE_DATA
 void CFilePlugin::UpdatePerformaceDataL(TDriveNumber aDriveNumber)
     {
@@ -446,7 +669,7 @@
     RFs fileSession;
     RFile perfFile;
     User::LeaveIfError( fileSession.Connect () );
-	RFs::DriveToChar((TInt)aDriveNumber, aChar);	
+	RFs::DriveToChar((TInt)aDriveNumber, aChar);
     
     
     /* Open file if it exists, otherwise create it and write content in it */