model_wapper.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package smb
  2. import (
  3. "io"
  4. "io/fs"
  5. "os"
  6. "path/filepath"
  7. "time"
  8. "golang.org/x/net/webdav"
  9. )
  10. type fileInfoX struct {
  11. fs.FileInfo
  12. name string
  13. size int64
  14. }
  15. func (f *fileInfoX) Name() string {
  16. return f.name
  17. }
  18. func (f *fileInfoX) Size() int64 {
  19. if f.size == 0 {
  20. return f.FileInfo.Size()
  21. }
  22. return f.size
  23. }
  24. var _ webdav.File = (*webdavFile)(nil)
  25. type webdavFile struct {
  26. // webdav.File
  27. filename string
  28. filenameAttr string
  29. webdavType XATTR_Key
  30. }
  31. func (w *webdavFile) XAttrDelete() (err error) {
  32. // file := w.File.(*os.File)
  33. // filename := file.Name()
  34. return XAttrDel(w.filename, string(w.webdavType))
  35. }
  36. func (w *webdavFile) Write(p []byte) (n int, err error) {
  37. // file := w.File.(*os.File)
  38. // filename := file.Name()
  39. err = XAttrSet(w.filename, string(w.webdavType), p)
  40. if err != nil {
  41. return 0, err
  42. }
  43. return n, nil
  44. }
  45. func (w *webdavFile) Close() error {
  46. return nil
  47. }
  48. func (w *webdavFile) Read(p []byte) (n int, err error) {
  49. if true {
  50. // file := w.File.(*os.File)
  51. // filename := file.Name()
  52. v, err := XAttrGet(w.filename, string(w.webdavType))
  53. if err != nil {
  54. return 0, err
  55. }
  56. n := copy(p, v)
  57. return n, nil
  58. }
  59. // switch w.webdavType {
  60. // case XATTR_PS_EA_NAME,
  61. // XATTR_KMD_ITEM_USER_TAGS_EA_NAME,
  62. // XATTR_FINDER_INFO_EA_NAME:
  63. // file := w.File.(*os.File)
  64. // filename := file.Name()
  65. // v, err := XAttrGet(filename, string(w.webdavType))
  66. // if err != nil {
  67. // return 0, err
  68. // }
  69. // n := copy(p, v)
  70. // return n, nil
  71. // default:
  72. // }
  73. return -1, io.EOF
  74. }
  75. func (w *webdavFile) Seek(offset int64, whence int) (int64, error) {
  76. return 0, nil
  77. }
  78. func (w *webdavFile) Readdir(count int) ([]fs.FileInfo, error) {
  79. return nil, nil
  80. }
  81. func (w *webdavFile) Stat() (fs.FileInfo, error) {
  82. return &fileInfoX{FileInfo: &Stat{name: filepath.Base(w.filenameAttr)}, size: int64(16)}, nil
  83. // fi, err := w.File.Stat()
  84. // if err != nil {
  85. // return nil, err
  86. // }
  87. // data := make([]byte, 1024)
  88. // size, err := w.Read(data)
  89. // if err != nil {
  90. // return nil, err
  91. // }
  92. // return &fileInfoX{FileInfo: fi, size: int64(size)}, nil
  93. }
  94. type Stat struct {
  95. // osStat os.FileInfo
  96. name string
  97. }
  98. func (st Stat) Name() string { return st.name }
  99. func (st Stat) Size() int64 { return 16 }
  100. func (st Stat) ModTime() time.Time { return time.Now() }
  101. func (st Stat) Mode() os.FileMode { return 0 }
  102. func (st Stat) IsDir() bool { return false }
  103. func (st Stat) Sys() any { return nil }