From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../components/about-support/AboutSupportWin32.jsm | 77 ++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 comm/mail/components/about-support/AboutSupportWin32.jsm (limited to 'comm/mail/components/about-support/AboutSupportWin32.jsm') 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(); + } + }, +}; -- cgit v1.2.3