/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */

#ifdef __WIDL__
#pragma winrt ns_prefix
#endif

import "inspectable.idl";
import "hstring.idl";
import "windows.foundation.idl";

namespace Windows {
  namespace Foundation {
    interface IAsyncAction;
    interface TypedEventHandler;
    //struct EventRegistrationToken;

    namespace Collections {
      interface IPropertySet;
      interface IMapView;
    }
  }
  namespace Storage {
    interface IStorageItem;
    interface IStorageFolder;
    interface IApplicationData;
    interface IApplicationDataStatics;
    interface IApplicationDataSetVersionHandler;
    interface ApplicationDataContainer;
    interface ApplicationDataSetVersionHandler; //delegate
    interface ISetVersionRequest;
    interface ISetVersionDeferral;
    typedef enum StorageDeleteOption StorageDeleteOption;
    typedef enum NameCollisionOption NameCollisionOption;
    typedef enum StorageItemTypes StorageItemTypes;
    typedef enum ApplicationDataLocality ApplicationDataLocality;
    typedef enum ApplicationDataCreateDisposition ApplicationDataCreateDisposition;
    typedef enum FileAttributes FileAttributes;
    typedef enum CreationCollisionOption CreationCollisionOption;
  }
}

namespace Windows {
  namespace Storage {
    enum NameCollisionOption {
      GenerateUniqueName,
      ReplaceExisting,
      FailIfExists
    };

    enum StorageDeleteOption {
      Default,
      PermanentDelete
    };

    enum StorageItemTypes {
      None,
      File,
      Folder
    };

    enum ApplicationDataCreateDisposition {
      Always,
      Existing
    };

    enum ApplicationDataLocality {
      Local,
      Roaming,
      Temporary
    };

    enum FileAttributes {
      Normal,
      ReadOnly,
      Directory,
      Archive,
      Temporary
    };

    enum CreationCollisionOption {
      GenerateUniqueName,
      ReplaceExisting,
      FailIfExists,
      OpenIfExists
    };

    [uuid(4207A996-CA2F-42F7-BDE8-8B10457A7F30)]
    interface IStorageItem : IInspectable
    {
      HRESULT RenameAsyncOverloadDefaultOptions(HSTRING desiredName, /*IAsyncAction*/ IInspectable** action);
      HRESULT RenameAsync(HSTRING desiredName, NameCollisionOption option, /*IAsyncAction*/ IInspectable** action);
      HRESULT DeleteAsyncOverloadDefaultOptions(/*IAsyncAction*/ IInspectable** action);
      HRESULT DeleteAsync(StorageDeleteOption option, /*IAsyncAction*/ IInspectable** action);
      HRESULT GetBasicPropertiesAsync(/*IAsyncOperation<Windows.Storage.FileProperties.BasicProperties*>*/ IInspectable** action);
      [propget] HRESULT Name(HSTRING *value);
      [propget] HRESULT Path(HSTRING *value);
      [propget] HRESULT Attributes(FileAttributes* value);
      [propget] HRESULT DateCreated(Windows.Foundation.DateTime* value);
      HRESULT IsOfType(StorageItemTypes itemType, boolean* value);
    }

    [uuid(5A2A7520-4802-452D-9AD9-4351ADA7EC35)]
    interface IKnownFoldersStatics : IInspectable
    {
        [propget] HRESULT MusicLibrary(IStorageFolder** value);
        [propget] HRESULT PicturesLibrary(IStorageFolder** value);
        [propget] HRESULT VideosLibrary(IStorageFolder** value);
        [propget] HRESULT DocumentsLibrary(IStorageFolder** value);
        [propget] HRESULT HomeGroup(IStorageFolder** value);
        [propget] HRESULT RemovableDevices(IStorageFolder** value);
        [propget] HRESULT MediaServerDevices(IStorageFolder** value);
    }

    [uuid(72D1CB78-B3EF-4F75-A80B-6FD9DAE2944B)]
    interface IStorageFolder : IInspectable
    {
      HRESULT CreateFileAsyncOverloadDefaultOptions(HSTRING desiredName, /*IAsyncOperation<IStorageFile*>*/IInspectable** operation);
      HRESULT CreateFileAsync(HSTRING desiredName, CreationCollisionOption options, /*IAsyncOperation<IStorageFile*>*/IInspectable** operation);
      HRESULT CreateFolderAsyncOverloadDefaultOptions(HSTRING desiredName, /*IAsyncOperation<IStorageFolder*>*/IInspectable** operation);
      HRESULT CreateFolderAsync(HSTRING desiredName, CreationCollisionOption options, /*IAsyncOperation<StorageFolder*>*/IInspectable** operation);
      HRESULT GetFileAsync(HSTRING name, /*IAsyncOperation<StorageFile*>*/IInspectable** operation);
      HRESULT GetFolderAsync(HSTRING name, /*IAsyncOperation<StorageFolder*>*/IInspectable** operation);
      HRESULT GetItemAsync(HSTRING name, /*IAsyncOperation<StorageItem*>*/IInspectable** operation);
      HRESULT GetFilesAsyncOverloadDefaultOptionsStartAndCount(/*IAsyncOperation<IVectorView<StorageFile*>*>*/IInspectable** operation);
      HRESULT GetFoldersAsyncOverloadDefaultOptionsStartAndCount(/*IAsyncOperation<IVectorView<StorageFolder*>*>*/IInspectable** operation);
      HRESULT GetItemsAsyncOverloadDefaultStartAndCount(/*IAsyncOperation<IVectorView<StorageItem*>*>*/IInspectable** operation);
    }

    [uuid(C5AEFD1E-F467-40BA-8566-AB640A441E1D)]
    interface IApplicationDataContainer : IInspectable {
      [propget] HRESULT Name(HSTRING* value);
      [propget] HRESULT Locality(ApplicationDataLocality* value);
      [propget] HRESULT Values(/*IPropertySet*/IInspectable** value);
      [propget] HRESULT Containers(/*IMapView<HSTRING, ApplicationDataContainer*>*/IInspectable** value);
       HRESULT CreateContainer(HSTRING name, ApplicationDataCreateDisposition disposition, IApplicationDataContainer** container);
       HRESULT DeleteContainer([in] HSTRING name);
     }

    [uuid(C3DA6FB7-B744-4B45-B0B8-223A0938D0DC)]
    interface IApplicationData : IInspectable {
      [propget] HRESULT Version(int* value);
      HRESULT SetVersionAsync(int desiredVersion, ApplicationDataSetVersionHandler* handler, /*IAsyncAction*/ IInspectable** setVersionOperation);
      HRESULT ClearAllAsync(/*IAsyncAction*/ IInspectable** clearOperation);
      HRESULT ClearAsync(ApplicationDataLocality locality, /*IAsyncAction*/ IInspectable** clearOperation);
      [propget] HRESULT LocalSettings(IApplicationDataContainer** value);
      [propget] HRESULT RoamingSettings(IApplicationDataContainer** value);
      [propget] HRESULT LocalFolder(IStorageFolder** value);
      [propget] HRESULT RoamingFolder(IStorageFolder** value);
      [propget] HRESULT TemporaryFolder(IStorageFolder** value);
      // [eventadd] HRESULT DataChanged(/*TypedEventHandler<ApplicationData*, IInspectable*>*/IInspectable* handler, EventRegistrationToken* token);
      /* [eventremove] */ HRESULT DataChanged(EventRegistrationToken token);
      HRESULT SignalDataChanged();
      HRESULT RoamingStorageQuota(UINT64* value);
    }

    [uuid(9E65CD69-0BA3-4E32-BE29-B02DE6607638)]
    interface IApplicationData2 : IInspectable {
      [propget] HRESULT LocalCacheFolder(IStorageFolder** value);
    }

    [uuid(5612147B-E843-45E3-94D8-06169E3C8E17)]
    interface IApplicationDataStatics : IInspectable {
      [propget] HRESULT Current(IApplicationData** data);
    }

    [uuid(A05791E6-CC9F-4687-ACAB-A364FD785463)]
    interface ApplicationDataSetVersionHandler : IUnknown {
      HRESULT ApplicationDataSetVersionHandler(ISetVersionRequest* setVersionRequest);
    }

    [uuid(B9C76B9B-1056-4E69-8330-162619956F9B)]
    interface ISetVersionRequest : IInspectable {
      [propget] HRESULT CurrentVersion(UINT32* currentVersion);
      [propget] HRESULT DesiredVersion(UINT32* desiredVersion);
      HRESULT GetDeferral(ISetVersionDeferral** deferral);
    }

    [uuid(033508A2-781A-437A-B078-3F32BADCFE47)]
    interface ISetVersionDeferral : IInspectable {
      HRESULT Complete();
    }
  }
}
