mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-08 04:07:40 +02:00
Ported Indexer plugin to .net core 3
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user