Get the default sketchbook path from backend

Signed-off-by: jbicker <jan.bicker@typefox.io>
This commit is contained in:
jbicker 2019-08-26 15:59:18 +02:00
parent d809daa20a
commit d5589c435f
8 changed files with 65 additions and 27 deletions

View File

@ -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<Sketch[]> {
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);

View File

@ -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);

View File

@ -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<string | undefined> {
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);

View File

@ -0,0 +1,12 @@
export const ConfigServicePath = '/services/config-service';
export const ConfigService = Symbol('ConfigService');
export interface ConfigService {
getConfiguration(): Promise<Config>;
}
export interface Config {
sketchDirPath: string;
dataDirPath: string;
}

View File

@ -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 }) => {

View File

@ -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<ArduinoCli.Config> {
async getDefaultConfig(): Promise<Config> {
const command = await this.getExecPath();
return new Promise<ArduinoCli.Config>((resolve, reject) => {
return new Promise<Config>((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<ArduinoCli.Config> = {};
const config: Partial<Config> = {};
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;
}
}
}

View File

@ -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<Config> {
return this.cli.getDefaultConfig();
}
}

View File

@ -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<string | undefined> {
return FileUri.create(path.join(os.homedir(), 'Arduino-PoC', 'Sketches')).toString();
const config = await this.configService.getConfiguration();
return FileUri.create(config.sketchDirPath).toString();
}
}