blob: a67540293a2e27377a1fc7afc65cedaee9a554f2 [file] [log] [blame]
// 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/bind.h"
#include "base/callback.h"
#include "base/logging.h"
#include "base/mac/bundle_locations.h"
#include "base/mac/foundation_util.h"
#include "base/mac/scoped_nsobject.h"
#include "base/memory/scoped_refptr.h"
#include "base/strings/sys_string_conversions.h"
#include "base/task/bind_post_task.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_.reset([[NSXPCConnection alloc]
initWithMachServiceName:base::SysUTF8ToNSString(kPrivilegedHelperName)
options:NSXPCConnectionPrivileged]);
xpc_connection_.get().remoteObjectInterface = [NSXPCInterface
interfaceWithProtocol:@protocol(PrivilegedHelperServiceProtocol)];
xpc_connection_.get().interruptionHandler = ^{
LOG(WARNING)
<< "PrivilegedHelperServiceProtocolImpl: XPC connection interrupted.";
};
xpc_connection_.get().invalidationHandler = ^{
LOG(WARNING)
<< "PrivilegedHelperServiceProtocolImpl: XPC connection invalidated.";
};
[xpc_connection_ resume];
}
BrowserUpdaterHelperClientMac::~BrowserUpdaterHelperClientMac() {
[xpc_connection_ invalidate];
xpc_connection_.reset();
}
void BrowserUpdaterHelperClientMac::SetupSystemUpdater(
base::OnceCallback<void(int)> callback) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
__block base::OnceCallback<void(int)> block_callback = base::BindPostTask(
base::SequencedTaskRunner::GetCurrentDefault(),
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::mac::FilePathToNSString(
base::mac::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);
}