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 69 70 71 72 73 74 75 76 77 78 79 80 81
|
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/updater/browser_updater_helper_client_mac.h"
#import <Foundation/Foundation.h>
#include "base/apple/bundle_locations.h"
#include "base/apple/foundation_util.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/logging.h"
#include "base/memory/scoped_refptr.h"
#include "base/strings/sys_string_conversions.h"
#include "base/task/bind_post_task.h"
#import "base/task/sequenced_task_runner.h"
#include "base/task/sequenced_task_runner.h"
#include "chrome/browser/updater/browser_updater_client_util.h"
#include "chrome/updater/mac/privileged_helper/service_protocol.h"
namespace {
const int kPrivilegedHelperConnectionFailed = -10000;
}
BrowserUpdaterHelperClientMac::BrowserUpdaterHelperClientMac() {
xpc_connection_ = [[NSXPCConnection alloc]
initWithMachServiceName:base::SysUTF8ToNSString(kPrivilegedHelperName)
options:NSXPCConnectionPrivileged];
xpc_connection_.remoteObjectInterface = [NSXPCInterface
interfaceWithProtocol:@protocol(PrivilegedHelperServiceProtocol)];
xpc_connection_.interruptionHandler = ^{
LOG(WARNING)
<< "PrivilegedHelperServiceProtocolImpl: XPC connection interrupted.";
};
xpc_connection_.invalidationHandler = ^{
LOG(WARNING)
<< "PrivilegedHelperServiceProtocolImpl: XPC connection invalidated.";
};
[xpc_connection_ resume];
}
BrowserUpdaterHelperClientMac::~BrowserUpdaterHelperClientMac() {
[xpc_connection_ invalidate];
xpc_connection_ = nil;
}
void BrowserUpdaterHelperClientMac::SetupSystemUpdater(
base::OnceCallback<void(int)> callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
__block base::OnceCallback<void(int)> block_callback =
base::BindPostTaskToCurrentDefault(
base::BindOnce(&BrowserUpdaterHelperClientMac::SetupSystemUpdaterDone,
base::WrapRefCounted(this), std::move(callback)));
auto reply = ^(int error) {
std::move(block_callback).Run(error);
};
auto errorHandler = ^(NSError* xpcError) {
LOG(ERROR) << "XPC Connection failed: "
<< base::SysNSStringToUTF8([xpcError description]);
reply(kPrivilegedHelperConnectionFailed);
};
[[xpc_connection_ remoteObjectProxyWithErrorHandler:errorHandler]
setupSystemUpdaterWithBrowserPath:base::apple::FilePathToNSString(
base::apple::OuterBundlePath())
reply:reply];
}
void BrowserUpdaterHelperClientMac::SetupSystemUpdaterDone(
base::OnceCallback<void(int)> callback,
int result) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
std::move(callback).Run(result);
}
|