2018-06-08 16:27:33 +00:00
|
|
|
package main
|
|
|
|
|
2018-06-14 00:30:18 +00:00
|
|
|
import (
|
2018-06-14 14:42:54 +00:00
|
|
|
"path"
|
2018-06-14 00:30:18 +00:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/fsnotify/fsnotify"
|
|
|
|
)
|
|
|
|
|
2018-06-08 16:27:33 +00:00
|
|
|
var Firefox = BrowserPaths{
|
|
|
|
"places.sqlite",
|
|
|
|
"/home/spike/.mozilla/firefox/p1rrgord.default/",
|
|
|
|
}
|
|
|
|
|
|
|
|
type FFBrowser struct {
|
|
|
|
BaseBrowser //embedding
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewFFBrowser() IBrowser {
|
|
|
|
browser := &FFBrowser{}
|
|
|
|
browser.name = "firefox"
|
|
|
|
browser.bType = TFirefox
|
|
|
|
browser.baseDir = Firefox.BookmarkDir
|
|
|
|
browser.bkFile = Firefox.BookmarkFile
|
|
|
|
browser.Stats = &ParserStats{}
|
|
|
|
browser.NodeTree = &Node{Name: "root", Parent: nil}
|
2018-06-14 00:30:18 +00:00
|
|
|
browser.eventsChan = make(chan fsnotify.Event, EventsChanLen)
|
2018-06-08 16:27:33 +00:00
|
|
|
|
|
|
|
// Across jobs buffer
|
|
|
|
browser.InitBuffer()
|
|
|
|
|
|
|
|
browser.SetupWatcher()
|
|
|
|
|
2018-06-14 00:30:18 +00:00
|
|
|
// Run debouncer to avoid duplicate running of jobs
|
|
|
|
// when a batch of events is received
|
|
|
|
go debouncer(3000*time.Millisecond, browser.eventsChan, browser)
|
|
|
|
|
2018-06-08 16:27:33 +00:00
|
|
|
return browser
|
|
|
|
}
|
|
|
|
|
|
|
|
func (bw *FFBrowser) Watch() bool {
|
|
|
|
|
|
|
|
if !bw.isWatching {
|
|
|
|
go WatcherThread(bw)
|
|
|
|
bw.isWatching = true
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
func (bw *FFBrowser) Load() {
|
|
|
|
bw.BaseBrowser.Load()
|
|
|
|
bw.Run()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (bw *FFBrowser) Run() {
|
|
|
|
|
|
|
|
log.Infof("Parsing Firefox bookmarks\n")
|
|
|
|
|
2018-06-14 14:42:54 +00:00
|
|
|
// Rebuild node tree
|
|
|
|
bw.NodeTree = &Node{Name: "root", Parent: nil}
|
|
|
|
|
|
|
|
// Open firefox sqlite db
|
|
|
|
bookmarkPath := path.Join(bw.baseDir, bw.bkFile)
|
|
|
|
placesDB := DB{}.New("Places", bookmarkPath)
|
|
|
|
placesDB.InitRO()
|
|
|
|
defer placesDB.Close()
|
|
|
|
|
|
|
|
// Start parsing from the root node (id = 1, type = 2) and down the tree
|
|
|
|
|
|
|
|
// Needed to store the parent of each child node
|
|
|
|
var parentNodes []*Node
|
|
|
|
|
|
|
|
root := getRoot(placesDB)
|
|
|
|
recursiveParse(root)
|
|
|
|
|
2018-06-08 16:27:33 +00:00
|
|
|
}
|