private VSCodeWorkspace ParseVSCodeUri(string uri, VSCodeInstance vscodeInstance, bool isWorkspace = false) { if (uri != null && uri is string) { string unescapeUri = Uri.UnescapeDataString(uri); var typeWorkspace = WorkspacesHelper.ParseVSCodeUri.GetWorkspaceEnvironment(unescapeUri); if (typeWorkspace.WorkspaceEnvironment.HasValue) { var folderName = Path.GetFileName(unescapeUri); // Check we haven't returned '' if we have a path like C:\ if (string.IsNullOrEmpty(folderName)) { DirectoryInfo dirInfo = new DirectoryInfo(unescapeUri); folderName = dirInfo.Name.TrimEnd(':'); } return(new VSCodeWorkspace() { Path = uri, WorkspaceType = isWorkspace ? WorkspaceType.WorkspaceFile : WorkspaceType.ProjectFolder, RelativePath = typeWorkspace.Path, FolderName = folderName, ExtraInfo = typeWorkspace.MachineName, WorkspaceEnvironment = typeWorkspace.WorkspaceEnvironment.Value, VSCodeInstance = vscodeInstance, }); } } return(null); }
private List <VSCodeWorkspace> GetWorkspacesInVscdb(VSCodeInstance vscodeInstance, string filePath) { var dbFileResults = new List <VSCodeWorkspace>(); SqliteConnection sqliteConnection = null; try { sqliteConnection = new SqliteConnection($"Data Source={filePath};Mode=ReadOnly;"); sqliteConnection.Open(); if (sqliteConnection.State == System.Data.ConnectionState.Open) { var sqlite_cmd = sqliteConnection.CreateCommand(); sqlite_cmd.CommandText = "SELECT value FROM ItemTable WHERE key LIKE 'history.recentlyOpenedPathsList'"; var sqlite_datareader = sqlite_cmd.ExecuteReader(); if (sqlite_datareader.Read()) { string entries = sqlite_datareader.GetString(0); if (!string.IsNullOrEmpty(entries)) { VSCodeStorageEntries vscodeStorageEntries = JsonSerializer.Deserialize <VSCodeStorageEntries>(entries); if (vscodeStorageEntries.Entries != null) { vscodeStorageEntries.Entries = vscodeStorageEntries.Entries.Where(x => x != null).ToList(); foreach (var entry in vscodeStorageEntries.Entries) { bool isWorkspaceFile = false; var uri = entry.FolderUri; if (entry.Workspace != null && entry.Workspace.ConfigPath != null) { isWorkspaceFile = true; uri = entry.Workspace.ConfigPath; } var workspace = ParseVSCodeUri(uri, vscodeInstance, isWorkspaceFile); if (workspace != null) { dbFileResults.Add(workspace); } } } } } } } catch (Exception e) { var message = $"Failed to retrieve workspaces from db: {filePath}"; Log.Exception(message, e, GetType()); } finally { sqliteConnection?.Close(); } return(dbFileResults); }
private List <VSCodeWorkspace> GetWorkspacesInJson(VSCodeInstance vscodeInstance, string filePath) { var storageFileResults = new List <VSCodeWorkspace>(); var fileContent = File.ReadAllText(filePath); try { VSCodeStorageFile vscodeStorageFile = JsonSerializer.Deserialize <VSCodeStorageFile>(fileContent); if (vscodeStorageFile != null && vscodeStorageFile.OpenedPathsList != null) { // for previous versions of vscode if (vscodeStorageFile.OpenedPathsList.Workspaces3 != null) { foreach (var workspaceUri in vscodeStorageFile.OpenedPathsList.Workspaces3) { var workspace = ParseVSCodeUri(workspaceUri, vscodeInstance); if (workspace != null) { storageFileResults.Add(workspace); } } } // vscode v1.55.0 or later if (vscodeStorageFile.OpenedPathsList.Entries != null) { foreach (var entry in vscodeStorageFile.OpenedPathsList.Entries) { bool isWorkspaceFile = false; var uri = entry.FolderUri; if (entry.Workspace != null && entry.Workspace.ConfigPath != null) { isWorkspaceFile = true; uri = entry.Workspace.ConfigPath; } var workspace = ParseVSCodeUri(uri, vscodeInstance, isWorkspaceFile); if (workspace != null) { storageFileResults.Add(workspace); } } } } } catch (Exception ex) { var message = $"Failed to deserialize {filePath}"; Log.Exception(message, ex, GetType()); } return(storageFileResults); }
private VSCodeWorkspace parseVSCodeUri(string uri, VSCodeInstance vscodeInstance) { if (uri != null && uri is String) { string unescapeUri = Uri.UnescapeDataString(uri); var typeWorkspace = ParseVSCodeUri.GetTypeWorkspace(unescapeUri); if (typeWorkspace.TypeWorkspace.HasValue) { var folderName = Path.GetFileName(unescapeUri); return(new VSCodeWorkspace() { Path = uri, RelativePath = typeWorkspace.Path, FolderName = folderName, ExtraInfo = typeWorkspace.MachineName, TypeWorkspace = typeWorkspace.TypeWorkspace.Value, VSCodeInstance = vscodeInstance }); } } return(null); }