Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for containerURLs through publisher cache folders #2384

Merged
merged 3 commits into from
Apr 4, 2017
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 32 additions & 6 deletions Frameworks/Foundation/NSFileManager.mm
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,17 @@
#import <CFFoundationInternal.h>
#import <ForFoundationOnly.h>
#import "NSDirectoryEnumeratorInternal.h"
#import <StringHelpers.h>

#include <COMIncludes.h>
#import <windows.storage.h>
#import <wrl/client.h>
#include <COMIncludes_End.h>

static const wchar_t* TAG = L"NSFileManager";

#ifdef __linux__
#define _S_IFDIR S_IFDIR
#endif
using namespace Microsoft::WRL;
using namespace ABI::Windows::Storage;

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we can get rid of the #ifdef linux code here.

// file attribute keys
NSString* const NSFileType = @"NSFileType";
Expand Down Expand Up @@ -142,11 +147,32 @@ - (NSArray*)URLsForDirectory:(NSSearchPathDirectory)directory inDomains:(NSSearc
// Locating Application Group Container Directories

/**
@Status Stub
@Status Caveat
@Notes Container is contained within a Publisher Cache Folder, so a user could erase the data
*/
- (NSURL*)containerURLForSecurityApplicationGroupIdentifier:(NSString*)groupIdentifier {
UNIMPLEMENTED();
return nil;
ComPtr<IApplicationDataStatics> applicationDataStatics;
RETURN_NULL_IF_FAILED(Windows::Foundation::GetActivationFactory(
Microsoft::WRL::Wrappers::HStringReference(RuntimeClass_Windows_Storage_ApplicationData).Get(), &applicationDataStatics));

ComPtr<IApplicationData> applicationData;
RETURN_NULL_IF_FAILED(applicationDataStatics->get_Current(&applicationData));

// IApplicationData3 has the method needed for container URL
ComPtr<IApplicationData3> applicationData3;
RETURN_NULL_IF_FAILED(applicationData.As(&applicationData3));

ComPtr<IStorageFolder> folder;
RETURN_NULL_IF_FAILED(applicationData3->GetPublisherCacheFolder(Strings::NarrowToWide<HSTRING>(groupIdentifier).Get(), &folder));

// Convert to IStorageItem to get the path
ComPtr<IStorageItem> storageItem;
RETURN_NULL_IF_FAILED(folder.As(&storageItem));

Wrappers::HString folderPath;
RETURN_NULL_IF_FAILED(storageItem->get_Path(folderPath.GetAddressOf()));

return [NSURL fileURLWithPath:Strings::WideToNSString(folderPath.Get()) isDirectory:YES];
}

// Discovering Directory Contents
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26228.9
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApplicationGroupFolderRead", "ApplicationGroupFolderRead", "{5C02A474-AC91-49A7-AC66-28897E1DC6A4}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ApplicationGroupFolderRead", "ApplicationGroupFolderRead.vsimporter\ApplicationGroupFolderRead-WinStore10\ApplicationGroupFolderRead.vcxproj", "{E32A9C72-ADE6-40FD-B382-9F0F7E882273}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build Support", "Build Support", "{EEB3D11F-8511-4839-BE24-3BAD64499260}"
EndProject
Project("{13B669BE-BB05-4DDF-9536-439F39A36129}") = "NugetRestore", "..\..\..\common\NugetRestore.msbuildproj", "{B2C6186E-B340-49D8-888E-76ED83752E43}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|ARM = Debug|ARM
Debug|Win32 = Debug|Win32
Release|Any CPU = Release|Any CPU
Release|ARM = Release|ARM
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E32A9C72-ADE6-40FD-B382-9F0F7E882273}.Debug|Any CPU.ActiveCfg = Debug|Win32
{E32A9C72-ADE6-40FD-B382-9F0F7E882273}.Debug|ARM.ActiveCfg = Debug|ARM
{E32A9C72-ADE6-40FD-B382-9F0F7E882273}.Debug|ARM.Build.0 = Debug|ARM
{E32A9C72-ADE6-40FD-B382-9F0F7E882273}.Debug|ARM.Deploy.0 = Debug|ARM
{E32A9C72-ADE6-40FD-B382-9F0F7E882273}.Debug|Win32.ActiveCfg = Debug|Win32
{E32A9C72-ADE6-40FD-B382-9F0F7E882273}.Debug|Win32.Build.0 = Debug|Win32
{E32A9C72-ADE6-40FD-B382-9F0F7E882273}.Debug|Win32.Deploy.0 = Debug|Win32
{E32A9C72-ADE6-40FD-B382-9F0F7E882273}.Release|Any CPU.ActiveCfg = Release|Win32
{E32A9C72-ADE6-40FD-B382-9F0F7E882273}.Release|ARM.ActiveCfg = Release|ARM
{E32A9C72-ADE6-40FD-B382-9F0F7E882273}.Release|ARM.Build.0 = Release|ARM
{E32A9C72-ADE6-40FD-B382-9F0F7E882273}.Release|ARM.Deploy.0 = Release|ARM
{E32A9C72-ADE6-40FD-B382-9F0F7E882273}.Release|Win32.ActiveCfg = Release|Win32
{E32A9C72-ADE6-40FD-B382-9F0F7E882273}.Release|Win32.Build.0 = Release|Win32
{E32A9C72-ADE6-40FD-B382-9F0F7E882273}.Release|Win32.Deploy.0 = Release|Win32
{B2C6186E-B340-49D8-888E-76ED83752E43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B2C6186E-B340-49D8-888E-76ED83752E43}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B2C6186E-B340-49D8-888E-76ED83752E43}.Debug|ARM.ActiveCfg = Debug|Any CPU
{B2C6186E-B340-49D8-888E-76ED83752E43}.Debug|ARM.Build.0 = Debug|Any CPU
{B2C6186E-B340-49D8-888E-76ED83752E43}.Debug|Win32.ActiveCfg = Debug|Any CPU
{B2C6186E-B340-49D8-888E-76ED83752E43}.Debug|Win32.Build.0 = Debug|Any CPU
{B2C6186E-B340-49D8-888E-76ED83752E43}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B2C6186E-B340-49D8-888E-76ED83752E43}.Release|Any CPU.Build.0 = Release|Any CPU
{B2C6186E-B340-49D8-888E-76ED83752E43}.Release|ARM.ActiveCfg = Release|Any CPU
{B2C6186E-B340-49D8-888E-76ED83752E43}.Release|ARM.Build.0 = Release|Any CPU
{B2C6186E-B340-49D8-888E-76ED83752E43}.Release|Win32.ActiveCfg = Release|Any CPU
{B2C6186E-B340-49D8-888E-76ED83752E43}.Release|Win32.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{E32A9C72-ADE6-40FD-B382-9F0F7E882273} = {5C02A474-AC91-49A7-AC66-28897E1DC6A4}
{B2C6186E-B340-49D8-888E-76ED83752E43} = {EEB3D11F-8511-4839-BE24-3BAD64499260}
EndGlobalSection
EndGlobal
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Application
x:Class="ApplicationGroupFolderRead.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:ApplicationGroupFolderRead"
RequestedTheme="Light">

</Application>
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
//
// App.xaml.cpp
// Implementation of the App class.
//

// clang-format off

#include "pch.h"

using namespace ApplicationGroupFolderRead;

using namespace Platform;
using namespace Windows::ApplicationModel;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Controls::Primitives;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Interop;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::UI::Xaml::Navigation;

/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
App::App() {
InitializeComponent();
Suspending += ref new SuspendingEventHandler(this, &App::OnSuspending);
}

extern "C" int main(int argc, char* argv[]);
extern "C" void UIApplicationActivated(Windows::ApplicationModel::Activation::IActivatedEventArgs^ e);
extern "C" void UIApplicationLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ e);
#ifdef ENABLE_BACKGROUND_TASK
extern "C" void UIApplicationBackgroundActivated(Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs^ e);
#endif

/// <summary>
/// Invoked when the application is launched normally by the end user. Other entry points
/// will be used such as when the application is launched to open a specific file.
/// </summary>
/// <param name="e">Details about the launch request and process.</param>
void App::OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ e) {
main(0, NULL);
UIApplicationLaunched(e);
}

void App::OnActivated(Windows::ApplicationModel::Activation::IActivatedEventArgs^ e) {
main(0, NULL);
UIApplicationActivated(e);
}

void App::OnFileActivated(FileActivatedEventArgs^ args)
{
main(0, NULL);
UIApplicationActivated(args);
}

#ifdef ENABLE_BACKGROUND_TASK
void App::OnBackgroundActivated(Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs^ e) {
__super ::OnBackgroundActivated(e);
UIApplicationBackgroundActivated(e);
}
#endif

/// <summary>
/// Invoked when application execution is being suspended. Application state is saved
/// without knowing whether the application will be terminated or resumed with the contents
/// of memory still intact.
/// </summary>
/// <param name="sender">The source of the suspend request.</param>
/// <param name="e">Details about the suspend request.</param>
void App::OnSuspending(Object^ /*sender*/, SuspendingEventArgs^ /*e*/) {
// TODO: Save application state and stop any background activity
}

/// <summary>
/// Invoked when Navigation to a certain page fails
/// </summary>
/// <param name="sender">The Frame which failed navigation</param>
/// <param name="e">Details about the navigation failure</param>
void App::OnNavigationFailed(Platform::Object^ sender, Windows::UI::Xaml::Navigation::NavigationFailedEventArgs^ e) {
throw ref new FailureException("Failed to load Page " + e->SourcePageType.Name);
}

// clang-format on
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//
// App.xaml.h
// Declaration of the App class.
//

// clang-format off
#pragma once

#include "App.g.h"

namespace ApplicationGroupFolderRead {
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
ref class App sealed {
protected:
virtual void OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ e) override;
virtual void OnActivated(Windows::ApplicationModel::Activation::IActivatedEventArgs^ e) override;
#ifdef ENABLE_BACKGROUND_TASK
virtual void OnBackgroundActivated(Windows::ApplicationModel::Activation::BackgroundActivatedEventArgs^ e) override;
#endif

void OnFileActivated(Windows::ApplicationModel::Activation::FileActivatedEventArgs^ args) override;

internal : App();

private:
void OnSuspending(Platform::Object ^ sender, Windows::ApplicationModel::SuspendingEventArgs^ e);
void OnNavigationFailed(Platform::Object ^ sender, Windows::UI::Xaml::Navigation::NavigationFailedEventArgs^ e);
};
}

// clang-format on
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
ALWAYS_SEARCH_USER_PATHS = NO
APPFOLDER = sbuild/Debug-iphoneos/ApplicationGroupFolderRead.app
ARCHS = msvc
ARCHS_STANDARD = armv6
ARCHS_STANDARD_32_BIT = armv6
ARCHS_STANDARD_INCLUDING_64_BIT = armv6
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME =
BUILD_DIR = sbuild
BUILT_PRODUCTS_DIR = sbuild/Debug-iphoneos
CLANG_ANALYZER_NONNULL = YES
CLANG_CXX_LANGUAGE_STANDARD = gnu++0x
CLANG_CXX_LIBRARY = libc++
CLANG_ENABLE_MODULES = YES
CLANG_ENABLE_OBJC_ARC = YES
CLANG_WARN_BOOL_CONVERSION = YES
CLANG_WARN_CONSTANT_CONVERSION = YES
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR
CLANG_WARN_EMPTY_BODY = YES
CLANG_WARN_ENUM_CONVERSION = YES
CLANG_WARN_INT_CONVERSION = YES
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR
CLANG_WARN_UNREACHABLE_CODE = YES
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
CODESIGNING_FOLDER_PATH = sbuild/Debug-iphoneos/ApplicationGroupFolderRead.app
CODE_SIGN_ENTITLEMENTS = ApplicationGroupFolderRead/ApplicationGroupFolderRead.entitlements
CODE_SIGN_IDENTITY[sdk=iphoneos*] = iPhone Developer
CONFIGURATION = Debug
CONFIGURATION_BUILD_DIR = sbuild/Debug-iphoneos
CONFIGURATION_TEMP_DIR = sbuild/ApplicationGroupFolderRead.sbuild/Debug-iphoneos
COPY_PHASE_STRIP = NO
CURRENT_ARCH = msvc
DEAD_CODE_STRIPPING = YES
DEBUG_INFORMATION_FORMAT = dwarf
DERIVED_FILES_DIR = sbuild/ApplicationGroupFolderRead.sbuild/Debug-iphoneos/ApplicationGroupFolderRead.sbuild/DerivedSources
DERIVED_FILE_DIR = sbuild/ApplicationGroupFolderRead.sbuild/Debug-iphoneos/ApplicationGroupFolderRead.sbuild/DerivedSources
DERIVED_SOURCES_DIR = sbuild/ApplicationGroupFolderRead.sbuild/Debug-iphoneos/ApplicationGroupFolderRead.sbuild/DerivedSources
EFFECTIVE_PLATFORM_NAME = -iphoneos
ENABLE_STRICT_OBJC_MSGSEND = YES
ENABLE_TESTABILITY = YES
ENTITLEMENTS_PATH = ApplicationGroupFolderRead/ApplicationGroupFolderRead.entitlements
EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = *.nib *.lproj *.framework *.gch (*) .DS_Store CVS .svn .git .hg *.xcodeproj *.xcode *.pbproj *.pbxproj *.xcassets
EXECUTABLE_FOLDER_PATH = ApplicationGroupFolderRead.app
EXECUTABLE_NAME = ApplicationGroupFolderRead
EXECUTABLE_PATH = ApplicationGroupFolderRead.app/ApplicationGroupFolderRead
FRAMEWORK_SEARCH_PATHS =
FULL_PRODUCT_NAME = ApplicationGroupFolderRead.app
GCC_C_LANGUAGE_STANDARD = gnu99
GCC_DYNAMIC_NO_PIC = NO
GCC_NO_COMMON_BLOCKS = YES
GCC_OPTIMIZATION_LEVEL = 0
GCC_PREFIX_HEADER =
GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1
GCC_REUSE_STRINGS = YES
GCC_STRICT_ALIASING = YES
GCC_UNROLL_LOOPS = NO
GCC_WARN_64_TO_32_BIT_CONVERSION = YES
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR
GCC_WARN_UNDECLARED_SELECTOR = YES
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE
GCC_WARN_UNUSED_FUNCTION = YES
GCC_WARN_UNUSED_VARIABLE = YES
HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT = YES
HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES = YES
HEADERMAP_INCLUDES_PROJECT_HEADERS = YES
HEADER_SEARCH_PATHS =
INFOPLIST_FILE = ApplicationGroupFolderRead/Info.plist
INFOPLIST_PATH = ApplicationGroupFolderRead.app/Info.plist
IPHONEOS_DEPLOYMENT_TARGET = 9.3
LD_NO_PIE = NO
LD_RUNPATH_SEARCH_PATHS = @executable_path/Frameworks
LIBRARY_SEARCH_PATHS =
LINK_FILE_LIST = sbuild/ApplicationGroupFolderRead.sbuild/Debug-iphoneos/ApplicationGroupFolderRead.sbuild/Objects/msvc/ApplicationGroupFolderRead.LinkFileList
LINK_WITH_STANDARD_LIBRARIES = NO
LOCALIZED_RESOURCES_FOLDER_PATH = ApplicationGroupFolderRead.app/English.lproj
MTL_ENABLE_DEBUG_INFO = YES
OBJECT_FILE_DIR = sbuild/ApplicationGroupFolderRead.sbuild/Debug-iphoneos/ApplicationGroupFolderRead.sbuild/Objects/msvc
OBJROOT = sbuild
ONLY_ACTIVE_ARCH = YES
OTHER_CFLAGS =
OTHER_CPLUSPLUSFLAGS =
OTHER_LDFLAGS =
PLATFORM_NAME = iphoneos
PRIVATE_HEADERS_FOLDER_PATH = ApplicationGroupFolderRead.app/Private
PRODUCT_BUNDLE_IDENTIFIER = MSFT.ApplicationGroupFolderRead
PRODUCT_NAME = ApplicationGroupFolderRead
PRODUCT_TYPE = com.apple.product-type.application
PROJECT = ApplicationGroupFolderRead
PROJECT_DIR = C:/Users/alballw/winobjc/tests/testapps/ApplicationGroupFolderRead
PROJECT_FILE_PATH = C:\Users\alballw\winobjc\tests\testapps\ApplicationGroupFolderRead\ApplicationGroupFolderRead.xcodeproj
PROJECT_NAME = ApplicationGroupFolderRead
PROJECT_TEMP_DIR = sbuild/ApplicationGroupFolderRead.sbuild
PROJECT_TEMP_ROOT = sbuild
PUBLIC_HEADERS_FOLDER_PATH = ApplicationGroupFolderRead.app/Public
SDKROOT = iphoneos
SOURCE_ROOT = C:/Users/alballw/winobjc/tests/testapps/ApplicationGroupFolderRead
SRCROOT = C:/Users/alballw/winobjc/tests/testapps/ApplicationGroupFolderRead
SYMROOT = sbuild
TARGETED_DEVICE_FAMILY = 1,2
TARGETNAME = ApplicationGroupFolderRead
TARGET_BUILD_DIR = sbuild/Debug-iphoneos
TARGET_NAME = ApplicationGroupFolderRead
TARGET_SDKVERSION = 5.0
TARGET_TEMP_DIR = sbuild/ApplicationGroupFolderRead.sbuild/Debug-iphoneos/ApplicationGroupFolderRead.sbuild
TEMP_DIR = sbuild/ApplicationGroupFolderRead.sbuild/Debug-iphoneos/ApplicationGroupFolderRead.sbuild
UNLOCALIZED_RESOURCES_FOLDER_PATH = ApplicationGroupFolderRead.app
USER = alballw
USER_HEADER_SEARCH_PATHS =
USE_HEADERMAP = YES
WARNING_CFLAGS =
WARNING_LDFLAGS =
Loading