This repository has been archived on 2025-09-19. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
repertory-ui/src/renderer/ipc/MountsIPC.js
2020-02-22 19:17:11 -06:00

276 lines
8.1 KiB
JavaScript

const Constants = require('../../constants');
const fs = require('fs');
const helpers = require('../../helpers');
const os = require('os');
const path = require('path');
let expectedUnmount = {};
let firstMountCheck = true;
let manualMountDetection = {};
let mountedData = {};
let mountedLocations = [];
const clearManualMountDetection = provider => {
if (manualMountDetection[provider]) {
clearInterval(manualMountDetection[provider]);
delete manualMountDetection[provider];
}
};
const monitorMount = (sender, provider, providerList, version, pid, location) => {
manualMountDetection[provider] = setInterval(() => {
helpers
.detectRepertoryMounts(version, providerList)
.then(result => {
if (result[provider].PID !== pid) {
if (result[provider].PID === -1) {
clearManualMountDetection(provider);
sender.send(Constants.IPC_Unmount_Drive_Reply, {
data: {
Expected: expectedUnmount[provider],
Location: location,
Provider: provider,
Error: Error(provider + ' Unmounted').toString(),
Success: false,
}
});
} else {
pid = result[provider].PID;
}
}
})
.catch(e => {
console.log(e);
});
},6000);
};
const unmountAllDrives = () => {
// Reset mount states
for (const provider of Object.keys(manualMountDetection)) {
clearManualMountDetection(provider);
expectedUnmount[provider] = true;
}
// Unmount all items
for (const i in mountedLocations) {
const data = mountedData[mountedLocations[i]];
helpers.stopMountProcessSync(data.Version, data.Provider, data.Remote);
}
mountedLocations = [];
mountedData = {};
};
const addListeners = (ipcMain, {setTrayImage, standardIPCReply}) => {
ipcMain.on(Constants.IPC_Check_Mount_Location + '_sync', (event, data) => {
let response = {
Success: true,
Error: ''
};
try {
if (fs.existsSync(data.Location) && fs.statSync(data.Location).isDirectory()) {
if (fs.readdirSync(data.Location).length !== 0) {
response.Success = false;
response.Error = 'Directory not empty: ' + data.Location;
}
} else {
response.Success = false;
response.Error = 'Directory not found: ' + data.Location;
}
} catch (e) {
response.Success = false;
response.Error = e.toString();
}
event.returnValue = response;
});
ipcMain.on(Constants.IPC_Detect_Mount, (event, data) => {
const provider = data.Provider;
let driveLetters = {};
const providerList = [
...Constants.PROVIDER_LIST,
...data.RemoteMounts,
];
for (const provider of providerList) {
driveLetters[provider] = [];
}
const grabDriveLetters = (locations) => {
for (let i = 'c'.charCodeAt(0); i <= 'z'.charCodeAt(0); i++) {
const drive = (String.fromCharCode(i) + ':').toUpperCase();
let driveInUse;
if (Object.keys(locations).length > 0) {
for (const provider of providerList) {
driveInUse = locations[provider].startsWith(drive);
if (driveInUse)
break;
}
}
if (!driveInUse) {
try {
if (!fs.existsSync(drive)) {
for (const provider of providerList) {
driveLetters[provider].push(drive);
}
}
} catch (e) {
}
}
}
if (Object.keys(locations).length > 0) {
for (const provider of providerList) {
if (locations[provider].length > 0) {
if (!driveLetters[provider].find((driveLetter) => {
return driveLetter === locations[provider];
})) {
driveLetters[provider].push(locations[provider]);
}
}
}
}
};
const setImage = (locations) => {
let driveInUse;
if (Object.keys(locations).length > 0) {
for (const provider of providerList) {
driveInUse = locations[provider].length > 0;
if (driveInUse)
break;
}
}
setTrayImage(driveInUse)
};
helpers
.detectRepertoryMounts(data.Version, providerList)
.then((results) => {
let storageData = {};
let locations = {};
for (const provider of providerList) {
storageData[provider] = results[provider] ? results[provider] : {
Active: false,
Location: '',
PID: -1,
};
locations[provider] = storageData[provider].Location;
if (storageData[provider].PID !== -1) {
expectedUnmount[provider] = false;
if (firstMountCheck) {
monitorMount(event.sender, provider, providerList, data.Version, storageData[provider].PID, storageData[provider].Location);
}
}
}
if (os.platform() === 'win32') {
grabDriveLetters(locations);
}
setImage(locations);
if (firstMountCheck) {
firstMountCheck = false;
}
standardIPCReply(event, Constants.IPC_Detect_Mount_Reply, {
Active: storageData[provider].Active,
DriveLetters: driveLetters[provider],
Location: locations[provider],
PID: storageData[provider].PID,
Provider: provider,
});
})
.catch(error => {
if (os.platform() === 'win32') {
grabDriveLetters({});
}
setImage({});
standardIPCReply(event, Constants.IPC_Detect_Mount_Reply, {
DriveLetters: driveLetters[provider],
Provider: provider,
}, error);
});
});
ipcMain.on(Constants.IPC_Mount_Drive, (event, data) => {
expectedUnmount[data.Provider] = false;
if (mountedLocations.indexOf(data.Location) !== -1) {
console.log(data.Provider + ' already mounted: ' + data.Location);
} else {
mountedLocations.push(data.Location);
mountedData[data.Location] = {
Provider: data.Provider,
Remote: data.Remote,
Version: data.Version,
};
const errorHandler = (pid, error) => {
if (mountedLocations.indexOf(data.Location) !== -1) {
mountedLocations.splice(mountedLocations.indexOf(data.Location), 1);
delete mountedData[data.Location];
}
standardIPCReply(event, Constants.IPC_Unmount_Drive_Reply, {
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.Remote, data.Location, (error, pid) => {
errorHandler(pid, error);
})
.then(() => {
standardIPCReply(event, Constants.IPC_Mount_Drive_Reply, {
Provider: data.Provider,
Remote: data.Remote,
});
})
.catch(error => {
errorHandler(-1, error);
});
}
});
ipcMain.on(Constants.IPC_Remove_Remote_Mount, (event, data) => {
data = data.replace(':', '_');
const dataDirectory = path.resolve(path.join(helpers.getDataDirectory(), '..', 'remote', data));
try {
helpers.removeDirectoryRecursively(dataDirectory);
standardIPCReply(event, Constants.IPC_Remove_Remote_Mount_Reply, {DataDirectory: dataDirectory});
} catch (e) {
standardIPCReply(event, Constants.IPC_Remove_Remote_Mount_Reply, {DataDirectory: dataDirectory}, e);
}
});
ipcMain.on(Constants.IPC_Unmount_All_Drives, (event, data) => {
unmountAllDrives();
standardIPCReply(event, Constants.IPC_Unmount_All_Drives_Reply);
});
ipcMain.on(Constants.IPC_Unmount_Drive, (event, data) => {
clearManualMountDetection(data.Provider);
expectedUnmount[data.Provider] = true;
helpers
.stopMountProcess(data.Version, data.Provider, data.Remote)
.then(result => {
console.log(result);
})
.catch(e => {
console.log(e);
});
});
};
module.exports = {
addListeners,
unmountAllDrives
};