Given that we've taken on the resposibility of maintaining this forked package I've added it to the Syncthing organization. We still vendor it like an external package, because it's convenient to keep it as a fork of upstream to easier merge and file pull requests towards them.
119 lines
4.2 KiB
Go
119 lines
4.2 KiB
Go
// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.
|
|
// Use of this source code is governed by the MIT license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// +build windows
|
|
|
|
package notify
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"syscall"
|
|
)
|
|
|
|
// Platform independent event values.
|
|
const (
|
|
osSpecificCreate Event = 1 << (20 + iota)
|
|
osSpecificRemove
|
|
osSpecificWrite
|
|
osSpecificRename
|
|
// recursive is used to distinguish recursive eventsets from non-recursive ones
|
|
recursive
|
|
// omit is used for dispatching internal events; only those events are sent
|
|
// for which both the event and the watchpoint has omit in theirs event sets.
|
|
omit
|
|
// dirmarker TODO(pknap)
|
|
dirmarker
|
|
)
|
|
|
|
// ReadDirectoryChangesW filters
|
|
// On Windows the following events can be passed to Watch. A different set of
|
|
// events (see actions below) are received on the channel passed to Watch.
|
|
// For more information refer to
|
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365465(v=vs.85).aspx
|
|
const (
|
|
FileNotifyChangeFileName = Event(syscall.FILE_NOTIFY_CHANGE_FILE_NAME)
|
|
FileNotifyChangeDirName = Event(syscall.FILE_NOTIFY_CHANGE_DIR_NAME)
|
|
FileNotifyChangeAttributes = Event(syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES)
|
|
FileNotifyChangeSize = Event(syscall.FILE_NOTIFY_CHANGE_SIZE)
|
|
FileNotifyChangeLastWrite = Event(syscall.FILE_NOTIFY_CHANGE_LAST_WRITE)
|
|
FileNotifyChangeLastAccess = Event(syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS)
|
|
FileNotifyChangeCreation = Event(syscall.FILE_NOTIFY_CHANGE_CREATION)
|
|
FileNotifyChangeSecurity = Event(syscallFileNotifyChangeSecurity)
|
|
)
|
|
|
|
const (
|
|
fileNotifyChangeAll = 0x17f // logical sum of all FileNotifyChange* events.
|
|
fileNotifyChangeModified = fileNotifyChangeAll &^ (FileNotifyChangeFileName | FileNotifyChangeDirName)
|
|
)
|
|
|
|
// according to: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365465(v=vs.85).aspx
|
|
// this flag should be declared in: http://golang.org/src/pkg/syscall/ztypes_windows.go
|
|
const syscallFileNotifyChangeSecurity = 0x00000100
|
|
|
|
// ReadDirectoryChangesW actions
|
|
// The following events are returned on the channel passed to Watch, but cannot
|
|
// be passed to Watch itself (see filters above). You can find a table showing
|
|
// the relation between actions and filteres at
|
|
// https://github.com/rjeczalik/notify/issues/10#issuecomment-66179535
|
|
// The msdn documentation on actions is part of
|
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364391(v=vs.85).aspx
|
|
const (
|
|
FileActionAdded = Event(syscall.FILE_ACTION_ADDED) << 12
|
|
FileActionRemoved = Event(syscall.FILE_ACTION_REMOVED) << 12
|
|
FileActionModified = Event(syscall.FILE_ACTION_MODIFIED) << 14
|
|
FileActionRenamedOldName = Event(syscall.FILE_ACTION_RENAMED_OLD_NAME) << 15
|
|
FileActionRenamedNewName = Event(syscall.FILE_ACTION_RENAMED_NEW_NAME) << 16
|
|
)
|
|
|
|
const fileActionAll = 0x7f000 // logical sum of all FileAction* events.
|
|
|
|
var osestr = map[Event]string{
|
|
FileNotifyChangeFileName: "notify.FileNotifyChangeFileName",
|
|
FileNotifyChangeDirName: "notify.FileNotifyChangeDirName",
|
|
FileNotifyChangeAttributes: "notify.FileNotifyChangeAttributes",
|
|
FileNotifyChangeSize: "notify.FileNotifyChangeSize",
|
|
FileNotifyChangeLastWrite: "notify.FileNotifyChangeLastWrite",
|
|
FileNotifyChangeLastAccess: "notify.FileNotifyChangeLastAccess",
|
|
FileNotifyChangeCreation: "notify.FileNotifyChangeCreation",
|
|
FileNotifyChangeSecurity: "notify.FileNotifyChangeSecurity",
|
|
|
|
FileActionAdded: "notify.FileActionAdded",
|
|
FileActionRemoved: "notify.FileActionRemoved",
|
|
FileActionModified: "notify.FileActionModified",
|
|
FileActionRenamedOldName: "notify.FileActionRenamedOldName",
|
|
FileActionRenamedNewName: "notify.FileActionRenamedNewName",
|
|
}
|
|
|
|
const (
|
|
fTypeUnknown uint8 = iota
|
|
fTypeFile
|
|
fTypeDirectory
|
|
)
|
|
|
|
// TODO(ppknap) : doc.
|
|
type event struct {
|
|
pathw []uint16
|
|
name string
|
|
ftype uint8
|
|
action uint32
|
|
filter uint32
|
|
e Event
|
|
}
|
|
|
|
func (e *event) Event() Event { return e.e }
|
|
func (e *event) Path() string { return filepath.Join(syscall.UTF16ToString(e.pathw), e.name) }
|
|
func (e *event) Sys() interface{} { return e.ftype }
|
|
|
|
func (e *event) isDir() (bool, error) {
|
|
if e.ftype != fTypeUnknown {
|
|
return e.ftype == fTypeDirectory, nil
|
|
}
|
|
fi, err := os.Stat(e.Path())
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
return fi.IsDir(), nil
|
|
}
|