1*6777b538SAndroid Build Coastguard Worker// Copyright 2021 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker// found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker#include "base/apple/backup_util.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker#import <Foundation/Foundation.h> 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker#include "base/apple/foundation_util.h" 10*6777b538SAndroid Build Coastguard Worker#include "base/files/file_path.h" 11*6777b538SAndroid Build Coastguard Worker#include "base/logging.h" 12*6777b538SAndroid Build Coastguard Worker#include "base/strings/sys_string_conversions.h" 13*6777b538SAndroid Build Coastguard Worker#include "base/threading/scoped_blocking_call.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Workernamespace base::apple { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Workerbool GetBackupExclusion(const FilePath& file_path) { 18*6777b538SAndroid Build Coastguard Worker base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, 19*6777b538SAndroid Build Coastguard Worker base::BlockingType::MAY_BLOCK); 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker NSURL* file_url = apple::FilePathToNSURL(file_path); 22*6777b538SAndroid Build Coastguard Worker DCHECK([file_url checkPromisedItemIsReachableAndReturnError:nil]); 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker NSError* error = nil; 25*6777b538SAndroid Build Coastguard Worker NSNumber* value = nil; 26*6777b538SAndroid Build Coastguard Worker BOOL success = [file_url getResourceValue:&value 27*6777b538SAndroid Build Coastguard Worker forKey:NSURLIsExcludedFromBackupKey 28*6777b538SAndroid Build Coastguard Worker error:&error]; 29*6777b538SAndroid Build Coastguard Worker if (!success) { 30*6777b538SAndroid Build Coastguard Worker LOG(ERROR) << base::SysNSStringToUTF8(error.description); 31*6777b538SAndroid Build Coastguard Worker return false; 32*6777b538SAndroid Build Coastguard Worker } 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker return value && value.boolValue; 35*6777b538SAndroid Build Coastguard Worker} 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Workernamespace { 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Workerbool SetBackupState(const FilePath& file_path, bool excluded) { 40*6777b538SAndroid Build Coastguard Worker base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, 41*6777b538SAndroid Build Coastguard Worker base::BlockingType::MAY_BLOCK); 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker NSURL* file_url = apple::FilePathToNSURL(file_path); 44*6777b538SAndroid Build Coastguard Worker DCHECK([file_url checkPromisedItemIsReachableAndReturnError:nil]); 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker NSError* error = nil; 47*6777b538SAndroid Build Coastguard Worker BOOL success = [file_url setResourceValue:@(excluded) 48*6777b538SAndroid Build Coastguard Worker forKey:NSURLIsExcludedFromBackupKey 49*6777b538SAndroid Build Coastguard Worker error:&error]; 50*6777b538SAndroid Build Coastguard Worker LOG_IF(WARNING, !success) << base::SysNSStringToUTF8(error.description); 51*6777b538SAndroid Build Coastguard Worker return success; 52*6777b538SAndroid Build Coastguard Worker} 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker} // namespace 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Workerbool SetBackupExclusion(const FilePath& file_path) { 57*6777b538SAndroid Build Coastguard Worker return SetBackupState(file_path, true); 58*6777b538SAndroid Build Coastguard Worker} 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Workerbool ClearBackupExclusion(const FilePath& file_path) { 61*6777b538SAndroid Build Coastguard Worker return SetBackupState(file_path, false); 62*6777b538SAndroid Build Coastguard Worker} 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Worker} // namespace base::apple 65