#40: Support for remote Windows mounts - partial

This commit is contained in:
2019-10-05 17:17:24 -05:00
parent 38825f970a
commit 9be55984bc
13 changed files with 268 additions and 185 deletions

View File

@@ -39,8 +39,8 @@
"build": "react-scripts build", "build": "react-scripts build",
"test": "react-scripts test", "test": "react-scripts test",
"eject": "react-scripts eject", "eject": "react-scripts eject",
"electron-dev": "cross-env ELECTRON_START_URL=http://localhost:3001 electron .", "electron-dev": "cross-env ELECTRON_START_URL=http://localhost:3000 electron .",
"electron-dev-unix": "cross-env ELECTRON_START_URL=http://localhost:3001 electron .", "electron-dev-unix": "cross-env ELECTRON_START_URL=http://localhost:3000 electron .",
"pack": "npm run build && electron-builder --dir --x64", "pack": "npm run build && electron-builder --dir --x64",
"dist": "npm run build && electron-builder --x64", "dist": "npm run build && electron-builder --x64",
"dist-all": "npm run build && electron-builder --x64 --win --linux --mac", "dist-all": "npm run build && electron-builder --x64 --win --linux --mac",

View File

@@ -20,7 +20,7 @@ const mapStateToProps = (state, ownProps) => {
const mapDispatchToProps = dispatch => { const mapDispatchToProps = dispatch => {
return { return {
displayConfiguration: provider => dispatch(displayConfiguration(provider)), displayConfiguration: (provider, remote) => dispatch(displayConfiguration(provider, remote)),
setProviderState: (provider, state) => dispatch(setProviderState(provider, state)), setProviderState: (provider, state) => dispatch(setProviderState(provider, state)),
} }
}; };
@@ -51,7 +51,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(props => {
rowSpan={6}> rowSpan={6}>
<img alt='' <img alt=''
height={'16px'} height={'16px'}
onClick={props.MState.AllowMount ? ()=>props.displayConfiguration(props.provider) : e=>{e.preventDefault();}} onClick={props.MState.AllowMount ? ()=>props.displayConfiguration(props.provider, props.remote) : e=>{e.preventDefault();}}
src={configureImage} src={configureImage}
style={{padding: 0, border: 0, margin: 0, ...pointer}} style={{padding: 0, border: 0, margin: 0, ...pointer}}
width={'16px'}/> width={'16px'}/>
@@ -108,7 +108,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(props => {
width='19px'/>; width='19px'/>;
const actionsDisplay = ( const actionsDisplay = (
<Button clicked={()=>props.clicked(props.provider, !props.MState.Mounted, props.PState.MountLocation)} <Button clicked={()=>props.clicked(props.provider, props.remote, !props.MState.Mounted, props.PState.MountLocation)}
col={inputColumnSpan + 2} col={inputColumnSpan + 2}
colSpan={21} colSpan={21}
disabled={!props.MState.AllowMount} disabled={!props.MState.AllowMount}
@@ -146,7 +146,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(props => {
<Text <Text
col={configButton ? 6 : 0} col={configButton ? 6 : 0}
rowSpan={5} rowSpan={5}
text={props.provider} text={props.remote ? props.provider.substr(6) : props.provider}
type={'Heading1'}/> type={'Heading1'}/>
{inputControls} {inputControls}
{actionsDisplay} {actionsDisplay}

View File

@@ -70,6 +70,7 @@ class Configuration extends IPCContainer {
this.setRequestHandler(Constants.IPC_Set_Config_Values_Reply, this.onSetConfigValuesReply); this.setRequestHandler(Constants.IPC_Set_Config_Values_Reply, this.onSetConfigValuesReply);
this.sendRequest(Constants.IPC_Get_Config_Template, { this.sendRequest(Constants.IPC_Get_Config_Template, {
Provider: this.props.DisplayConfiguration, Provider: this.props.DisplayConfiguration,
Remote: this.props.DisplayRemoteConfiguration,
Version: this.props.version, Version: this.props.version,
}); });
} }
@@ -161,6 +162,7 @@ class Configuration extends IPCContainer {
}, ()=> { }, ()=> {
this.sendRequest(Constants.IPC_Get_Config, { this.sendRequest(Constants.IPC_Get_Config, {
Provider: this.props.DisplayConfiguration, Provider: this.props.DisplayConfiguration,
Remote: this.props.DisplayRemoteConfiguration,
Version: this.props.version, Version: this.props.version,
}); });
}); });
@@ -203,6 +205,7 @@ class Configuration extends IPCContainer {
this.sendRequest(Constants.IPC_Set_Config_Values, { this.sendRequest(Constants.IPC_Set_Config_Values, {
Items: changedItems, Items: changedItems,
Provider: this.props.DisplayConfiguration, Provider: this.props.DisplayConfiguration,
Remote: this.props.DisplayRemoteConfiguration,
Version: this.props.version, Version: this.props.version,
}); });
}); });
@@ -215,7 +218,7 @@ class Configuration extends IPCContainer {
(item.label !== 'IsRemoteMount')) { (item.label !== 'IsRemoteMount')) {
const isRemoteMount = JSON.parse(itemList.find(s=>s.label === 'IsRemoteMount').value); const isRemoteMount = JSON.parse(itemList.find(s=>s.label === 'IsRemoteMount').value);
const enableRemoteMount = JSON.parse(itemList.find(s=>s.label === 'EnableRemoteMount').value); const enableRemoteMount = JSON.parse(itemList.find(s=>s.label === 'EnableRemoteMount').value);
return (item.label === 'RemoteHostNameOrIp') ? return (item.label === 'RemoteHostNameOrIp') || (item.label === 'RemotePort') || (item.label === 'RemoteToken') ?
isRemoteMount : isRemoteMount :
(item.label === 'EnableRemoteMount') ? (item.label === 'EnableRemoteMount') ?
!isRemoteMount : !isRemoteMount :
@@ -291,7 +294,10 @@ class Configuration extends IPCContainer {
<b style={{cursor: 'pointer'}} <b style={{cursor: 'pointer'}}
onClick={this.checkSaveRequired}>X</b> onClick={this.checkSaveRequired}>X</b>
</div> </div>
<h1 style={{width: '100%', textAlign: 'center'}}>{this.props.DisplayConfiguration + ' Configuration'}</h1> <h1 style={{width: '100%', textAlign: 'center'}}>{(
this.props.DisplayRemoteConfiguration ?
this.props.DisplayConfiguration.substr(6) :
this.props.DisplayConfiguration) + ' Configuration'}</h1>
<div style={{overflowY: 'auto', height: '90%'}}> <div style={{overflowY: 'auto', height: '90%'}}>
{objectItems} {objectItems}
{(configurationItems.length > 0) ? <h1>Settings</h1> : null} {(configurationItems.length > 0) ? <h1>Settings</h1> : null}
@@ -306,13 +312,14 @@ class Configuration extends IPCContainer {
const mapStateToProps = state => { const mapStateToProps = state => {
return { return {
DisplayConfiguration: state.mounts.DisplayConfiguration, DisplayConfiguration: state.mounts.DisplayConfiguration,
DisplayRemoteConfiguration: state.mounts.DisplayRemoteConfiguration,
} }
}; };
const mapDispatchToProps = dispatch => { const mapDispatchToProps = dispatch => {
return { return {
notifyError: (msg, critical, callback) => dispatch(notifyError(msg, critical, callback)), notifyError: (msg, critical, callback) => dispatch(notifyError(msg, critical, callback)),
hideConfiguration: () => dispatch(displayConfiguration(null)), hideConfiguration: () => dispatch(displayConfiguration(null, false)),
} }
}; };

View File

@@ -72,12 +72,13 @@ class MountItems extends IPCContainer {
if (!this.state.DisplayRetry) { if (!this.state.DisplayRetry) {
this.props.setMountsBusy(true); this.props.setMountsBusy(true);
this.sendRequest(Constants.IPC_Detect_Mounts, { this.sendRequest(Constants.IPC_Detect_Mounts, {
RemoteMounts: this.props.RemoteMounts,
Version: this.props.InstalledVersion, Version: this.props.InstalledVersion,
}); });
} }
}; };
displayRetryMount = (provider, mountLocation, msg) => { displayRetryMount = (provider, remote, mountLocation, msg) => {
if (!this.state.RetryItems[provider]) { if (!this.state.RetryItems[provider]) {
let retryItems = { let retryItems = {
...this.state.RetryItems ...this.state.RetryItems
@@ -104,7 +105,7 @@ class MountItems extends IPCContainer {
const retrySeconds = retryItems[provider].RetrySeconds - 1; const retrySeconds = retryItems[provider].RetrySeconds - 1;
if (retrySeconds === 0) { if (retrySeconds === 0) {
this.cancelRetryMount(provider, () => { this.cancelRetryMount(provider, () => {
this.handleMountUnMount(provider, true, mountLocation); this.handleMountUnMount(provider, remote,true, mountLocation);
}); });
} else { } else {
retryItems[provider].RetrySeconds = retrySeconds; retryItems[provider].RetrySeconds = retrySeconds;
@@ -139,16 +140,20 @@ class MountItems extends IPCContainer {
this.props.setProviderState(provider, state); this.props.setProviderState(provider, state);
}; };
handleMountUnMount = (provider, mount, location) => { handleMountUnMount = (provider, remote, mount, location) => {
console.log(provider, remote, mount, location);
if (!location || (location.trim().length === 0)) { if (!location || (location.trim().length === 0)) {
this.props.notifyError('Mount location is not set'); this.props.notifyError('Mount location is not set');
} else { } else {
let allowAction = true; let allowAction = true;
if (mount) { if (mount) {
let result = this.sendSyncRequest(Constants.IPC_Check_Daemon_Version, { let result = remote ?
Provider: provider, {Valid: true, Success: true} :
Version: this.props.InstalledVersion this.sendSyncRequest(Constants.IPC_Check_Daemon_Version, {
}).data; Provider: provider,
Remote: remote,
Version: this.props.InstalledVersion
}).data;
if (result.Success) { if (result.Success) {
if (result.Valid) { if (result.Valid) {
if (this.props.Platform !== 'win32') { if (this.props.Platform !== 'win32') {
@@ -163,11 +168,11 @@ class MountItems extends IPCContainer {
} else { } else {
allowAction = false; allowAction = false;
if ((result.Code === new Uint32Array([-1])[0]) || (result.Code === new Uint8Array([-1])[0])) { if ((result.Code === new Uint32Array([-1])[0]) || (result.Code === new Uint8Array([-1])[0])) {
this.displayRetryMount(provider, location, 'Failed to connect to ' + provider + ' daemon'); this.displayRetryMount(provider, remote, location, 'Failed to connect to ' + provider + ' daemon');
} else if ((result.Code === new Uint32Array([-3])[0]) || (result.Code === new Uint8Array([-3])[0])) { } else if ((result.Code === new Uint32Array([-3])[0]) || (result.Code === new Uint8Array([-3])[0])) {
this.displayRetryMount(provider, location, 'Incompatible ' + provider + ' daemon. Please upgrade ' + provider + '.'); this.displayRetryMount(provider, remote, location, 'Incompatible ' + provider + ' daemon. Please upgrade ' + provider + '.');
} else { } else {
this.displayRetryMount(provider, location, 'Version check failed: ' + result.Error); this.displayRetryMount(provider, remote, location, 'Version check failed: ' + result.Error);
} }
} }
} else { } else {
@@ -175,7 +180,7 @@ class MountItems extends IPCContainer {
if (this.props.Platform === 'win32') { if (this.props.Platform === 'win32') {
this.props.notifyError('Failed to launch repertory. Please install Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019.'); this.props.notifyError('Failed to launch repertory. Please install Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019.');
} else { } else {
this.displayRetryMount(provider, location, 'Version check failed: ' + result.Error); this.displayRetryMount(provider, remote, location, 'Version check failed: ' + result.Error);
} }
} }
} }
@@ -189,12 +194,14 @@ class MountItems extends IPCContainer {
Location: location, Location: location,
NoConsoleSupported: this.props.noConsoleSupported, NoConsoleSupported: this.props.noConsoleSupported,
Provider: provider, Provider: provider,
Remote: remote,
Version: this.props.InstalledVersion, Version: this.props.InstalledVersion,
}); });
} else { } else {
this.sendRequest(Constants.IPC_Unmount_Drive, { this.sendRequest(Constants.IPC_Unmount_Drive, {
Location: location, Location: location,
Provider: provider, Provider: provider,
Remote: remote,
Version: this.props.InstalledVersion, Version: this.props.InstalledVersion,
}); });
} }
@@ -202,11 +209,19 @@ class MountItems extends IPCContainer {
} }
}; };
getProviderList = () => {
return [
...Constants.PROVIDER_LIST,
...this.props.RemoteMounts,
];
};
onDetectMountsReply = (event, arg) => { onDetectMountsReply = (event, arg) => {
if (!this.state.DisplayRetry && arg.data.Success) { if (!this.state.DisplayRetry && arg.data.Success) {
let mountsBusy = false; let mountsBusy = false;
let mountStates = {}; let mountStates = {};
for (const provider of Constants.PROVIDER_LIST) {
for (const provider of this.getProviderList()) {
const mountState = { const mountState = {
AllowMount: true, AllowMount: true,
DriveLetters: (arg.data.DriveLetters[provider]), DriveLetters: (arg.data.DriveLetters[provider]),
@@ -238,11 +253,11 @@ class MountItems extends IPCContainer {
this.props.ProviderState[provider].AutoMount && this.props.ProviderState[provider].AutoMount &&
!mountStates[provider].Mounted && !mountStates[provider].Mounted &&
(location.length > 0)) { (location.length > 0)) {
this.handleMountUnMount(provider, true, location); this.handleMountUnMount(provider, this.props.RemoteMounts.includes(provider),true, location);
} }
}; };
for (const provider of Constants.PROVIDER_LIST) { for (const provider of this.getProviderList()) {
updateMountLocation(arg.data, provider); updateMountLocation(arg.data, provider);
} }
@@ -259,7 +274,7 @@ class MountItems extends IPCContainer {
onUnmountDriveReply = (event, arg) => { onUnmountDriveReply = (event, arg) => {
if (arg && arg.data && !arg.data.Expected && arg.data.Location && this.props.ProviderState[arg.data.Provider].AutoRestart) { if (arg && arg.data && !arg.data.Expected && arg.data.Location && this.props.ProviderState[arg.data.Provider].AutoRestart) {
this.displayRetryMount(arg.data.Provider, arg.data.Location); this.displayRetryMount(arg.data.Provider, arg.data.Remote, arg.data.Location);
} else { } else {
this.detectMounts(); this.detectMounts();
} }
@@ -296,6 +311,12 @@ class MountItems extends IPCContainer {
} }
let items = []; let items = [];
if (this.props.remoteSupported) {
items.push(<AddRemoteMount key={'mi_' + items.length}/>);
items.push(<div key={'di_' + items.length}
style={{paddingTop: '4px'}} />)
}
for (const provider of Constants.PROVIDER_LIST) { for (const provider of Constants.PROVIDER_LIST) {
items.push(( items.push((
<MountItem allowConfig={this.props.allowConfig} <MountItem allowConfig={this.props.allowConfig}
@@ -319,13 +340,15 @@ class MountItems extends IPCContainer {
changed={e => this.handleMountLocationChanged(provider, e.target.value)} changed={e => this.handleMountLocationChanged(provider, e.target.value)}
clicked={this.handleMountUnMount} clicked={this.handleMountUnMount}
key={'mi_' + items.length} key={'mi_' + items.length}
provider={provider}/> provider={provider}
remote/>
)); ));
items.push(<div key={'di_' + items.length} items.push(<div key={'di_' + items.length}
style={{paddingTop: '4px'}}/>) style={{paddingTop: '4px'}}/>)
} }
if (this.props.RemoteMounts.length > 0) {
items.push(<AddRemoteMount key={'mia_' + items.length + 1}/>); items.splice(items.length - 1, 1);
}
} else { } else {
items.splice(items.length - 1, 1) items.splice(items.length - 1, 1)
} }

View File

@@ -130,7 +130,7 @@ module.exports.createSignatureFiles = (signature, publicKey) => {
}; };
}; };
module.exports.detectRepertoryMounts = version => { module.exports.detectRepertoryMounts = (version, providerList) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const processOptions = { const processOptions = {
detached: true, detached: true,
@@ -155,7 +155,7 @@ module.exports.detectRepertoryMounts = version => {
process.on('exit', () => { process.on('exit', () => {
let defaultData = {}; let defaultData = {};
for (const provider of Constants.PROVIDER_LIST) { for (const provider of providerList) {
defaultData[provider] = { defaultData[provider] = {
Active: false, Active: false,
Location: '', Location: '',
@@ -320,7 +320,7 @@ module.exports.executeScript = script => {
}); });
}; };
module.exports.executeMount = (version, provider, location, noConsoleSupported, exitCallback) => { module.exports.executeMount = (version, provider, remote, location, noConsoleSupported, exitCallback) => {
return new Promise((resolve) => { return new Promise((resolve) => {
const processOptions = { const processOptions = {
detached: false, detached: false,
@@ -330,7 +330,10 @@ module.exports.executeMount = (version, provider, location, noConsoleSupported,
const command = path.join(_getDataDirectory(), version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory'); const command = path.join(_getDataDirectory(), version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory');
const args = []; const args = [];
if (Constants.PROVIDER_ARG[provider.toLowerCase()].length > 0) { if (remote) {
args.push('-rm');
args.push(provider.substr(6));
} else if (Constants.PROVIDER_ARG[provider.toLowerCase()].length > 0) {
args.push(Constants.PROVIDER_ARG[provider.toLowerCase()]); args.push(Constants.PROVIDER_ARG[provider.toLowerCase()]);
} }
@@ -365,7 +368,7 @@ module.exports.executeMount = (version, provider, location, noConsoleSupported,
}); });
}; };
module.exports.getConfig = (version, provider) => { module.exports.getConfig = (version, provider, remote) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const processOptions = { const processOptions = {
detached: true, detached: true,
@@ -376,7 +379,10 @@ module.exports.getConfig = (version, provider) => {
const command = path.join(_getDataDirectory(), version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory'); const command = path.join(_getDataDirectory(), version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory');
const args = []; const args = [];
args.push('-dc'); args.push('-dc');
if (Constants.PROVIDER_ARG[provider.toLowerCase()].length > 0) { if (remote) {
args.push('-rm');
args.push(provider.substr(6));
} else if (Constants.PROVIDER_ARG[provider.toLowerCase()].length > 0) {
args.push(Constants.PROVIDER_ARG[provider.toLowerCase()]); args.push(Constants.PROVIDER_ARG[provider.toLowerCase()]);
} }
@@ -411,7 +417,7 @@ module.exports.getConfig = (version, provider) => {
}); });
}; };
module.exports.getConfigTemplate = (version, provider) => { module.exports.getConfigTemplate = (version, provider, remote) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const processOptions = { const processOptions = {
detached: true, detached: true,
@@ -422,7 +428,10 @@ module.exports.getConfigTemplate = (version, provider) => {
const command = path.join(_getDataDirectory(), version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory'); const command = path.join(_getDataDirectory(), version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory');
const args = []; const args = [];
args.push('-gt'); args.push('-gt');
if (Constants.PROVIDER_ARG[provider.toLowerCase()].length > 0) { if (remote) {
args.push('-rm');
args.push(provider.substr(6));
} else if (Constants.PROVIDER_ARG[provider.toLowerCase()].length > 0) {
args.push(Constants.PROVIDER_ARG[provider.toLowerCase()]); args.push(Constants.PROVIDER_ARG[provider.toLowerCase()]);
} }
@@ -625,7 +634,7 @@ module.exports.removeDirectoryRecursively = (p) => {
module.exports.resolvePath = _resolvePath; module.exports.resolvePath = _resolvePath;
module.exports.setConfigValue = (name, value, provider, version) => { module.exports.setConfigValue = (name, value, provider, remote, version) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const processOptions = { const processOptions = {
detached: true, detached: true,
@@ -638,7 +647,10 @@ module.exports.setConfigValue = (name, value, provider, version) => {
args.push('-set'); args.push('-set');
args.push(name); args.push(name);
args.push(value); args.push(value);
if (Constants.PROVIDER_ARG[provider.toLowerCase()].length > 0) { if (remote) {
args.push('-rm');
args.push(provider.substr(6));
} else if (Constants.PROVIDER_ARG[provider.toLowerCase()].length > 0) {
args.push(Constants.PROVIDER_ARG[provider.toLowerCase()]); args.push(Constants.PROVIDER_ARG[provider.toLowerCase()]);
} }
@@ -656,7 +668,7 @@ module.exports.setConfigValue = (name, value, provider, version) => {
}); });
}; };
module.exports.stopMountProcess = (version, provider) => { module.exports.stopMountProcess = (version, provider, remote) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const processOptions = { const processOptions = {
detached: os.platform() === 'darwin', detached: os.platform() === 'darwin',
@@ -666,7 +678,10 @@ module.exports.stopMountProcess = (version, provider) => {
const command = path.join(_getDataDirectory(), version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory'); const command = path.join(_getDataDirectory(), version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory');
const args = ['-unmount']; const args = ['-unmount'];
if (Constants.PROVIDER_ARG[provider.toLowerCase()].length > 0) { if (remote) {
args.push('-rm');
args.push(provider.substr(6));
} else if (Constants.PROVIDER_ARG[provider.toLowerCase()].length > 0) {
args.push(Constants.PROVIDER_ARG[provider.toLowerCase()]); args.push(Constants.PROVIDER_ARG[provider.toLowerCase()]);
} }
@@ -688,7 +703,7 @@ module.exports.stopMountProcess = (version, provider) => {
}); });
}; };
module.exports.stopMountProcessSync = (version, provider) => { module.exports.stopMountProcessSync = (version, provider, remote) => {
const processOptions = { const processOptions = {
detached: true, detached: true,
shell: os.platform() !== 'darwin', shell: os.platform() !== 'darwin',
@@ -697,7 +712,10 @@ module.exports.stopMountProcessSync = (version, provider) => {
const command = path.join(_getDataDirectory(), version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory'); const command = path.join(_getDataDirectory(), version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory');
const args = ['-unmount']; const args = ['-unmount'];
if (Constants.PROVIDER_ARG[provider.toLowerCase()].length > 0) { if (remote) {
args.push('-rm');
args.push(provider.substr(6));
} else if (Constants.PROVIDER_ARG[provider.toLowerCase()].length > 0) {
args.push(Constants.PROVIDER_ARG[provider.toLowerCase()]); args.push(Constants.PROVIDER_ARG[provider.toLowerCase()]);
} }

View File

@@ -16,19 +16,22 @@ const ipcRenderer = getIPCRenderer();
let store; let store;
if (ipcRenderer) { if (ipcRenderer) {
ipcRenderer.on(Constants.IPC_Get_Platform_Reply, (event, arg) => { ipcRenderer.on(Constants.IPC_Get_Platform_Reply, (event, platformInfo) => {
if (arg.Platform === 'linux') { if (platformInfo.Platform === 'linux') {
const root = document.documentElement; const root = document.documentElement;
root.style.setProperty('--default_font_size', '15.3px'); root.style.setProperty('--default_font_size', '15.3px');
} }
store = createAppStore(arg.Platform, arg.AppPlatform, packageJson.version); ipcRenderer.on(Constants.IPC_Get_State_Reply, (event, result) => {
ipcRenderer.on(Constants.IPC_Get_State_Reply, (event, arg) => { if (result.data) {
if (arg.data) { store = createAppStore(platformInfo, packageJson.version, result.data);
store.dispatch(setActiveRelease(arg.data.Release, arg.data.Version)); store.dispatch(setActiveRelease(result.data.Release, result.data.Version));
const providerList = [
for (const provider of Constants.PROVIDER_LIST) { ...Constants.PROVIDER_LIST,
let state = arg.data[provider] || store.getState().mounts.ProviderState[provider]; ...store.getState().mounts.RemoteMounts,
];
for (const provider of providerList) {
let state = result.data[provider] || store.getState().mounts.ProviderState[provider];
if (state.AutoMount === undefined) { if (state.AutoMount === undefined) {
state['AutoMount'] = false; state['AutoMount'] = false;
} }
@@ -37,7 +40,10 @@ if (ipcRenderer) {
} }
store.dispatch(setProviderState(provider, state)); store.dispatch(setProviderState(provider, state));
} }
} else {
store = createAppStore(platformInfo, packageJson.version, {});
} }
ReactDOM.render(( ReactDOM.render((
<Provider store={store}> <Provider store={store}>
<App/> <App/>

View File

@@ -68,10 +68,15 @@ export const saveState = () => {
if (state.common.AppReady) { if (state.common.AppReady) {
let currentState = { let currentState = {
Release: state.relver.Release, Release: state.relver.Release,
RemoteMounts: state.mounts.RemoteMounts,
Version: state.relver.Version, Version: state.relver.Version,
}; };
for (const provider of Constants.PROVIDER_LIST) { const providerList = [
...Constants.PROVIDER_LIST,
...state.mounts.RemoteMounts,
];
for (const provider of providerList) {
currentState[provider] = state.mounts.ProviderState[provider]; currentState[provider] = state.mounts.ProviderState[provider];
} }

View File

@@ -2,7 +2,16 @@ import * as Constants from '../../constants';
import {createAction} from 'redux-starter-kit'; import {createAction} from 'redux-starter-kit';
import {getIPCRenderer} from '../../utils'; import {getIPCRenderer} from '../../utils';
export const displayConfiguration = createAction('mounts/displayConfiguration'); export const DISPLAY_CONFIGURATION = 'mounts/displayConfiguration';
export const displayConfiguration = (provider, remote) => {
return {
type: DISPLAY_CONFIGURATION,
payload: {
provider,
remote,
},
};
};
export const RESET_MOUNTS_STATE = 'mounts/resetMountsState'; export const RESET_MOUNTS_STATE = 'mounts/resetMountsState';
export const resetMountsState = () => { export const resetMountsState = () => {

View File

@@ -7,13 +7,13 @@ import {
SET_DISPLAY_SELECT_APPPLATFORM SET_DISPLAY_SELECT_APPPLATFORM
} from '../actions/common_actions'; } from '../actions/common_actions';
export const createCommonReducer = (platform, appPlatform, version) => { export const createCommonReducer = (platformInfo, version) => {
return createReducer({ return createReducer({
AllowMount: false, AllowMount: false,
AppPlatform: appPlatform, AppPlatform: platformInfo.AppPlatform,
AppReady: false, AppReady: false,
DisplaySelectAppPlatform: false, DisplaySelectAppPlatform: false,
Platform: platform, Platform: platformInfo.Platform,
RebootRequired: false, RebootRequired: false,
Version: version, Version: version,
}, { }, {

View File

@@ -1,7 +1,7 @@
import * as Constants from '../../constants'; import * as Constants from '../../constants';
import {createReducer} from 'redux-starter-kit'; import {createReducer} from 'redux-starter-kit';
import { import {
displayConfiguration, DISPLAY_CONFIGURATION,
RESET_MOUNTS_STATE, RESET_MOUNTS_STATE,
SET_ALLOW_MOUNT, SET_ALLOW_MOUNT,
setAutoMountProcessed, setAutoMountProcessed,
@@ -11,115 +11,123 @@ import {
SET_PROVIDER_STATE SET_PROVIDER_STATE
} from '../actions/mount_actions'; } from '../actions/mount_actions';
const providerState = Constants.PROVIDER_LIST.map(provider=> { export const createMountReducer = state => {
return { let providerList = [
[provider]: { ...Constants.PROVIDER_LIST,
AutoMount: false, ...(state.RemoteMounts||['Remotelocalhost:20000']),
AutoRestart: false, ];
MountLocation: '', const providerState = providerList.map(provider=> {
return {
[provider]: {
AutoMount: false,
AutoRestart: false,
MountLocation: '',
}
} }
} }).reduce((map, obj) => {
}).reduce((map, obj) => { return {
return { ...map,
...map, ...obj
...obj }
} });
});
const mountState = Constants.PROVIDER_LIST.map(provider => { const mountState = providerList.map(provider => {
return { return {
[provider]: { [provider]: {
AllowMount: false, AllowMount: false,
DriveLetters: [], DriveLetters: [],
Mounted: false, Mounted: false,
}
} }
} }).reduce((map, obj) => {
}).reduce((map, obj) => { return {
return { ...map,
...map, ...obj
...obj }
} });
});
export const mountReducer = createReducer({ return createReducer({
AutoMountProcessed: false, AutoMountProcessed: false,
DisplayConfiguration: null, DisplayConfiguration: null,
MountsBusy: false, DisplayRemoteConfiguration: false,
MountState: mountState, MountsBusy: false,
ProviderState: providerState, MountState: mountState,
RemoteMounts: [], ProviderState: providerState,
}, { RemoteMounts: state.RemoteMounts ? state.RemoteMounts : ['Remotelocalhost:20000'],
[displayConfiguration]: (state, action) => { }, {
return { [DISPLAY_CONFIGURATION]: (state, action) => {
...state, return {
DisplayConfiguration: action.payload ...state,
}; DisplayConfiguration: action.payload.provider,
}, DisplayRemoteConfiguration: action.payload.remote,
[RESET_MOUNTS_STATE]: (state, action) => { };
return { },
...state, [RESET_MOUNTS_STATE]: (state, action) => {
MountsBusy: false, return {
MountState: mountState, ...state,
MountsBusy: false,
MountState: mountState,
}
},
[setAutoMountProcessed]: (state, action) => {
return {
...state,
AutoMountProcessed: action.payload
};
},
[SET_ALLOW_MOUNT]: (state, action) => {
return {
...state,
MountState: {
...state.MountState,
[action.payload.provider]: {
...state.MountState[action.payload.provider],
AllowMount: action.payload.allow,
}
}
};
},
[setBusy]: (state, action) => {
return {
...state,
MountsBusy: action.payload
};
},
[SET_MOUNT_STATE]: (state, action) => {
return {
...state,
MountState: {
...state.MountState,
[action.payload.provider]: {
...state.MountState[action.payload.provider],
...action.payload.state
},
}
};
},
[SET_MOUNTED]: (state, action) => {
return {
...state,
MountState: {
...state.MountState,
[action.payload.provider]: {
...state.MountState[action.payload.provider],
Mounted: action.payload.mounted,
}
}
};
},
[SET_PROVIDER_STATE]: (state, action) => {
return {
...state,
ProviderState: {
...state.ProviderState,
[action.payload.provider]: {
...state.ProviderState[action.payload.provider],
...action.payload.state
},
}
};
} }
}, });
[setAutoMountProcessed]: (state, action) => { };
return {
...state,
AutoMountProcessed: action.payload
};
},
[SET_ALLOW_MOUNT]: (state, action) => {
return {
...state,
MountState: {
...state.MountState,
[action.payload.provider]: {
...state.MountState[action.payload.provider],
AllowMount: action.payload.allow,
}
}
};
},
[setBusy]: (state, action) => {
return {
...state,
MountsBusy: action.payload
};
},
[SET_MOUNT_STATE]: (state, action) => {
return {
...state,
MountState: {
...state.MountState,
[action.payload.provider]: {
...state.MountState[action.payload.provider],
...action.payload.state
},
}
};
},
[SET_MOUNTED]: (state, action) => {
return {
...state,
MountState: {
...state.MountState,
[action.payload.provider]: {
...state.MountState[action.payload.provider],
Mounted: action.payload.mounted,
}
}
};
},
[SET_PROVIDER_STATE]: (state, action) => {
return {
...state,
ProviderState: {
...state.ProviderState,
[action.payload.provider]: {
...state.ProviderState[action.payload.provider],
...action.payload.state
},
}
};
}
});

View File

@@ -3,16 +3,16 @@ import {createCommonReducer} from '../reducers/common_reducer';
import {downloadReducer} from '../reducers/download_reducer'; import {downloadReducer} from '../reducers/download_reducer';
import {errorReducer} from '../reducers/error_reducer'; import {errorReducer} from '../reducers/error_reducer';
import {installReducer} from '../reducers/install_reducer'; import {installReducer} from '../reducers/install_reducer';
import {mountReducer} from '../reducers/mount_reducer'; import {createMountReducer} from '../reducers/mount_reducer';
import {releaseVersionReducer} from '../reducers/release_version_reducer'; import {releaseVersionReducer} from '../reducers/release_version_reducer';
export default function createAppStore(platform, appPlatform, version) { export default function createAppStore(platformInfo, version, state) {
const reducer = { const reducer = {
common: createCommonReducer(platform, appPlatform, version), common: createCommonReducer(platformInfo, version),
download: downloadReducer, download: downloadReducer,
error: errorReducer, error: errorReducer,
install: installReducer, install: installReducer,
mounts: mountReducer, mounts: createMountReducer(state),
relver: releaseVersionReducer, relver: releaseVersionReducer,
}; };

View File

@@ -4,7 +4,7 @@ const helpers = require('../../helpers');
const addListeners = (ipcMain, standardIPCReply) => { const addListeners = (ipcMain, standardIPCReply) => {
ipcMain.on(Constants.IPC_Get_Config, (event, data) => { ipcMain.on(Constants.IPC_Get_Config, (event, data) => {
helpers helpers
.getConfig(data.Version, data.Provider) .getConfig(data.Version, data.Provider, data.Remote)
.then((data) => { .then((data) => {
if (data.Code === 0) { if (data.Code === 0) {
standardIPCReply(event, Constants.IPC_Get_Config_Reply, { standardIPCReply(event, Constants.IPC_Get_Config_Reply, {
@@ -21,7 +21,7 @@ const addListeners = (ipcMain, standardIPCReply) => {
ipcMain.on(Constants.IPC_Get_Config_Template, (event, data) => { ipcMain.on(Constants.IPC_Get_Config_Template, (event, data) => {
helpers helpers
.getConfigTemplate(data.Version, data.Provider) .getConfigTemplate(data.Version, data.Provider, data.Remote)
.then((data) => { .then((data) => {
standardIPCReply(event, Constants.IPC_Get_Config_Template_Reply, { standardIPCReply(event, Constants.IPC_Get_Config_Template_Reply, {
Template: data, Template: data,
@@ -36,7 +36,7 @@ const addListeners = (ipcMain, standardIPCReply) => {
const setConfigValue = (i) => { const setConfigValue = (i) => {
if (i < data.Items.length) { if (i < data.Items.length) {
helpers helpers
.setConfigValue(data.Items[i].Name, data.Items[i].Value, data.Provider, data.Version) .setConfigValue(data.Items[i].Name, data.Items[i].Value, data.Provider, data.Remote, data.Version)
.then(() => { .then(() => {
setConfigValue(++i); setConfigValue(++i);
}) })

View File

@@ -16,10 +16,10 @@ const clearManualMountDetection = provider => {
} }
}; };
const monitorMount = (sender, provider, version, pid, location) => { const monitorMount = (sender, provider, providerList, version, pid, location) => {
manualMountDetection[provider] = setInterval(() => { manualMountDetection[provider] = setInterval(() => {
helpers helpers
.detectRepertoryMounts(version) .detectRepertoryMounts(version, providerList)
.then(result => { .then(result => {
if (result[provider].PID !== pid) { if (result[provider].PID !== pid) {
if (result[provider].PID === -1) { if (result[provider].PID === -1) {
@@ -46,7 +46,7 @@ const monitorMount = (sender, provider, version, pid, location) => {
const unmountAllDrives = () => { const unmountAllDrives = () => {
// Reset mount states // Reset mount states
for (const provider of Constants.PROVIDER_LIST) { for (const provider of Object.keys(manualMountDetection)) {
clearManualMountDetection(provider); clearManualMountDetection(provider);
expectedUnmount[provider] = true; expectedUnmount[provider] = true;
} }
@@ -54,7 +54,7 @@ const unmountAllDrives = () => {
// Unmount all items // Unmount all items
for (const i in mountedLocations) { for (const i in mountedLocations) {
const data = mountedData[mountedLocations[i]]; const data = mountedData[mountedLocations[i]];
helpers.stopMountProcessSync(data.Version, data.Provider); helpers.stopMountProcessSync(data.Version, data.Provider, data.Remote);
} }
mountedLocations = []; mountedLocations = [];
@@ -87,7 +87,11 @@ const addListeners = (ipcMain, setTrayImage, standardIPCReply) => {
ipcMain.on(Constants.IPC_Detect_Mounts, (event, data) => { ipcMain.on(Constants.IPC_Detect_Mounts, (event, data) => {
let driveLetters = {}; let driveLetters = {};
for (const provider of Constants.PROVIDER_LIST) { const providerList = [
...Constants.PROVIDER_LIST,
data.RemoteMounts,
];
for (const provider of providerList) {
driveLetters[provider] = []; driveLetters[provider] = [];
} }
@@ -96,7 +100,7 @@ const addListeners = (ipcMain, setTrayImage, standardIPCReply) => {
const drive = (String.fromCharCode(i) + ':').toUpperCase(); const drive = (String.fromCharCode(i) + ':').toUpperCase();
let driveInUse; let driveInUse;
if (Object.keys(locations).length > 0) { if (Object.keys(locations).length > 0) {
for (const provider of Constants.PROVIDER_LIST) { for (const provider of providerList) {
driveInUse = locations[provider].startsWith(drive); driveInUse = locations[provider].startsWith(drive);
if (driveInUse) if (driveInUse)
break; break;
@@ -105,7 +109,7 @@ const addListeners = (ipcMain, setTrayImage, standardIPCReply) => {
if (!driveInUse) { if (!driveInUse) {
try { try {
if (!fs.existsSync(drive)) { if (!fs.existsSync(drive)) {
for (const provider of Constants.PROVIDER_LIST) { for (const provider of providerList) {
driveLetters[provider].push(drive); driveLetters[provider].push(drive);
} }
} }
@@ -115,7 +119,7 @@ const addListeners = (ipcMain, setTrayImage, standardIPCReply) => {
} }
if (Object.keys(locations).length > 0) { if (Object.keys(locations).length > 0) {
for (const provider of Constants.PROVIDER_LIST) { for (const provider of providerList) {
if (locations[provider].length > 0) { if (locations[provider].length > 0) {
if (!driveLetters[provider].find((driveLetter) => { if (!driveLetters[provider].find((driveLetter) => {
return driveLetter === locations[provider]; return driveLetter === locations[provider];
@@ -130,7 +134,7 @@ const addListeners = (ipcMain, setTrayImage, standardIPCReply) => {
const setImage = (locations) => { const setImage = (locations) => {
let driveInUse; let driveInUse;
if (Object.keys(locations).length > 0) { if (Object.keys(locations).length > 0) {
for (const provider of Constants.PROVIDER_LIST) { for (const provider of providerList) {
driveInUse = locations[provider].length > 0; driveInUse = locations[provider].length > 0;
if (driveInUse) if (driveInUse)
break; break;
@@ -141,11 +145,11 @@ const addListeners = (ipcMain, setTrayImage, standardIPCReply) => {
}; };
helpers helpers
.detectRepertoryMounts(data.Version) .detectRepertoryMounts(data.Version, providerList)
.then((results) => { .then((results) => {
let storageData = {}; let storageData = {};
let locations = {}; let locations = {};
for (const provider of Constants.PROVIDER_LIST) { for (const provider of providerList) {
storageData[provider] = results[provider] ? results[provider] : { storageData[provider] = results[provider] ? results[provider] : {
Active: false, Active: false,
Location: '', Location: '',
@@ -156,7 +160,7 @@ const addListeners = (ipcMain, setTrayImage, standardIPCReply) => {
if (storageData[provider].PID !== -1) { if (storageData[provider].PID !== -1) {
expectedUnmount[provider] = false; expectedUnmount[provider] = false;
if (firstMountCheck) { if (firstMountCheck) {
monitorMount(event.sender, provider, data.Version, storageData[provider].PID, storageData[provider].Location); monitorMount(event.sender, provider, providerList, data.Version, storageData[provider].PID, storageData[provider].Location);
} }
} }
} }
@@ -193,8 +197,9 @@ const addListeners = (ipcMain, setTrayImage, standardIPCReply) => {
} else { } else {
mountedLocations.push(data.Location); mountedLocations.push(data.Location);
mountedData[data.Location] = { mountedData[data.Location] = {
Version: data.Version,
Provider: data.Provider, Provider: data.Provider,
Remote: data.Remote,
Version: data.Version,
}; };
const errorHandler = (pid, error) => { const errorHandler = (pid, error) => {
if (mountedLocations.indexOf(data.Location) !== -1) { if (mountedLocations.indexOf(data.Location) !== -1) {
@@ -206,15 +211,17 @@ const addListeners = (ipcMain, setTrayImage, standardIPCReply) => {
Expected: expectedUnmount[data.Provider], Expected: expectedUnmount[data.Provider],
Location: data.Location, Location: data.Location,
Provider: data.Provider, Provider: data.Provider,
Remote: data.Remote,
}, error || Error(data.Provider + ' Unmounted')); }, error || Error(data.Provider + ' Unmounted'));
}; };
helpers helpers
.executeMount(data.Version, data.Provider, data.Location, data.NoConsoleSupported, (error, pid) => { .executeMount(data.Version, data.Provider, data.Remote, data.Location, data.NoConsoleSupported, (error, pid) => {
errorHandler(pid, error); errorHandler(pid, error);
}) })
.then(() => { .then(() => {
standardIPCReply(event, Constants.IPC_Mount_Drive_Reply, { standardIPCReply(event, Constants.IPC_Mount_Drive_Reply, {
Provider: data.Provider, Provider: data.Provider,
Remote: data.Remote,
}); });
}) })
.catch(error => { .catch(error => {
@@ -233,7 +240,7 @@ const addListeners = (ipcMain, setTrayImage, standardIPCReply) => {
expectedUnmount[data.Provider] = true; expectedUnmount[data.Provider] = true;
helpers helpers
.stopMountProcess(data.Version, data.Provider) .stopMountProcess(data.Version, data.Provider, data.Remote)
.then(result => { .then(result => {
console.log(result); console.log(result);
}) })