﻿// C++/WinRT v1.0.180821.2

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

#pragma once
#include "winrt/impl/Windows.Foundation.1.h"
#include "winrt/impl/Windows.Foundation.Collections.1.h"
#include "winrt/impl/Windows.Storage.FileProperties.1.h"
#include "winrt/impl/Windows.Storage.Provider.1.h"
#include "winrt/impl/Windows.Storage.Search.1.h"
#include "winrt/impl/Windows.Storage.Streams.1.h"
#include "winrt/impl/Windows.System.1.h"
#include "winrt/impl/Windows.Storage.1.h"

WINRT_EXPORT namespace winrt::Windows::Storage {

struct ApplicationDataSetVersionHandler : Windows::Foundation::IUnknown
{
    ApplicationDataSetVersionHandler(std::nullptr_t = nullptr) noexcept {}
    template <typename L> ApplicationDataSetVersionHandler(L lambda);
    template <typename F> ApplicationDataSetVersionHandler(F* function);
    template <typename O, typename M> ApplicationDataSetVersionHandler(O* object, M method);
    template <typename O, typename M> ApplicationDataSetVersionHandler(com_ptr<O>&& object, M method);
    template <typename O, typename M> ApplicationDataSetVersionHandler(weak_ref<O>&& object, M method);
    void operator()(Windows::Storage::SetVersionRequest const& setVersionRequest) const;
};

struct StreamedFileDataRequestedHandler : Windows::Foundation::IUnknown
{
    StreamedFileDataRequestedHandler(std::nullptr_t = nullptr) noexcept {}
    template <typename L> StreamedFileDataRequestedHandler(L lambda);
    template <typename F> StreamedFileDataRequestedHandler(F* function);
    template <typename O, typename M> StreamedFileDataRequestedHandler(O* object, M method);
    template <typename O, typename M> StreamedFileDataRequestedHandler(com_ptr<O>&& object, M method);
    template <typename O, typename M> StreamedFileDataRequestedHandler(weak_ref<O>&& object, M method);
    void operator()(Windows::Storage::StreamedFileDataRequest const& stream) const;
};

}

namespace winrt::impl {

}

WINRT_EXPORT namespace winrt::Windows::Storage {

struct WINRT_EBO AppDataPaths :
    Windows::Storage::IAppDataPaths
{
    AppDataPaths(std::nullptr_t) noexcept {}
    static Windows::Storage::AppDataPaths GetForUser(Windows::System::User const& user);
    static Windows::Storage::AppDataPaths GetDefault();
};

struct WINRT_EBO ApplicationData :
    Windows::Storage::IApplicationData,
    impl::require<ApplicationData, Windows::Storage::IApplicationData2, Windows::Storage::IApplicationData3>
{
    ApplicationData(std::nullptr_t) noexcept {}
    static Windows::Storage::ApplicationData Current();
    static Windows::Foundation::IAsyncOperation<Windows::Storage::ApplicationData> GetForUserAsync(Windows::System::User const& user);
};

struct WINRT_EBO ApplicationDataCompositeValue :
    Windows::Foundation::Collections::IPropertySet
{
    ApplicationDataCompositeValue(std::nullptr_t) noexcept {}
    ApplicationDataCompositeValue();
};

struct WINRT_EBO ApplicationDataContainer :
    Windows::Storage::IApplicationDataContainer
{
    ApplicationDataContainer(std::nullptr_t) noexcept {}
};

struct WINRT_EBO ApplicationDataContainerSettings :
    Windows::Foundation::Collections::IPropertySet
{
    ApplicationDataContainerSettings(std::nullptr_t) noexcept {}
};

struct CachedFileManager
{
    CachedFileManager() = delete;
    static void DeferUpdates(Windows::Storage::IStorageFile const& file);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::Provider::FileUpdateStatus> CompleteUpdatesAsync(Windows::Storage::IStorageFile const& file);
};

struct DownloadsFolder
{
    DownloadsFolder() = delete;
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile> CreateFileAsync(param::hstring const& desiredName);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFolder> CreateFolderAsync(param::hstring const& desiredName);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile> CreateFileAsync(param::hstring const& desiredName, Windows::Storage::CreationCollisionOption const& option);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFolder> CreateFolderAsync(param::hstring const& desiredName, Windows::Storage::CreationCollisionOption const& option);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile> CreateFileForUserAsync(Windows::System::User const& user, param::hstring const& desiredName);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFolder> CreateFolderForUserAsync(Windows::System::User const& user, param::hstring const& desiredName);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile> CreateFileForUserAsync(Windows::System::User const& user, param::hstring const& desiredName, Windows::Storage::CreationCollisionOption const& option);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFolder> CreateFolderForUserAsync(Windows::System::User const& user, param::hstring const& desiredName, Windows::Storage::CreationCollisionOption const& option);
};

struct FileIO
{
    FileIO() = delete;
    static Windows::Foundation::IAsyncOperation<hstring> ReadTextAsync(Windows::Storage::IStorageFile const& file);
    static Windows::Foundation::IAsyncOperation<hstring> ReadTextAsync(Windows::Storage::IStorageFile const& file, Windows::Storage::Streams::UnicodeEncoding const& encoding);
    static Windows::Foundation::IAsyncAction WriteTextAsync(Windows::Storage::IStorageFile const& file, param::hstring const& contents);
    static Windows::Foundation::IAsyncAction WriteTextAsync(Windows::Storage::IStorageFile const& file, param::hstring const& contents, Windows::Storage::Streams::UnicodeEncoding const& encoding);
    static Windows::Foundation::IAsyncAction AppendTextAsync(Windows::Storage::IStorageFile const& file, param::hstring const& contents);
    static Windows::Foundation::IAsyncAction AppendTextAsync(Windows::Storage::IStorageFile const& file, param::hstring const& contents, Windows::Storage::Streams::UnicodeEncoding const& encoding);
    static Windows::Foundation::IAsyncOperation<Windows::Foundation::Collections::IVector<hstring>> ReadLinesAsync(Windows::Storage::IStorageFile const& file);
    static Windows::Foundation::IAsyncOperation<Windows::Foundation::Collections::IVector<hstring>> ReadLinesAsync(Windows::Storage::IStorageFile const& file, Windows::Storage::Streams::UnicodeEncoding const& encoding);
    static Windows::Foundation::IAsyncAction WriteLinesAsync(Windows::Storage::IStorageFile const& file, param::async_iterable<hstring> const& lines);
    static Windows::Foundation::IAsyncAction WriteLinesAsync(Windows::Storage::IStorageFile const& file, param::async_iterable<hstring> const& lines, Windows::Storage::Streams::UnicodeEncoding const& encoding);
    static Windows::Foundation::IAsyncAction AppendLinesAsync(Windows::Storage::IStorageFile const& file, param::async_iterable<hstring> const& lines);
    static Windows::Foundation::IAsyncAction AppendLinesAsync(Windows::Storage::IStorageFile const& file, param::async_iterable<hstring> const& lines, Windows::Storage::Streams::UnicodeEncoding const& encoding);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::Streams::IBuffer> ReadBufferAsync(Windows::Storage::IStorageFile const& file);
    static Windows::Foundation::IAsyncAction WriteBufferAsync(Windows::Storage::IStorageFile const& file, Windows::Storage::Streams::IBuffer const& buffer);
    static Windows::Foundation::IAsyncAction WriteBytesAsync(Windows::Storage::IStorageFile const& file, array_view<uint8_t const> buffer);
};

struct KnownFolders
{
    KnownFolders() = delete;
    static Windows::Storage::StorageFolder CameraRoll();
    static Windows::Storage::StorageFolder Playlists();
    static Windows::Storage::StorageFolder SavedPictures();
    static Windows::Storage::StorageFolder MusicLibrary();
    static Windows::Storage::StorageFolder PicturesLibrary();
    static Windows::Storage::StorageFolder VideosLibrary();
    static Windows::Storage::StorageFolder DocumentsLibrary();
    static Windows::Storage::StorageFolder HomeGroup();
    static Windows::Storage::StorageFolder RemovableDevices();
    static Windows::Storage::StorageFolder MediaServerDevices();
    static Windows::Storage::StorageFolder Objects3D();
    static Windows::Storage::StorageFolder AppCaptures();
    static Windows::Storage::StorageFolder RecordedCalls();
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFolder> GetFolderForUserAsync(Windows::System::User const& user, Windows::Storage::KnownFolderId const& folderId);
};

struct PathIO
{
    PathIO() = delete;
    static Windows::Foundation::IAsyncOperation<hstring> ReadTextAsync(param::hstring const& absolutePath);
    static Windows::Foundation::IAsyncOperation<hstring> ReadTextAsync(param::hstring const& absolutePath, Windows::Storage::Streams::UnicodeEncoding const& encoding);
    static Windows::Foundation::IAsyncAction WriteTextAsync(param::hstring const& absolutePath, param::hstring const& contents);
    static Windows::Foundation::IAsyncAction WriteTextAsync(param::hstring const& absolutePath, param::hstring const& contents, Windows::Storage::Streams::UnicodeEncoding const& encoding);
    static Windows::Foundation::IAsyncAction AppendTextAsync(param::hstring const& absolutePath, param::hstring const& contents);
    static Windows::Foundation::IAsyncAction AppendTextAsync(param::hstring const& absolutePath, param::hstring const& contents, Windows::Storage::Streams::UnicodeEncoding const& encoding);
    static Windows::Foundation::IAsyncOperation<Windows::Foundation::Collections::IVector<hstring>> ReadLinesAsync(param::hstring const& absolutePath);
    static Windows::Foundation::IAsyncOperation<Windows::Foundation::Collections::IVector<hstring>> ReadLinesAsync(param::hstring const& absolutePath, Windows::Storage::Streams::UnicodeEncoding const& encoding);
    static Windows::Foundation::IAsyncAction WriteLinesAsync(param::hstring const& absolutePath, param::async_iterable<hstring> const& lines);
    static Windows::Foundation::IAsyncAction WriteLinesAsync(param::hstring const& absolutePath, param::async_iterable<hstring> const& lines, Windows::Storage::Streams::UnicodeEncoding const& encoding);
    static Windows::Foundation::IAsyncAction AppendLinesAsync(param::hstring const& absolutePath, param::async_iterable<hstring> const& lines);
    static Windows::Foundation::IAsyncAction AppendLinesAsync(param::hstring const& absolutePath, param::async_iterable<hstring> const& lines, Windows::Storage::Streams::UnicodeEncoding const& encoding);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::Streams::IBuffer> ReadBufferAsync(param::hstring const& absolutePath);
    static Windows::Foundation::IAsyncAction WriteBufferAsync(param::hstring const& absolutePath, Windows::Storage::Streams::IBuffer const& buffer);
    static Windows::Foundation::IAsyncAction WriteBytesAsync(param::hstring const& absolutePath, array_view<uint8_t const> buffer);
};

struct WINRT_EBO SetVersionDeferral :
    Windows::Storage::ISetVersionDeferral
{
    SetVersionDeferral(std::nullptr_t) noexcept {}
};

struct WINRT_EBO SetVersionRequest :
    Windows::Storage::ISetVersionRequest
{
    SetVersionRequest(std::nullptr_t) noexcept {}
};

struct WINRT_EBO StorageFile :
    Windows::Storage::IStorageFile,
    impl::require<StorageFile, Windows::Storage::IStorageFile2, Windows::Storage::IStorageFilePropertiesWithAvailability, Windows::Storage::IStorageItem2, Windows::Storage::IStorageItemProperties, Windows::Storage::IStorageItemProperties2, Windows::Storage::IStorageItemPropertiesWithProvider>
{
    StorageFile(std::nullptr_t) noexcept {}
    using impl::consume_t<StorageFile, Windows::Storage::IStorageFile2>::OpenAsync;
    using Windows::Storage::IStorageFile::OpenAsync;
    using impl::consume_t<StorageFile, Windows::Storage::IStorageFile2>::OpenTransactedWriteAsync;
    using Windows::Storage::IStorageFile::OpenTransactedWriteAsync;
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile> GetFileFromPathAsync(param::hstring const& path);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile> GetFileFromApplicationUriAsync(Windows::Foundation::Uri const& uri);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile> CreateStreamedFileAsync(param::hstring const& displayNameWithExtension, Windows::Storage::StreamedFileDataRequestedHandler const& dataRequested, Windows::Storage::Streams::IRandomAccessStreamReference const& thumbnail);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile> ReplaceWithStreamedFileAsync(Windows::Storage::IStorageFile const& fileToReplace, Windows::Storage::StreamedFileDataRequestedHandler const& dataRequested, Windows::Storage::Streams::IRandomAccessStreamReference const& thumbnail);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile> CreateStreamedFileFromUriAsync(param::hstring const& displayNameWithExtension, Windows::Foundation::Uri const& uri, Windows::Storage::Streams::IRandomAccessStreamReference const& thumbnail);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile> ReplaceWithStreamedFileFromUriAsync(Windows::Storage::IStorageFile const& fileToReplace, Windows::Foundation::Uri const& uri, Windows::Storage::Streams::IRandomAccessStreamReference const& thumbnail);
};

struct WINRT_EBO StorageFolder :
    Windows::Storage::IStorageFolder,
    impl::require<StorageFolder, Windows::Storage::IStorageFolder2, Windows::Storage::IStorageFolder3, Windows::Storage::IStorageItem2, Windows::Storage::IStorageItemProperties, Windows::Storage::IStorageItemProperties2, Windows::Storage::IStorageItemPropertiesWithProvider, Windows::Storage::Search::IStorageFolderQueryOperations>
{
    StorageFolder(std::nullptr_t) noexcept {}
    using impl::consume_t<StorageFolder, Windows::Storage::Search::IStorageFolderQueryOperations>::GetFilesAsync;
    using Windows::Storage::IStorageFolder::GetFilesAsync;
    using impl::consume_t<StorageFolder, Windows::Storage::Search::IStorageFolderQueryOperations>::GetFoldersAsync;
    using Windows::Storage::IStorageFolder::GetFoldersAsync;
    using impl::consume_t<StorageFolder, Windows::Storage::Search::IStorageFolderQueryOperations>::GetItemsAsync;
    using Windows::Storage::IStorageFolder::GetItemsAsync;
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFolder> GetFolderFromPathAsync(param::hstring const& path);
};

struct WINRT_EBO StorageLibrary :
    Windows::Storage::IStorageLibrary,
    impl::require<StorageLibrary, Windows::Storage::IStorageLibrary2, Windows::Storage::IStorageLibrary3>
{
    StorageLibrary(std::nullptr_t) noexcept {}
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageLibrary> GetLibraryAsync(Windows::Storage::KnownLibraryId const& libraryId);
    static Windows::Foundation::IAsyncOperation<Windows::Storage::StorageLibrary> GetLibraryForUserAsync(Windows::System::User const& user, Windows::Storage::KnownLibraryId const& libraryId);
};

struct WINRT_EBO StorageLibraryChange :
    Windows::Storage::IStorageLibraryChange
{
    StorageLibraryChange(std::nullptr_t) noexcept {}
};

struct WINRT_EBO StorageLibraryChangeReader :
    Windows::Storage::IStorageLibraryChangeReader
{
    StorageLibraryChangeReader(std::nullptr_t) noexcept {}
};

struct WINRT_EBO StorageLibraryChangeTracker :
    Windows::Storage::IStorageLibraryChangeTracker
{
    StorageLibraryChangeTracker(std::nullptr_t) noexcept {}
};

struct WINRT_EBO StorageProvider :
    Windows::Storage::IStorageProvider,
    impl::require<StorageProvider, Windows::Storage::IStorageProvider2>
{
    StorageProvider(std::nullptr_t) noexcept {}
};

struct WINRT_EBO StorageStreamTransaction :
    Windows::Storage::IStorageStreamTransaction
{
    StorageStreamTransaction(std::nullptr_t) noexcept {}
};

struct WINRT_EBO StreamedFileDataRequest :
    Windows::Storage::Streams::IOutputStream,
    impl::require<StreamedFileDataRequest, Windows::Storage::IStreamedFileDataRequest>
{
    StreamedFileDataRequest(std::nullptr_t) noexcept {}
};

struct WINRT_EBO SystemAudioProperties :
    Windows::Storage::ISystemAudioProperties
{
    SystemAudioProperties(std::nullptr_t) noexcept {}
};

struct WINRT_EBO SystemDataPaths :
    Windows::Storage::ISystemDataPaths
{
    SystemDataPaths(std::nullptr_t) noexcept {}
    static Windows::Storage::SystemDataPaths GetDefault();
};

struct WINRT_EBO SystemGPSProperties :
    Windows::Storage::ISystemGPSProperties
{
    SystemGPSProperties(std::nullptr_t) noexcept {}
};

struct WINRT_EBO SystemImageProperties :
    Windows::Storage::ISystemImageProperties
{
    SystemImageProperties(std::nullptr_t) noexcept {}
};

struct WINRT_EBO SystemMediaProperties :
    Windows::Storage::ISystemMediaProperties
{
    SystemMediaProperties(std::nullptr_t) noexcept {}
};

struct WINRT_EBO SystemMusicProperties :
    Windows::Storage::ISystemMusicProperties
{
    SystemMusicProperties(std::nullptr_t) noexcept {}
};

struct WINRT_EBO SystemPhotoProperties :
    Windows::Storage::ISystemPhotoProperties
{
    SystemPhotoProperties(std::nullptr_t) noexcept {}
};

struct SystemProperties
{
    SystemProperties() = delete;
    static hstring Author();
    static hstring Comment();
    static hstring ItemNameDisplay();
    static hstring Keywords();
    static hstring Rating();
    static hstring Title();
    static Windows::Storage::SystemAudioProperties Audio();
    static Windows::Storage::SystemGPSProperties GPS();
    static Windows::Storage::SystemMediaProperties Media();
    static Windows::Storage::SystemMusicProperties Music();
    static Windows::Storage::SystemPhotoProperties Photo();
    static Windows::Storage::SystemVideoProperties Video();
    static Windows::Storage::SystemImageProperties Image();
};

struct WINRT_EBO SystemVideoProperties :
    Windows::Storage::ISystemVideoProperties
{
    SystemVideoProperties(std::nullptr_t) noexcept {}
};

struct WINRT_EBO UserDataPaths :
    Windows::Storage::IUserDataPaths
{
    UserDataPaths(std::nullptr_t) noexcept {}
    static Windows::Storage::UserDataPaths GetForUser(Windows::System::User const& user);
    static Windows::Storage::UserDataPaths GetDefault();
};

}
