CachePurgeLock.cpp (2866B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #include "CachePurgeLock.h" 6 #include "nsCOMPtr.h" 7 #include "nsIFile.h" 8 #include "nsAppRunner.h" 9 #include "mozilla/MultiInstanceLock.h" 10 #include "nsLocalFile.h" 11 12 namespace mozilla::net { 13 14 NS_IMPL_ISUPPORTS(CachePurgeLock, nsICachePurgeLock) 15 16 static nsresult PrepareLockArguments(const nsACString& profileName, 17 nsCString& lockName, 18 nsString& appDirPath) { 19 nsresult rv; 20 21 nsCOMPtr<nsIFile> appFile = mozilla::GetNormalizedAppFile(nullptr); 22 if (!appFile) { 23 return NS_ERROR_NOT_AVAILABLE; 24 } 25 26 nsCOMPtr<nsIFile> appDirFile; 27 rv = appFile->GetParent(getter_AddRefs(appDirFile)); 28 NS_ENSURE_SUCCESS(rv, rv); 29 30 rv = appDirFile->GetPath(appDirPath); 31 NS_ENSURE_SUCCESS(rv, rv); 32 33 lockName = profileName; 34 lockName.Append("-cachePurge"); 35 36 return NS_OK; 37 } 38 39 NS_IMETHODIMP 40 CachePurgeLock::GetLockFile(const nsACString& profileName, nsIFile** aResult) { 41 nsresult rv; 42 nsCString lockName; 43 nsString appDirPath; 44 rv = PrepareLockArguments(profileName, lockName, appDirPath); 45 if (NS_FAILED(rv)) { 46 return rv; 47 } 48 49 nsCString filePath; 50 if (!GetMultiInstanceLockFileName(lockName.get(), appDirPath.get(), 51 filePath)) { 52 return NS_ERROR_NOT_AVAILABLE; 53 } 54 55 nsCOMPtr<nsIFile> lockFile = new nsLocalFile(); 56 rv = lockFile->InitWithNativePath(filePath); 57 NS_ENSURE_SUCCESS(rv, rv); 58 59 lockFile.forget(aResult); 60 return NS_OK; 61 } 62 63 NS_IMETHODIMP 64 CachePurgeLock::Lock(const nsACString& profileName) { 65 nsresult rv; 66 if (mLock != MULTI_INSTANCE_LOCK_HANDLE_ERROR) { 67 // Lock is already open. 68 return NS_OK; 69 } 70 71 nsCString lockName; 72 nsString appDirPath; 73 rv = PrepareLockArguments(profileName, lockName, appDirPath); 74 if (NS_FAILED(rv)) { 75 return rv; 76 } 77 78 mLock = mozilla::OpenMultiInstanceLock(lockName.get(), appDirPath.get()); 79 if (mLock == MULTI_INSTANCE_LOCK_HANDLE_ERROR) { 80 return NS_ERROR_FAILURE; 81 } 82 83 return NS_OK; 84 } 85 86 NS_IMETHODIMP 87 CachePurgeLock::IsOtherInstanceRunning(bool* aResult) { 88 if (NS_WARN_IF(XRE_GetProcessType() != GeckoProcessType_Default)) { 89 return NS_ERROR_SERVICE_NOT_AVAILABLE; 90 } 91 92 if (mLock == MULTI_INSTANCE_LOCK_HANDLE_ERROR) { 93 return NS_ERROR_NOT_INITIALIZED; 94 } 95 96 bool rv = mozilla::IsOtherInstanceRunning(mLock, aResult); 97 NS_ENSURE_TRUE(rv, NS_ERROR_FAILURE); 98 99 return NS_OK; 100 } 101 102 NS_IMETHODIMP 103 CachePurgeLock::Unlock() { 104 if (mLock == MULTI_INSTANCE_LOCK_HANDLE_ERROR) { 105 // Lock is already released. 106 return NS_OK; 107 } 108 109 mozilla::ReleaseMultiInstanceLock(mLock); 110 mLock = MULTI_INSTANCE_LOCK_HANDLE_ERROR; 111 112 return NS_OK; 113 } 114 115 } // namespace mozilla::net