summaryrefslogtreecommitdiffstats
path: root/comm/mail/components/about-support/AboutSupportWin32.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/components/about-support/AboutSupportWin32.jsm')
-rw-r--r--comm/mail/components/about-support/AboutSupportWin32.jsm77
1 files changed, 77 insertions, 0 deletions
diff --git a/comm/mail/components/about-support/AboutSupportWin32.jsm b/comm/mail/components/about-support/AboutSupportWin32.jsm
new file mode 100644
index 0000000000..4c5e36c5bd
--- /dev/null
+++ b/comm/mail/components/about-support/AboutSupportWin32.jsm
@@ -0,0 +1,77 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var EXPORTED_SYMBOLS = ["AboutSupportPlatform"];
+
+// JS ctypes are needed to get at the data we need
+var { ctypes } = ChromeUtils.importESModule(
+ "resource://gre/modules/ctypes.sys.mjs"
+);
+
+var BOOL = ctypes.int32_t;
+var DRIVE_UNKNOWN = 0;
+var DRIVE_NETWORK = 4;
+
+var AboutSupportPlatform = {
+ /**
+ * Given an nsIFile, gets the file system type. The type is returned as a
+ * string. Possible values are "network", "local", "unknown" and null.
+ */
+ getFileSystemType(aFile) {
+ let kernel32 = ctypes.open("kernel32.dll");
+
+ try {
+ // Returns the path of the volume a file is on.
+ let GetVolumePathName = kernel32.declare(
+ "GetVolumePathNameW",
+ ctypes.winapi_abi,
+ BOOL, // return type: 1 indicates success, 0 failure
+ ctypes.char16_t.ptr, // in: lpszFileName
+ ctypes.char16_t.ptr, // out: lpszVolumePathName
+ ctypes.uint32_t // in: cchBufferLength
+ );
+
+ // Returns the last error.
+ let GetLastError = kernel32.declare(
+ "GetLastError",
+ ctypes.winapi_abi,
+ ctypes.uint32_t // return type: the last error
+ );
+
+ let filePath = aFile.path;
+ // The volume path should be at most 1 greater than than the length of the
+ // path -- add 1 for a trailing backslash if necessary, and 1 for the
+ // terminating null character. Note that the parentheses around the type are
+ // necessary for new to apply correctly.
+ let volumePath = new (ctypes.char16_t.array(filePath.length + 2))();
+
+ if (!GetVolumePathName(filePath, volumePath, volumePath.length)) {
+ throw new Error(
+ "Unable to get volume path for " +
+ filePath +
+ ", error " +
+ GetLastError()
+ );
+ }
+
+ // Returns the type of the drive.
+ let GetDriveType = kernel32.declare(
+ "GetDriveTypeW",
+ ctypes.winapi_abi,
+ ctypes.uint32_t, // return type: the drive type
+ ctypes.char16_t.ptr // in: lpRootPathName
+ );
+ let type = GetDriveType(volumePath);
+ // http://msdn.microsoft.com/en-us/library/aa364939
+ if (type == DRIVE_UNKNOWN) {
+ return "unknown";
+ } else if (type == DRIVE_NETWORK) {
+ return "network";
+ }
+ return "local";
+ } finally {
+ kernel32.close();
+ }
+ },
+};