// Code generated by winrt-go-gen. DO NOT EDIT.

//go:build windows

//nolint:all
package streams

import (
	"syscall"
	"unsafe"

	"github.com/go-ole/go-ole"
)

const SignatureDataReader string = "rc(Windows.Storage.Streams.DataReader;{e2b50029-b4c1-4314-a4b8-fb813a2f275e})"

type DataReader struct {
	ole.IUnknown
}

func (impl *DataReader) ReadBytes(valueSize uint32) ([]uint8, error) {
	itf := impl.MustQueryInterface(ole.NewGUID(GUIDIDataReader))
	defer itf.Release()
	v := (*IDataReader)(unsafe.Pointer(itf))
	return v.ReadBytes(valueSize)
}

const GUIDiDataReaderStatics string = "11fcbfc8-f93a-471b-b121-f379e349313c"
const SignatureiDataReaderStatics string = "{11fcbfc8-f93a-471b-b121-f379e349313c}"

type iDataReaderStatics struct {
	ole.IInspectable
}

type iDataReaderStaticsVtbl struct {
	ole.IInspectableVtbl

	DataReaderFromBuffer uintptr
}

func (v *iDataReaderStatics) VTable() *iDataReaderStaticsVtbl {
	return (*iDataReaderStaticsVtbl)(unsafe.Pointer(v.RawVTable))
}

func DataReaderFromBuffer(buffer *IBuffer) (*DataReader, error) {
	inspectable, err := ole.RoGetActivationFactory("Windows.Storage.Streams.DataReader", ole.NewGUID(GUIDiDataReaderStatics))
	if err != nil {
		return nil, err
	}
	v := (*iDataReaderStatics)(unsafe.Pointer(inspectable))

	var out *DataReader
	hr, _, _ := syscall.SyscallN(
		v.VTable().DataReaderFromBuffer,
		uintptr(unsafe.Pointer(v)),      // this
		uintptr(unsafe.Pointer(buffer)), // in IBuffer
		uintptr(unsafe.Pointer(&out)),   // out DataReader
	)

	if hr != 0 {
		return nil, ole.NewError(hr)
	}

	return out, nil
}
