Ported Indexer plugin to .net core 3

This commit is contained in:
Alekhya Reddy
2020-03-24 16:07:17 -07:00
parent 6e2ad28676
commit 79fd5dc7b1
13 changed files with 614 additions and 83 deletions

View File

@@ -0,0 +1,88 @@
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Search.Interop;
namespace Wox.Plugin.Indexer.SearchHelper
{
class DriveDetection
{
// Variable which sets the warning status, can be turned off by user
// TODO : To be linked with the UI once it is finalized
public bool warningOn = true;
// Function to return the names of all drives
public List<string> GetDrives()
{
DriveInfo[] allDrives = DriveInfo.GetDrives();
List<string> allDriveNames = new List<string>();
foreach (DriveInfo d in allDrives)
{
allDriveNames.Add(d.Name);
}
return allDriveNames;
}
[STAThread]
// Function to get all the Search Scopes of the indexer
public List<string> GetScopeRules()
{
List<string> allScopeRules = new List<string>();
// This uses the Microsoft.Search.Interop assembly
CSearchManager manager = new CSearchManager();
// SystemIndex catalog is the default catalog in Windows
ISearchCatalogManager catalogManager = manager.GetCatalog("SystemIndex");
// Get the ISearchQueryHelper which will help us to translate AQS --> SQL necessary to query the indexer
ISearchCrawlScopeManager crawlScopeManager = catalogManager.GetCrawlScopeManager();
// search for the scope rules
IEnumSearchScopeRules scopeRules = crawlScopeManager.EnumerateScopeRules();
CSearchScopeRule scopeRule;
uint numScopes = 0;
bool nextExists = true;
while (nextExists)
{
try
{
scopeRules.Next(1, out scopeRule, ref numScopes);
allScopeRules.Add(scopeRule.PatternOrURL);
/*Console.WriteLine(numScopes);*/
}
catch (Exception ex)
{
nextExists = false;
}
}
return allScopeRules;
}
// Function to check if all Drives are indexed
public bool allDrivesIndexed()
{
bool allDrivesAreIndexed = true;
List<string> drives = GetDrives();
List<string> scopeRules = GetScopeRules();
foreach (var drive in drives)
{
string driveScope = @"file:///" + drive;
if (!scopeRules.Contains(driveScope))
{
allDrivesAreIndexed = false;
break;
}
}
return allDrivesAreIndexed;
}
}
}

View File

@@ -0,0 +1,66 @@
using System;
using System.Diagnostics;
using Microsoft.Win32;
namespace Wox.Plugin.Indexer.SearchHelper
{
class IndexerExecutableInfo
{
// Reference - Control Panel Plugin
private const string CONTROL = @"%SystemRoot%\System32\control.exe";
private RegistryKey nameSpace = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace");
RegistryKey clsid = Registry.ClassesRoot.OpenSubKey("CLSID");
RegistryKey currentKey;
ProcessStartInfo executablePath;
public ProcessStartInfo Create(uint iconSize)
{
foreach (string key in nameSpace.GetSubKeyNames())
{
currentKey = clsid.OpenSubKey(key);
if (currentKey != null)
{
executablePath = getExecutablePath(currentKey);
if (!(executablePath == null)) //Cannot have item without executable path
{
localizedString = getLocalizedString(currentKey);
}
}
}
return executablePath;
}
// Ref - ControlPanelPlugin Wox
// Code to obtain the executable path for an item in the Control Panel
private ProcessStartInfo getExecutablePath(RegistryKey currentKey)
{
ProcessStartInfo executablePath = new ProcessStartInfo();
string applicationName;
if (currentKey.GetValue("System.ApplicationName") != null)
{
//CPL Files (usually native MS items)
applicationName = currentKey.GetValue("System.ApplicationName").ToString();
executablePath.FileName = Environment.ExpandEnvironmentVariables(CONTROL);
executablePath.Arguments = "-name " + applicationName;
}
else if (currentKey.OpenSubKey("Shell\\Open\\Command") != null && currentKey.OpenSubKey("Shell\\Open\\Command").GetValue(null) != null)
{
//Other files (usually third party items)
string input = "\"" + Environment.ExpandEnvironmentVariables(currentKey.OpenSubKey("Shell\\Open\\Command").GetValue(null).ToString()) + "\"";
executablePath.FileName = "cmd.exe";
executablePath.Arguments = "/C " + input;
executablePath.WindowStyle = ProcessWindowStyle.Hidden;
}
else
{
return null;
}
return executablePath;
}
}
}

View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Wox.Plugin.Indexer.SearchHelper
{
public class SearchResult
{
// Contains the Path of the file or folder
public string Path { get; set; }
}
}

View File

@@ -0,0 +1,99 @@
using System;
using System.Collections.Generic;
using System.Data.OleDb;
using Microsoft.Search.Interop;
namespace Wox.Plugin.Indexer.SearchHelper
{
public class WindowsSearchAPI
{
public OleDbConnection conn;
public OleDbCommand command;
public OleDbDataReader WDSResults;
public IEnumerable<SearchResult> ExecuteQuery(ISearchQueryHelper queryHelper, string keyword)
{
// Generate SQL from our parameters, converting the userQuery from AQS->WHERE clause
string sqlQuery = queryHelper.GenerateSQLFromUserQuery(keyword);
// --- Perform the query ---
// create an OleDbConnection object which connects to the indexer provider with the windows application
using (conn = new OleDbConnection(queryHelper.ConnectionString))
{
// open the connection
conn.Open();
// now create an OleDB command object with the query we built above and the connection we just opened.
using (command = new OleDbCommand(sqlQuery, conn))
{
// execute the command, which returns the results as an OleDbDataReader.
using (WDSResults = command.ExecuteReader())
{
while (WDSResults.Read())
{
// col 0 is our path in display format
Console.WriteLine("{0}", WDSResults.GetString(0));
var result = new SearchResult { Path = WDSResults.GetString(0) };
yield return result;
}
}
}
}
}
public void ModifyQueryHelper(ref ISearchQueryHelper queryHelper, string pattern)
{
// convert file pattern if it is not '*'. Don't create restriction for '*' as it includes all files.
if (pattern != "*")
{
pattern = pattern.Replace("*", "%");
pattern = pattern.Replace("?", "_");
if (pattern.Contains("%") || pattern.Contains("_"))
{
queryHelper.QueryWhereRestrictions += " AND System.FileName LIKE '" + pattern + "' ";
}
else
{
// if there are no wildcards we can use a contains which is much faster as it uses the index
queryHelper.QueryWhereRestrictions += " AND Contains(System.FileName, '" + pattern + "') ";
}
}
}
public void InitQueryHelper(out ISearchQueryHelper queryHelper, int maxCount)
{
// This uses the Microsoft.Search.Interop assembly
CSearchManager manager = new CSearchManager();
// SystemIndex catalog is the default catalog in Windows
ISearchCatalogManager catalogManager = manager.GetCatalog("SystemIndex");
// Get the ISearchQueryHelper which will help us to translate AQS --> SQL necessary to query the indexer
queryHelper = catalogManager.GetQueryHelper();
// Set the number of results we want. Don't set this property if all results are needed.
queryHelper.QueryMaxResults = maxCount;
// Set list of columns we want to display, getting the path presently
queryHelper.QuerySelectColumns = "System.ItemPathDisplay";
// Set additional query restriction
queryHelper.QueryWhereRestrictions = "AND scope='file:'";
// Set sorting order
queryHelper.QuerySorting = "System.DateModified DESC";
}
public IEnumerable<SearchResult> Search(string keyword, string pattern = "*", int maxCount = 100)
{
ISearchQueryHelper queryHelper;
InitQueryHelper(out queryHelper, maxCount);
ModifyQueryHelper(ref queryHelper, pattern);
return ExecuteQuery(queryHelper, keyword);
}
}
}