From d5589c435f4fe1c6421d8aa90d7df83ba187f4e4 Mon Sep 17 00:00:00 2001 From: jbicker Date: Mon, 26 Aug 2019 15:59:18 +0200 Subject: [PATCH] Get the default sketchbook path from backend Signed-off-by: jbicker --- .../browser/arduino-frontend-contribution.tsx | 12 +++++++----- .../src/browser/arduino-frontend-module.ts | 4 ++++ .../src/browser/arduino-workspace-service.ts | 13 ++++++------- .../src/common/protocol/config-service.ts | 12 ++++++++++++ .../src/node/arduino-backend-module.ts | 11 +++++++++++ arduino-ide-extension/src/node/arduino-cli.ts | 16 +++++----------- .../src/node/config-service-impl.ts | 14 ++++++++++++++ .../src/node/default-workspace-server-ext.ts | 10 ++++++---- 8 files changed, 65 insertions(+), 27 deletions(-) create mode 100644 arduino-ide-extension/src/common/protocol/config-service.ts create mode 100644 arduino-ide-extension/src/node/config-service-impl.ts diff --git a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx index 3915f297..87b953ca 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx +++ b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx @@ -46,6 +46,7 @@ import { BoardsConfigDialog } from './boards/boards-config-dialog'; import { BoardsToolBarItem } from './boards/boards-toolbar-item'; import { BoardsConfig } from './boards/boards-config'; import { MonitorService } from '../common/protocol/monitor-service'; +import { ConfigService } from '../common/protocol/config-service'; export namespace ArduinoMenus { export const SKETCH = [...MAIN_MENU_BAR, '3_sketch']; @@ -140,6 +141,9 @@ export class ArduinoFrontendContribution implements TabBarToolbarContribution, C @inject(WorkspaceService) protected readonly workspaceService: WorkspaceService; + @inject(ConfigService) + protected readonly configService: ConfigService; + protected boardsToolbarItem: BoardsToolBarItem | null; protected wsSketchCount: number = 0; @@ -452,11 +456,9 @@ export class ArduinoFrontendContribution implements TabBarToolbarContribution, C protected async getWorkspaceSketches(): Promise { let sketches: Sketch[] = []; - const userHome = await this.fileSystem.getCurrentUserHome(); - console.log('userHome', userHome); - if (!!userHome) { - // TODO: get this from the backend - const result = new URI(userHome.uri).resolve('Arduino-PoC').resolve('Sketches').toString(); + const config = await this.configService.getConfiguration(); + const result = config.sketchDirPath; + if (!!result) { const stat = await this.fileSystem.getFileStat(result); if (!!stat) { sketches = await this.sketches.getSketches(stat); diff --git a/arduino-ide-extension/src/browser/arduino-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-frontend-module.ts index 2cd6b476..4e74e2c9 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-frontend-module.ts @@ -56,6 +56,7 @@ import { LibraryItemRenderer } from './library/library-item-renderer'; import { BoardItemRenderer } from './boards/boards-item-renderer'; import { MonitorServiceClientImpl } from './monitor/monitor-service-client-impl'; import { MonitorServicePath, MonitorService, MonitorServiceClient } from '../common/protocol/monitor-service'; +import { ConfigService, ConfigServicePath } from '../common/protocol/config-service'; const ElementQueries = require('css-element-queries/src/ElementQueries'); if (!ARDUINO_PRO_MODE) { @@ -96,6 +97,9 @@ export default new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Un // Sketch list service bind(SketchesService).toDynamicValue(context => WebSocketConnectionProvider.createProxy(context.container, SketchesServicePath)).inSingletonScope(); + // Config service + bind(ConfigService).toDynamicValue(context => WebSocketConnectionProvider.createProxy(context.container, ConfigServicePath)).inSingletonScope(); + // Boards service bind(BoardsService).toDynamicValue(context => { const connection = context.container.get(WebSocketConnectionProvider); diff --git a/arduino-ide-extension/src/browser/arduino-workspace-service.ts b/arduino-ide-extension/src/browser/arduino-workspace-service.ts index 304a33e8..f40857ee 100644 --- a/arduino-ide-extension/src/browser/arduino-workspace-service.ts +++ b/arduino-ide-extension/src/browser/arduino-workspace-service.ts @@ -4,6 +4,7 @@ import { WorkspaceServer } from "@theia/workspace/lib/common"; import { FileSystem, FileStat } from "@theia/filesystem/lib/common"; import URI from "@theia/core/lib/common/uri"; import { SketchFactory } from "./sketch-factory"; +import { ConfigService } from "../common/protocol/config-service"; /** * This is workaround to have custom frontend binding for the default workspace, although we @@ -21,16 +22,14 @@ export class AWorkspaceService extends WorkspaceService { @inject(SketchFactory) protected readonly sketchFactory: SketchFactory; + @inject(ConfigService) + protected readonly configService: ConfigService; + protected async getDefaultWorkspacePath(): Promise { let result = await super.getDefaultWorkspacePath(); if (!result) { - const userHome = await this.fileSystem.getCurrentUserHome(); - if (!userHome) { - return; - } - - // The backend has created this location if it was missing. - result = new URI(userHome.uri).resolve('Arduino-PoC').resolve('Sketches').toString(); + const config = await this.configService.getConfiguration(); + result = config.sketchDirPath; } const stat = await this.fileSystem.getFileStat(result); diff --git a/arduino-ide-extension/src/common/protocol/config-service.ts b/arduino-ide-extension/src/common/protocol/config-service.ts new file mode 100644 index 00000000..6cc69d1a --- /dev/null +++ b/arduino-ide-extension/src/common/protocol/config-service.ts @@ -0,0 +1,12 @@ + +export const ConfigServicePath = '/services/config-service'; +export const ConfigService = Symbol('ConfigService'); + +export interface ConfigService { + getConfiguration(): Promise; +} + +export interface Config { + sketchDirPath: string; + dataDirPath: string; +} \ No newline at end of file diff --git a/arduino-ide-extension/src/node/arduino-backend-module.ts b/arduino-ide-extension/src/node/arduino-backend-module.ts index d6226a09..daeb3878 100644 --- a/arduino-ide-extension/src/node/arduino-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-backend-module.ts @@ -19,12 +19,14 @@ import { DefaultWorkspaceServerExt } from './default-workspace-server-ext'; import { WorkspaceServer } from '@theia/workspace/lib/common'; import { SketchesServiceImpl } from './sketches-service-impl'; import { SketchesService, SketchesServicePath } from '../common/protocol/sketches-service'; +import { ConfigService, ConfigServicePath } from '../common/protocol/config-service'; import { MonitorServiceImpl } from './monitor/monitor-service-impl'; import { MonitorService, MonitorServicePath, MonitorServiceClient } from '../common/protocol/monitor-service'; import { MonitorClientProvider } from './monitor/monitor-client-provider'; import { ArduinoCli } from './arduino-cli'; import { ArduinoCliContribution } from './arduino-cli-contribution'; import { CliContribution } from '@theia/core/lib/node'; +import { ConfigServiceImpl } from './config-service-impl'; export default new ContainerModule((bind, unbind, isBound, rebind) => { // Theia backend CLI contribution. @@ -53,6 +55,15 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bindBackendService(SketchesServicePath, SketchesService); }); bind(ConnectionContainerModule).toConstantValue(sketchesServiceConnectionModule); + + bind(ConfigServiceImpl).toSelf().inSingletonScope(); + bind(ConfigService).toService(ConfigServiceImpl); + + // Config service + const configServiceConnectionModule = ConnectionContainerModule.create(({ bind, bindBackendService }) => { + bindBackendService(ConfigServicePath, ConfigService); + }); + bind(ConnectionContainerModule).toConstantValue(configServiceConnectionModule); // Boards service const boardsServiceConnectionModule = ConnectionContainerModule.create(({ bind, bindBackendService }) => { diff --git a/arduino-ide-extension/src/node/arduino-cli.ts b/arduino-ide-extension/src/node/arduino-cli.ts index 66514f92..007f9f7d 100644 --- a/arduino-ide-extension/src/node/arduino-cli.ts +++ b/arduino-ide-extension/src/node/arduino-cli.ts @@ -3,6 +3,7 @@ import * as which from 'which'; import * as cp from 'child_process'; import { join, delimiter } from 'path'; import { injectable } from 'inversify'; +import { Config } from '../common/protocol/config-service'; @injectable() export class ArduinoCli { @@ -20,9 +21,9 @@ export class ArduinoCli { }); } - async getDefaultConfig(): Promise { + async getDefaultConfig(): Promise { const command = await this.getExecPath(); - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { cp.execFile( command, ['config', 'dump', '--format', 'json'], @@ -41,7 +42,7 @@ export class ArduinoCli { // https://github.com/arduino/arduino-cli/issues/342 // XXX: this is a hack. The CLI provides a non-valid JSON. - const config: Partial = {}; + const config: Partial = {}; const raw = stdout.trim(); for (const line of raw.split(/\r?\n/) || []) { // TODO: Named capture groups are avail from ES2018. @@ -69,11 +70,4 @@ export class ArduinoCli { }); } -} - -export namespace ArduinoCli { - export interface Config { - sketchDirPath: string; - dataDirPath: string; - } -} +} \ No newline at end of file diff --git a/arduino-ide-extension/src/node/config-service-impl.ts b/arduino-ide-extension/src/node/config-service-impl.ts new file mode 100644 index 00000000..f869fd9a --- /dev/null +++ b/arduino-ide-extension/src/node/config-service-impl.ts @@ -0,0 +1,14 @@ +import { injectable, inject } from "inversify"; +import { ConfigService, Config } from "../common/protocol/config-service"; +import { ArduinoCli } from "./arduino-cli"; + +@injectable() +export class ConfigServiceImpl implements ConfigService { + + @inject(ArduinoCli) + protected readonly cli: ArduinoCli; + + async getConfiguration(): Promise { + return this.cli.getDefaultConfig(); + } +} \ No newline at end of file diff --git a/arduino-ide-extension/src/node/default-workspace-server-ext.ts b/arduino-ide-extension/src/node/default-workspace-server-ext.ts index c747408e..a5a17e1b 100644 --- a/arduino-ide-extension/src/node/default-workspace-server-ext.ts +++ b/arduino-ide-extension/src/node/default-workspace-server-ext.ts @@ -1,14 +1,16 @@ -import * as os from 'os'; -import * as path from 'path'; -import { injectable } from 'inversify'; +import { injectable, inject } from 'inversify'; import { FileUri } from '@theia/core/lib/node/file-uri'; import { DefaultWorkspaceServer } from '@theia/workspace/lib/node/default-workspace-server'; +import { ConfigService } from '../common/protocol/config-service'; @injectable() export class DefaultWorkspaceServerExt extends DefaultWorkspaceServer { + @inject(ConfigService) protected readonly configService: ConfigService; + protected async getWorkspaceURIFromCli(): Promise { - return FileUri.create(path.join(os.homedir(), 'Arduino-PoC', 'Sketches')).toString(); + const config = await this.configService.getConfiguration(); + return FileUri.create(config.sketchDirPath).toString(); } } \ No newline at end of file