123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- package bokofs
- /*
- vObjects
- The vObjects accept and forward the request of the WebDAV server to the
- underlying workers that might be serving a file system or other
- system management functions
- vObjects and its definations shall only be used on the root layer of each
- of the bokoFS instance.
- */
- import (
- "fmt"
- "os"
- "time"
- "golang.org/x/net/webdav"
- )
- type vObjectProperties struct {
- name string
- size int64
- mode os.FileMode
- modTime time.Time
- isDir bool
- }
- type vObjectFileInfo struct {
- properties *vObjectProperties
- sys interface{}
- }
- type vObject struct {
- properties *vObjectProperties
- parent *RootRouter
- }
- // newVirtualObject creates a new virtual object
- func (p *RootRouter) newVirtualObject(properties *vObjectProperties) *vObject {
- return &vObject{
- properties: properties,
- parent: p,
- }
- }
- func (r *vObject) GetFileInfo() os.FileInfo {
- return &vObjectFileInfo{
- properties: r.properties,
- sys: nil,
- }
- }
- /* File Info Interface */
- func (r *vObjectFileInfo) IsDir() bool {
- return r.properties.isDir
- }
- func (r *vObjectFileInfo) ModTime() time.Time {
- return r.properties.modTime
- }
- func (r *vObjectFileInfo) Mode() os.FileMode {
- return r.properties.mode
- }
- func (r *vObjectFileInfo) Name() string {
- return r.properties.name
- }
- func (r *vObjectFileInfo) Size() int64 {
- return r.properties.size
- }
- func (r *vObjectFileInfo) Sys() interface{} {
- return r.sys
- }
- /* File Interface */
- func (r *vObject) Close() error {
- // Implement the Close method
- fmt.Println("Close called")
- return nil
- }
- func (r *vObject) Read(p []byte) (n int, err error) {
- // Implement the Read method
- fmt.Println("Read called")
- return 0, nil
- }
- func (r *vObject) Readdir(count int) ([]os.FileInfo, error) {
- // Generate a emulated folder structure from worker registered paths
- fmt.Println("Readdir called")
- rootFolders, err := r.parent.parent.GetRegisteredRootFolders()
- if err != nil {
- return nil, err
- }
- // Generate the folder structure
- var folderList []os.FileInfo
- for _, folder := range rootFolders {
- thisVirtualObject := r.parent.newVirtualObject(&vObjectProperties{
- name: folder,
- size: 0,
- mode: os.ModeDir,
- modTime: time.Now(),
- isDir: true,
- })
- folderList = append(folderList, thisVirtualObject.GetFileInfo())
- }
- return folderList, nil
- }
- func (r *vObject) Seek(offset int64, whence int) (int64, error) {
- // Implement the Seek method
- fmt.Println("Seek called")
- return 0, nil
- }
- func (r *vObject) Write(p []byte) (n int, err error) {
- // Implement the Write method
- fmt.Println("Write called")
- return 0, nil
- }
- func (r *vObject) Stat() (os.FileInfo, error) {
- // Implement the Stat method
- fmt.Println("Stat called")
- return r.GetFileInfo(), nil
- }
- // Ensure vObject implements the File interface
- var _ webdav.File = (*vObject)(nil)
|