ソースを参照

Add file I forgot in previous

Jakob Borg 11 年 前
コミット
756a8a35e3
1 ファイル変更62 行追加0 行削除
  1. 62 0
      internal/model/scanner.go

+ 62 - 0
internal/model/scanner.go

@@ -0,0 +1,62 @@
+// Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file).
+// All rights reserved. Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+
+package model
+
+import (
+	"fmt"
+	"time"
+)
+
+type Scanner struct {
+	folder string
+	intv   time.Duration
+	model  *Model
+	stop   chan struct{}
+}
+
+func (s *Scanner) Serve() {
+	if debug {
+		l.Debugln(s, "starting")
+		defer l.Debugln(s, "exiting")
+	}
+
+	timer := time.NewTimer(time.Millisecond)
+	defer timer.Stop()
+
+	initialScanCompleted := false
+	for {
+		select {
+		case <-s.stop:
+			return
+
+		case <-timer.C:
+			if debug {
+				l.Debugln(s, "rescan")
+			}
+
+			s.model.setState(s.folder, FolderScanning)
+			if err := s.model.ScanFolder(s.folder); err != nil {
+				invalidateFolder(s.model.cfg, s.folder, err)
+				return
+			}
+			s.model.setState(s.folder, FolderIdle)
+
+			if !initialScanCompleted {
+				l.Infoln("Completed initial scan (ro) of folder", s.folder)
+				initialScanCompleted = true
+			}
+
+			timer.Reset(s.intv)
+		}
+	}
+}
+
+func (s *Scanner) Stop() {
+	close(s.stop)
+}
+
+func (s *Scanner) String() string {
+	return fmt.Sprintf("scanner/%s@%p", s.folder, s)
+}