declare module "windows.devices.enumeration" {
  export enum DeviceClass {
    all,
    audioCapture,
    audioRender,
    portableStorageDevice,
    videoCapture,
    imageScanner,
    location,
  }

  export enum DeviceWatcherStatus {
    created,
    started,
    enumerationCompleted,
    stopping,
    stopped,
    aborted,
  }

  export enum Panel {
    unknown,
    front,
    back,
    top,
    bottom,
    left,
    right,
  }

  export enum DeviceAccessStatus {
    unspecified,
    allowed,
    deniedByUser,
    deniedBySystem,
  }

  export class DeviceThumbnail {
    size: Number;
    canRead: Boolean;
    canWrite: Boolean;
    position: Number;
    contentType: String;
    constructor();

    readAsync(buffer: Object, count: Number, options: Number, callback: (error: Error, result: Object) => void): void ;

    writeAsync(buffer: Object, callback: (error: Error, result: Number) => void): void ;

    flushAsync(callback: (error: Error, result: Boolean) => void): void ;

    getInputStreamAt(position: Number): Object;

    getOutputStreamAt(position: Number): Object;

    seek(position: Number): void;

    cloneStream(): Object;

    close(): void;
  }

  export class EnclosureLocation {
    inDock: Boolean;
    inLid: Boolean;
    panel: Panel;
    constructor();

  }

  export class DeviceInformationUpdate {
    id: String;
    properties: Object;
    constructor();

  }

  export class DeviceInformationCollection {
    constructor();

    getAt(index: Number): DeviceInformation;

    indexOf(value: DeviceInformation, index: Number): Boolean;

    getMany();
    first(): Object;

  }

  export class DeviceWatcher {
    status: DeviceWatcherStatus;
    constructor();

    start(): void;

    stop(): void;

    addListener(type: "Added", listener: (ev: Event) => void): void ;
    removeListener(type: "Added", listener: (ev: Event) => void): void ;
    on(type: "Added", listener: (ev: Event) => void): void ;
    off(type: "Added", listener: (ev: Event) => void): void ;
    
    addListener(type: "EnumerationCompleted", listener: (ev: Event) => void): void ;
    removeListener(type: "EnumerationCompleted", listener: (ev: Event) => void): void ;
    on(type: "EnumerationCompleted", listener: (ev: Event) => void): void ;
    off(type: "EnumerationCompleted", listener: (ev: Event) => void): void ;
    
    addListener(type: "Removed", listener: (ev: Event) => void): void ;
    removeListener(type: "Removed", listener: (ev: Event) => void): void ;
    on(type: "Removed", listener: (ev: Event) => void): void ;
    off(type: "Removed", listener: (ev: Event) => void): void ;
    
    addListener(type: "Stopped", listener: (ev: Event) => void): void ;
    removeListener(type: "Stopped", listener: (ev: Event) => void): void ;
    on(type: "Stopped", listener: (ev: Event) => void): void ;
    off(type: "Stopped", listener: (ev: Event) => void): void ;
    
    addListener(type: "Updated", listener: (ev: Event) => void): void ;
    removeListener(type: "Updated", listener: (ev: Event) => void): void ;
    on(type: "Updated", listener: (ev: Event) => void): void ;
    off(type: "Updated", listener: (ev: Event) => void): void ;
    
    addListener(type: string, listener: (ev: Event) => void): void ;
    removeListener(type: string, listener: (ev: Event) => void): void ;
    on(type: string, listener: (ev: Event) => void): void ;
    off(type: string, listener: (ev: Event) => void): void ;
    

  }

  export class DeviceInformation {
    enclosureLocation: EnclosureLocation;
    id: String;
    isDefault: Boolean;
    isEnabled: Boolean;
    name: String;
    properties: Object;
    constructor();

    static createFromIdAsync(deviceId: String, callback: (error: Error, result: DeviceInformation) => void): void ;
    static createFromIdAsync(deviceId: String, additionalProperties: Object, callback: (error: Error, result: DeviceInformation) => void): void ;


    static findAllAsync(callback: (error: Error, result: DeviceInformationCollection) => void): void ;
    static findAllAsync(deviceClass: DeviceClass, callback: (error: Error, result: DeviceInformationCollection) => void): void ;
    static findAllAsync(aqsFilter: String, callback: (error: Error, result: DeviceInformationCollection) => void): void ;
    static findAllAsync(aqsFilter: String, additionalProperties: Object, callback: (error: Error, result: DeviceInformationCollection) => void): void ;


    static createWatcher(): DeviceWatcher;
    static createWatcher(deviceClass: DeviceClass): DeviceWatcher;
    static createWatcher(aqsFilter: String): DeviceWatcher;
    static createWatcher(aqsFilter: String, additionalProperties: Object): DeviceWatcher;


    getThumbnailAsync(callback: (error: Error, result: DeviceThumbnail) => void): void ;

    getGlyphThumbnailAsync(callback: (error: Error, result: DeviceThumbnail) => void): void ;

    update(updateInfo: DeviceInformationUpdate): void;

  }

  export class DeviceAccessChangedEventArgs {
    status: DeviceAccessStatus;
    constructor();

  }

  export class DeviceAccessInformation {
    currentStatus: DeviceAccessStatus;
    constructor();

    static createFromId(deviceId: String): DeviceAccessInformation;


    static createFromDeviceClassId(deviceClassId: String): DeviceAccessInformation;


    static createFromDeviceClass(deviceClass: DeviceClass): DeviceAccessInformation;


    addListener(type: "AccessChanged", listener: (ev: Event) => void): void ;
    removeListener(type: "AccessChanged", listener: (ev: Event) => void): void ;
    on(type: "AccessChanged", listener: (ev: Event) => void): void ;
    off(type: "AccessChanged", listener: (ev: Event) => void): void ;
    
    addListener(type: string, listener: (ev: Event) => void): void ;
    removeListener(type: string, listener: (ev: Event) => void): void ;
    on(type: string, listener: (ev: Event) => void): void ;
    off(type: string, listener: (ev: Event) => void): void ;
    

  }

}



