-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathusb-mount-notify.js
68 lines (54 loc) · 2.03 KB
/
usb-mount-notify.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
exports.onDeviceChange = function(callback, mainWindow) {
if (process.platform == 'darwin') {
setOSXobserver(callback);
} else if (process.platform == 'win32') {
setWindowsObserver(callback, mainWindow);
}
};
function setOSXobserver(callback) {
var spawn = require('child_process').spawn,
usb_notifier = spawn('./app/bin/usb-mount-notifier');
usb_notifier.stdout.on('data', function (data) {
process.stdout.write(data);
var separator_index = data.indexOf(':');
var event_name = data.substr(0, separator_index).trim();
var device_path = data.substr(separator_index + 1).trim();
callback(event_name, device_path);
});
}
function setWindowsObserver(callback, mainWindow) {
var ref = require('ref');
var StructType = require('ref-struct');
var DEV_BROADCAST_VOLUME = StructType({
dbcv_size: ref.types.uint32, // DWORD dbcv_size;
dbcv_devicetype: ref.types.uint32, // DWORD dbcv_devicetype;
dbcv_reserved: ref.types.uint32, // DWORD dbcv_reserved;
dbcv_unitmask: ref.types.uint32, // DWORD dbcv_unitmask;
dbcv_flags: ref.types.short // WORD dbcv_flags;
});
mainWindow.hookWindowMessage(
Number.parseInt('0x0219'), // WM_DEVICECHANGE
function(w_param, l_param_pointer) {
var event_name;
if (w_param.readUInt32LE(0) == 0x8000) { // DBT_DEVICEARRIVAL
event_name = 'mounted';
} else if (w_param.readUInt32LE(0) == 0x8004) { // DBT_DEVICEREMOVECOMPLETE
event_name = 'unmounted'
}
if (!event_name) return;
var l_param = ref.readPointer(l_param_pointer, 0, DEV_BROADCAST_VOLUME.size);
l_param.type = DEV_BROADCAST_VOLUME;
var val = l_param.deref();
var device_path = getDriveLetterFromUnitmask(val.dbcv_unitmask) + ":\\";
callback(event_name, device_path);
}
);
}
function getDriveLetterFromUnitmask(unitmask) {
var i;
for (i = 0; i < 26; i++) {
if (unitmask & 0x1) break;
unitmask = unitmask >>> 1;
}
return String.fromCharCode('A'.charCodeAt(0) + i);
}