返回 DeepSeek-Reasonix
IStream.go
根目录 / desktop / third_party / go-webview2 / pkg / edge / IStream.go
1 //go:build windows
2
3 package edge
4
5 import (
6 "errors"
7 "io"
8 "syscall"
9 "unsafe"
10
11 "golang.org/x/sys/windows"
12 )
13
14 type _IStreamVtbl struct {
15 _IUnknownVtbl
16 Read ComProc
17 Write ComProc
18 }
19
20 type IStream struct {
21 vtbl *_IStreamVtbl
22 }
23
24 func (i *IStream) AddRef() error {
25 _, _, err := i.vtbl.AddRef.Call(uintptr(unsafe.Pointer(i)))
26 if err != nil && !errors.Is(err, windows.ERROR_SUCCESS) {
27 return err
28 }
29
30 return nil
31 }
32
33 func (i *IStream) Release() error {
34 _, _, err := i.vtbl.Release.Call(uintptr(unsafe.Pointer(i)))
35 if err != nil && !errors.Is(err, windows.ERROR_SUCCESS) {
36 return err
37 }
38
39 return nil
40 }
41
42 func (i *IStream) Read(p []byte) (int, error) {
43 bufLen := len(p)
44 if bufLen == 0 {
45 return 0, nil
46 }
47
48 var n int
49 hr, _, _ := i.vtbl.Read.Call(
50 uintptr(unsafe.Pointer(i)),
51 uintptr(unsafe.Pointer(&p[0])),
52 uintptr(bufLen),
53 uintptr(unsafe.Pointer(&n)),
54 )
55
56 switch windows.Handle(hr) {
57 case windows.S_OK:
58 // The buffer has been completely filled
59 return n, nil
60 case windows.S_FALSE:
61 // The buffer has been filled with less than len data and the stream is EOF
62 return n, io.EOF
63 default:
64 return 0, syscall.Errno(hr)
65 }
66 }
67
67 lines GO