/**
 * 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 "eventtoken.idl";
import "windows.foundation.idl";

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

    namespace Collections {
      interface IPropertySet;
    }
  }
  namespace Storage {
    interface IStorageItem;
    interface IStorageFolder;
    interface IApplicationData;
    interface IApplicationDataStatics;
    interface IApplicationDataSetVersionHandler;
    interface ApplicationDataContainer;
    // delegate  ApplicationDataSetVersionHandler;
    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, IApplicationDataSetVersionHandler* 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(Windows.Foundation.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 IApplicationDataSetVersionHandler : IUnknown {
      HRESULT Invoke(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();
    }
  }
}
