#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",
"test": "react-scripts test",
"eject": "react-scripts eject",
"electron-dev": "cross-env ELECTRON_START_URL=http://localhost:3001 electron .",
"electron-dev-unix": "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:3000 electron .",
"pack": "npm run build && electron-builder --dir --x64",
"dist": "npm run build && electron-builder --x64",
"dist-all": "npm run build && electron-builder --x64 --win --linux --mac",

View File

@@ -20,7 +20,7 @@ const mapStateToProps = (state, ownProps) => {
const mapDispatchToProps = dispatch => {
return {
displayConfiguration: provider => dispatch(displayConfiguration(provider)),
displayConfiguration: (provider, remote) => dispatch(displayConfiguration(provider, remote)),
setProviderState: (provider, state) => dispatch(setProviderState(provider, state)),
}
};
@@ -51,7 +51,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(props => {
rowSpan={6}>
<img alt=''
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}
style={{padding: 0, border: 0, margin: 0, ...pointer}}
width={'16px'}/>
@@ -108,7 +108,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(props => {
width='19px'/>;
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}
colSpan={21}
disabled={!props.MState.AllowMount}
@@ -146,7 +146,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(props => {
<Text
col={configButton ? 6 : 0}
rowSpan={5}
text={props.provider}
text={props.remote ? props.provider.substr(6) : props.provider}
type={'Heading1'}/>
{inputControls}
{actionsDisplay}

View File

@@ -70,6 +70,7 @@ class Configuration extends IPCContainer {
this.setRequestHandler(Constants.IPC_Set_Config_Values_Reply, this.onSetConfigValuesReply);
this.sendRequest(Constants.IPC_Get_Config_Template, {
Provider: this.props.DisplayConfiguration,
Remote: this.props.DisplayRemoteConfiguration,
Version: this.props.version,
});
}
@@ -161,6 +162,7 @@ class Configuration extends IPCContainer {
}, ()=> {
this.sendRequest(Constants.IPC_Get_Config, {
Provider: this.props.DisplayConfiguration,
Remote: this.props.DisplayRemoteConfiguration,
Version: this.props.version,
});
});
@@ -203,6 +205,7 @@ class Configuration extends IPCContainer {
this.sendRequest(Constants.IPC_Set_Config_Values, {
Items: changedItems,
Provider: this.props.DisplayConfiguration,
Remote: this.props.DisplayRemoteConfiguration,
Version: this.props.version,
});
});
@@ -215,7 +218,7 @@ class Configuration extends IPCContainer {
(item.label !== 'IsRemoteMount')) {
const isRemoteMount = JSON.parse(itemList.find(s=>s.label === 'IsRemoteMount').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 :
(item.label === 'EnableRemoteMount') ?
!isRemoteMount :
@@ -291,7 +294,10 @@ class Configuration extends IPCContainer {
<b style={{cursor: 'pointer'}}
onClick={this.checkSaveRequired}>X</b>
</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%'}}>
{objectItems}
{(configurationItems.length > 0) ? <h1>Settings</h1> : null}
@@ -306,13 +312,14 @@ class Configuration extends IPCContainer {
const mapStateToProps = state => {
return {
DisplayConfiguration: state.mounts.DisplayConfiguration,
DisplayRemoteConfiguration: state.mounts.DisplayRemoteConfiguration,
}
};
const mapDispatchToProps = dispatch => {
return {
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) {
this.props.setMountsBusy(true);
this.sendRequest(Constants.IPC_Detect_Mounts, {
RemoteMounts: this.props.RemoteMounts,
Version: this.props.InstalledVersion,
});
}
};
displayRetryMount = (provider, mountLocation, msg) => {
displayRetryMount = (provider, remote, mountLocation, msg) => {
if (!this.state.RetryItems[provider]) {
let retryItems = {
...this.state.RetryItems
@@ -104,7 +105,7 @@ class MountItems extends IPCContainer {
const retrySeconds = retryItems[provider].RetrySeconds - 1;
if (retrySeconds === 0) {
this.cancelRetryMount(provider, () => {
this.handleMountUnMount(provider, true, mountLocation);
this.handleMountUnMount(provider, remote,true, mountLocation);
});
} else {
retryItems[provider].RetrySeconds = retrySeconds;
@@ -139,16 +140,20 @@ class MountItems extends IPCContainer {
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)) {
this.props.notifyError('Mount location is not set');
} else {
let allowAction = true;
if (mount) {
let result = this.sendSyncRequest(Constants.IPC_Check_Daemon_Version, {
Provider: provider,
Version: this.props.InstalledVersion
}).data;
let result = remote ?
{Valid: true, Success: true} :
this.sendSyncRequest(Constants.IPC_Check_Daemon_Version, {
Provider: provider,
Remote: remote,
Version: this.props.InstalledVersion
}).data;
if (result.Success) {
if (result.Valid) {
if (this.props.Platform !== 'win32') {
@@ -163,11 +168,11 @@ class MountItems extends IPCContainer {
} else {
allowAction = false;
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])) {
this.displayRetryMount(provider, location, 'Incompatible ' + provider + ' daemon. Please upgrade ' + provider + '.');
this.displayRetryMount(provider, remote, location, 'Incompatible ' + provider + ' daemon. Please upgrade ' + provider + '.');
} else {
this.displayRetryMount(provider, location, 'Version check failed: ' + result.Error);
this.displayRetryMount(provider, remote, location, 'Version check failed: ' + result.Error);
}
}
} else {
@@ -175,7 +180,7 @@ class MountItems extends IPCContainer {
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.');
} 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,
NoConsoleSupported: this.props.noConsoleSupported,
Provider: provider,
Remote: remote,
Version: this.props.InstalledVersion,
});
} else {
this.sendRequest(Constants.IPC_Unmount_Drive, {
Location: location,
Provider: provider,
Remote: remote,
Version: this.props.InstalledVersion,
});
}
@@ -202,11 +209,19 @@ class MountItems extends IPCContainer {
}
};
getProviderList = () => {
return [
...Constants.PROVIDER_LIST,
...this.props.RemoteMounts,
];
};
onDetectMountsReply = (event, arg) => {
if (!this.state.DisplayRetry && arg.data.Success) {
let mountsBusy = false;
let mountStates = {};
for (const provider of Constants.PROVIDER_LIST) {
for (const provider of this.getProviderList()) {
const mountState = {
AllowMount: true,
DriveLetters: (arg.data.DriveLetters[provider]),
@@ -238,11 +253,11 @@ class MountItems extends IPCContainer {
this.props.ProviderState[provider].AutoMount &&
!mountStates[provider].Mounted &&
(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);
}
@@ -259,7 +274,7 @@ class MountItems extends IPCContainer {
onUnmountDriveReply = (event, arg) => {
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 {
this.detectMounts();
}
@@ -296,6 +311,12 @@ class MountItems extends IPCContainer {
}
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) {
items.push((
<MountItem allowConfig={this.props.allowConfig}
@@ -319,13 +340,15 @@ class MountItems extends IPCContainer {
changed={e => this.handleMountLocationChanged(provider, e.target.value)}
clicked={this.handleMountUnMount}
key={'mi_' + items.length}
provider={provider}/>
provider={provider}
remote/>
));
items.push(<div key={'di_' + items.length}
style={{paddingTop: '4px'}}/>)
}
items.push(<AddRemoteMount key={'mia_' + items.length + 1}/>);
if (this.props.RemoteMounts.length > 0) {
items.splice(items.length - 1, 1);
}
} else {
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) => {
const processOptions = {
detached: true,
@@ -155,7 +155,7 @@ module.exports.detectRepertoryMounts = version => {
process.on('exit', () => {
let defaultData = {};
for (const provider of Constants.PROVIDER_LIST) {
for (const provider of providerList) {
defaultData[provider] = {
Active: false,
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) => {
const processOptions = {
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 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()]);
}
@@ -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) => {
const processOptions = {
detached: true,
@@ -376,7 +379,10 @@ module.exports.getConfig = (version, provider) => {
const command = path.join(_getDataDirectory(), version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory');
const args = [];
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()]);
}
@@ -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) => {
const processOptions = {
detached: true,
@@ -422,7 +428,10 @@ module.exports.getConfigTemplate = (version, provider) => {
const command = path.join(_getDataDirectory(), version, (os.platform() === 'win32') ? 'repertory.exe' : 'repertory');
const args = [];
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()]);
}
@@ -625,7 +634,7 @@ module.exports.removeDirectoryRecursively = (p) => {
module.exports.resolvePath = _resolvePath;
module.exports.setConfigValue = (name, value, provider, version) => {
module.exports.setConfigValue = (name, value, provider, remote, version) => {
return new Promise((resolve, reject) => {
const processOptions = {
detached: true,
@@ -638,7 +647,10 @@ module.exports.setConfigValue = (name, value, provider, version) => {
args.push('-set');
args.push(name);
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()]);
}
@@ -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) => {
const processOptions = {
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 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()]);
}
@@ -688,7 +703,7 @@ module.exports.stopMountProcess = (version, provider) => {
});
};
module.exports.stopMountProcessSync = (version, provider) => {
module.exports.stopMountProcessSync = (version, provider, remote) => {
const processOptions = {
detached: true,
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 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()]);
}

View File

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

View File

@@ -68,10 +68,15 @@ export const saveState = () => {
if (state.common.AppReady) {
let currentState = {
Release: state.relver.Release,
RemoteMounts: state.mounts.RemoteMounts,
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];
}

View File

@@ -2,7 +2,16 @@ import * as Constants from '../../constants';
import {createAction} from 'redux-starter-kit';
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 resetMountsState = () => {

View File

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

View File

@@ -1,7 +1,7 @@
import * as Constants from '../../constants';
import {createReducer} from 'redux-starter-kit';
import {
displayConfiguration,
DISPLAY_CONFIGURATION,
RESET_MOUNTS_STATE,
SET_ALLOW_MOUNT,
setAutoMountProcessed,
@@ -11,115 +11,123 @@ import {
SET_PROVIDER_STATE
} from '../actions/mount_actions';
const providerState = Constants.PROVIDER_LIST.map(provider=> {
return {
[provider]: {
AutoMount: false,
AutoRestart: false,
MountLocation: '',
export const createMountReducer = state => {
let providerList = [
...Constants.PROVIDER_LIST,
...(state.RemoteMounts||['Remotelocalhost:20000']),
];
const providerState = providerList.map(provider=> {
return {
[provider]: {
AutoMount: false,
AutoRestart: false,
MountLocation: '',
}
}
}
}).reduce((map, obj) => {
return {
...map,
...obj
}
});
}).reduce((map, obj) => {
return {
...map,
...obj
}
});
const mountState = Constants.PROVIDER_LIST.map(provider => {
return {
[provider]: {
AllowMount: false,
DriveLetters: [],
Mounted: false,
const mountState = providerList.map(provider => {
return {
[provider]: {
AllowMount: false,
DriveLetters: [],
Mounted: false,
}
}
}
}).reduce((map, obj) => {
return {
...map,
...obj
}
});
}).reduce((map, obj) => {
return {
...map,
...obj
}
});
export const mountReducer = createReducer({
AutoMountProcessed: false,
DisplayConfiguration: null,
MountsBusy: false,
MountState: mountState,
ProviderState: providerState,
RemoteMounts: [],
}, {
[displayConfiguration]: (state, action) => {
return {
...state,
DisplayConfiguration: action.payload
};
},
[RESET_MOUNTS_STATE]: (state, action) => {
return {
...state,
MountsBusy: false,
MountState: mountState,
return createReducer({
AutoMountProcessed: false,
DisplayConfiguration: null,
DisplayRemoteConfiguration: false,
MountsBusy: false,
MountState: mountState,
ProviderState: providerState,
RemoteMounts: state.RemoteMounts ? state.RemoteMounts : ['Remotelocalhost:20000'],
}, {
[DISPLAY_CONFIGURATION]: (state, action) => {
return {
...state,
DisplayConfiguration: action.payload.provider,
DisplayRemoteConfiguration: action.payload.remote,
};
},
[RESET_MOUNTS_STATE]: (state, action) => {
return {
...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 {errorReducer} from '../reducers/error_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';
export default function createAppStore(platform, appPlatform, version) {
export default function createAppStore(platformInfo, version, state) {
const reducer = {
common: createCommonReducer(platform, appPlatform, version),
common: createCommonReducer(platformInfo, version),
download: downloadReducer,
error: errorReducer,
install: installReducer,
mounts: mountReducer,
mounts: createMountReducer(state),
relver: releaseVersionReducer,
};

View File

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