Chromium Code Reviews| Index: base/ios/ns_error_util.mm |
| diff --git a/base/ios/ns_error_util.mm b/base/ios/ns_error_util.mm |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..075bfd515bb44447fc853e3b4b6556b9cc32364a |
| --- /dev/null |
| +++ b/base/ios/ns_error_util.mm |
| @@ -0,0 +1,53 @@ |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#import "base/ios/ns_error_util.h" |
| + |
| +#import <Foundation/Foundation.h> |
| + |
| +#include "base/logging.h" |
| +#include "base/mac/scoped_nsobject.h" |
| + |
| +namespace base { |
| +namespace ios { |
| + |
| +namespace { |
| +// Iterates through |error|'s underlying errors and returns them in an array. |
|
stuartmorgan
2015/06/24 21:30:48
Since this actually returns |error| as well, the n
kkhorimoto
2015/06/24 22:17:59
Done.
|
| +NSArray* GetUnderlyingErrorChainForError(NSError* error) { |
| + NSMutableArray* error_chain = [NSMutableArray array]; |
| + NSError* current_error = error; |
| + while (current_error) { |
| + DCHECK([current_error isKindOfClass:[NSError class]]); |
| + [error_chain addObject:current_error]; |
| + current_error = current_error.userInfo[NSUnderlyingErrorKey]; |
| + } |
| + return error_chain; |
| +} |
| +} // namespace |
| + |
| +NSError* GetFinalUnderlyingErrorFromError(NSError* error) { |
| + DCHECK(error); |
| + return [GetUnderlyingErrorChainForError(error) lastObject]; |
| +} |
| + |
| +NSError* ErrorWithAppendedUnderlyingError(NSError* original_error, |
| + NSError* underlying_error) { |
| + DCHECK(original_error); |
| + DCHECK(underlying_error); |
| + NSArray* error_chain = GetUnderlyingErrorChainForError(original_error); |
| + NSError* current_error = underlying_error; |
| + for (NSInteger idx = error_chain.count - 1; idx >= 0; --idx) { |
| + NSError* error = error_chain[idx]; |
| + scoped_nsobject<NSMutableDictionary> user_info( |
| + [error.userInfo mutableCopy]); |
| + [user_info setObject:current_error forKey:NSUnderlyingErrorKey]; |
| + current_error = [NSError errorWithDomain:error.domain |
| + code:error.code |
| + userInfo:user_info]; |
| + } |
| + return current_error; |
| +} |
| + |
| +} // namespace ios |
| +} // namespace base |