summaryrefslogtreecommitdiffstats
path: root/widget/cocoa/nsMacFinderProgress.mm
diff options
context:
space:
mode:
Diffstat (limited to 'widget/cocoa/nsMacFinderProgress.mm')
-rw-r--r--widget/cocoa/nsMacFinderProgress.mm87
1 files changed, 87 insertions, 0 deletions
diff --git a/widget/cocoa/nsMacFinderProgress.mm b/widget/cocoa/nsMacFinderProgress.mm
new file mode 100644
index 0000000000..2e518fe012
--- /dev/null
+++ b/widget/cocoa/nsMacFinderProgress.mm
@@ -0,0 +1,87 @@
+/* -*- Mode: Objective-C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+/* 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/. */
+
+#import <Cocoa/Cocoa.h>
+
+#include "nsMacFinderProgress.h"
+#include "nsProxyRelease.h"
+#include "nsThreadUtils.h"
+#include "nsString.h"
+#include "nsObjCExceptions.h"
+
+NS_IMPL_ISUPPORTS(nsMacFinderProgress, nsIMacFinderProgress)
+
+nsMacFinderProgress::nsMacFinderProgress() : mProgress(nil) {}
+
+nsMacFinderProgress::~nsMacFinderProgress() {
+ if (mProgress) {
+ [mProgress unpublish];
+ [mProgress release];
+ }
+}
+
+NS_IMETHODIMP
+nsMacFinderProgress::Init(const nsAString& path,
+ nsIMacFinderProgressCanceledCallback* cancellationCallback) {
+ NS_OBJC_BEGIN_TRY_BLOCK_RETURN;
+
+ NSURL* pathUrl = [NSURL
+ fileURLWithPath:[NSString
+ stringWithCharacters:reinterpret_cast<const unichar*>(path.BeginReading())
+ length:path.Length()]];
+ NSDictionary* userInfo = @{
+ @"NSProgressFileOperationKindKey" : @"NSProgressFileOperationKindDownloading",
+ @"NSProgressFileURLKey" : pathUrl
+ };
+
+ mProgress = [[NSProgress alloc] initWithParent:nil userInfo:userInfo];
+ mProgress.kind = NSProgressKindFile;
+ mProgress.cancellable = YES;
+
+ nsMainThreadPtrHandle<nsIMacFinderProgressCanceledCallback> cancellationCallbackHandle(
+ new nsMainThreadPtrHolder<nsIMacFinderProgressCanceledCallback>(
+ "MacFinderProgress::CancellationCallback", cancellationCallback));
+
+ mProgress.cancellationHandler = ^{
+ NS_DispatchToMainThread(
+ NS_NewRunnableFunction("MacFinderProgress::Canceled", [cancellationCallbackHandle] {
+ MOZ_ASSERT(NS_IsMainThread());
+ cancellationCallbackHandle->Canceled();
+ }));
+ };
+
+ [mProgress publish];
+
+ return NS_OK;
+
+ NS_OBJC_END_TRY_BLOCK_RETURN(NS_ERROR_FAILURE);
+}
+
+NS_IMETHODIMP
+nsMacFinderProgress::UpdateProgress(uint64_t currentProgress, uint64_t totalProgress) {
+ NS_OBJC_BEGIN_TRY_BLOCK_RETURN;
+ if (mProgress) {
+ mProgress.totalUnitCount = totalProgress;
+ mProgress.completedUnitCount = currentProgress;
+ }
+
+ return NS_OK;
+
+ NS_OBJC_END_TRY_BLOCK_RETURN(NS_ERROR_FAILURE);
+}
+
+NS_IMETHODIMP
+nsMacFinderProgress::End() {
+ NS_OBJC_BEGIN_TRY_BLOCK_RETURN;
+
+ if (mProgress) {
+ [mProgress unpublish];
+ }
+
+ return NS_OK;
+
+ NS_OBJC_END_TRY_BLOCK_RETURN(NS_ERROR_FAILURE);
+}