// Copyright (c) 2013 GitHub, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #include "atom/browser/api/atom_api_app.h" #import #include "base/strings/sys_string_conversions.h" namespace atom { namespace api { // Callback passed to js which will stop accessing the given bookmark. void OnStopAccessingSecurityScopedResource(NSURL* bookmarkUrl) { [bookmarkUrl stopAccessingSecurityScopedResource]; [bookmarkUrl release]; } // Get base64 encoded NSData, create a bookmark for it and start accessing it. base::RepeatingCallback App::StartAccessingSecurityScopedResource( mate::Arguments* args) { std::string data; args->GetNext(&data); NSString* base64str = base::SysUTF8ToNSString(data); NSData* bookmarkData = [[NSData alloc] initWithBase64EncodedString:base64str options:0]; // Create bookmarkUrl from NSData. BOOL isStale = false; NSError* error = nil; NSURL* bookmarkUrl = [NSURL URLByResolvingBookmarkData:bookmarkData options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:&isStale error:&error]; if (error != nil) { NSString* err = [NSString stringWithFormat:@"NSError: %@ %@", error, [error userInfo]]; args->ThrowError(base::SysNSStringToUTF8(err)); } if (isStale) { args->ThrowError("bookmarkDataIsStale - try recreating the bookmark"); } if (error == nil && isStale == false) { [bookmarkUrl startAccessingSecurityScopedResource]; } // Stop the NSURL from being GC'd. [bookmarkUrl retain]; // Return a js callback which will close the bookmark. return base::BindRepeating(&OnStopAccessingSecurityScopedResource, bookmarkUrl); } } // namespace atom } // namespace api