gdrivefs.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package gdrivefs
  2. import (
  3. "time"
  4. "dev.hexasoftware.com/hxs/cloudmount/internal/core"
  5. "dev.hexasoftware.com/hxs/cloudmount/internal/fs/basefs"
  6. "dev.hexasoftware.com/hxs/prettylog"
  7. )
  8. var (
  9. log = prettylog.New("gdrivefs")
  10. )
  11. type GDriveFS struct {
  12. *basefs.BaseFS
  13. serviceConfig *Config
  14. nextRefresh time.Time
  15. //client *drive.Service
  16. }
  17. func New(core *core.Core) core.DriverFS {
  18. fs := &GDriveFS{
  19. BaseFS: basefs.New(core),
  20. serviceConfig: &Config{},
  21. nextRefresh: time.Now(),
  22. }
  23. client := fs.initClient() // Init Oauth2 client
  24. //fs.BaseFS.Client = client // This will be removed
  25. fs.BaseFS.Service = &Service{client: client}
  26. return fs
  27. }
  28. // Start will loop to update File entries
  29. func (fs *GDriveFS) Start() {
  30. go func() {
  31. fs.Refresh() // First load
  32. for {
  33. fs.CheckForChanges() // Loop
  34. time.Sleep(fs.Config.RefreshTime)
  35. }
  36. // Change reader loop
  37. }()
  38. }
  39. func (fs *GDriveFS) CheckForChanges() {
  40. Service := fs.Service.(*Service) // Our Service
  41. changes, err := Service.Changes()
  42. if err != nil {
  43. return
  44. }
  45. for _, c := range changes {
  46. entry := fs.Root.FindByID(c.FileId)
  47. if c.Removed {
  48. if entry == nil {
  49. continue
  50. } else {
  51. fs.Root.RemoveEntry(entry)
  52. }
  53. continue
  54. }
  55. if entry != nil {
  56. entry.SetFile(File(c.File), fs.Config.UID, fs.Config.GID)
  57. } else {
  58. //Create new one
  59. fs.Root.FileEntry(File(c.File)) // Creating new one
  60. }
  61. }
  62. }