| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 | 
							- // Copyright (C) 2014 The Protocol Authors.
 
- //go:generate go run ../../script/protofmt.go bep.proto
 
- //go:generate protoc --proto_path=../../../../../:../../../../gogo/protobuf/protobuf:. --gogofast_out=. bep.proto
 
- package protocol
 
- import (
 
- 	"bytes"
 
- 	"encoding/binary"
 
- 	"errors"
 
- 	"fmt"
 
- 	"time"
 
- 	"github.com/minio/sha256-simd"
 
- 	"github.com/syncthing/syncthing/lib/rand"
 
- )
 
- const (
 
- 	SyntheticDirectorySize = 128
 
- )
 
- var (
 
- 	sha256OfEmptyBlock = sha256.Sum256(make([]byte, BlockSize))
 
- 	HelloMessageMagic  = uint32(0x2EA7D90B)
 
- )
 
- func (m Hello) Magic() uint32 {
 
- 	return HelloMessageMagic
 
- }
 
- func (f FileInfo) String() string {
 
- 	return fmt.Sprintf("File{Name:%q, Type:%v, Sequence:%d, Permissions:0%o, ModTime:%v, Version:%v, Length:%d, Deleted:%v, Invalid:%v, NoPermissions:%v, Blocks:%v}",
 
- 		f.Name, f.Type, f.Sequence, f.Permissions, f.ModTime(), f.Version, f.Size, f.Deleted, f.Invalid, f.NoPermissions, f.Blocks)
 
- }
 
- func (f FileInfo) IsDeleted() bool {
 
- 	return f.Deleted
 
- }
 
- func (f FileInfo) IsInvalid() bool {
 
- 	return f.Invalid
 
- }
 
- func (f FileInfo) IsDirectory() bool {
 
- 	return f.Type == FileInfoTypeDirectory
 
- }
 
- func (f FileInfo) IsSymlink() bool {
 
- 	switch f.Type {
 
- 	case FileInfoTypeSymlinkDirectory, FileInfoTypeSymlinkFile, FileInfoTypeSymlinkUnknown:
 
- 		return true
 
- 	default:
 
- 		return false
 
- 	}
 
- }
 
- func (f FileInfo) HasPermissionBits() bool {
 
- 	return !f.NoPermissions
 
- }
 
- func (f FileInfo) FileSize() int64 {
 
- 	if f.Deleted {
 
- 		return 0
 
- 	}
 
- 	if f.IsDirectory() {
 
- 		return SyntheticDirectorySize
 
- 	}
 
- 	return f.Size
 
- }
 
- func (f FileInfo) FileName() string {
 
- 	return f.Name
 
- }
 
- func (f FileInfo) ModTime() time.Time {
 
- 	return time.Unix(f.ModifiedS, int64(f.ModifiedNs))
 
- }
 
- // WinsConflict returns true if "f" is the one to choose when it is in
 
- // conflict with "other".
 
- func (f FileInfo) WinsConflict(other FileInfo) bool {
 
- 	// If a modification is in conflict with a delete, we pick the
 
- 	// modification.
 
- 	if !f.IsDeleted() && other.IsDeleted() {
 
- 		return true
 
- 	}
 
- 	if f.IsDeleted() && !other.IsDeleted() {
 
- 		return false
 
- 	}
 
- 	// The one with the newer modification time wins.
 
- 	if f.ModTime().After(other.ModTime()) {
 
- 		return true
 
- 	}
 
- 	if f.ModTime().Before(other.ModTime()) {
 
- 		return false
 
- 	}
 
- 	// The modification times were equal. Use the device ID in the version
 
- 	// vector as tie breaker.
 
- 	return f.Version.Compare(other.Version) == ConcurrentGreater
 
- }
 
- func (b BlockInfo) String() string {
 
- 	return fmt.Sprintf("Block{%d/%d/%x}", b.Offset, b.Size, b.Hash)
 
- }
 
- // IsEmpty returns true if the block is a full block of zeroes.
 
- func (b BlockInfo) IsEmpty() bool {
 
- 	return b.Size == BlockSize && bytes.Equal(b.Hash, sha256OfEmptyBlock[:])
 
- }
 
- type IndexID uint64
 
- func (i IndexID) String() string {
 
- 	return fmt.Sprintf("0x%16X", uint64(i))
 
- }
 
- func (i IndexID) Marshal() ([]byte, error) {
 
- 	bs := make([]byte, 8)
 
- 	binary.BigEndian.PutUint64(bs, uint64(i))
 
- 	return bs, nil
 
- }
 
- func (i *IndexID) Unmarshal(bs []byte) error {
 
- 	if len(bs) != 8 {
 
- 		return errors.New("incorrect IndexID length")
 
- 	}
 
- 	*i = IndexID(binary.BigEndian.Uint64(bs))
 
- 	return nil
 
- }
 
- func NewIndexID() IndexID {
 
- 	return IndexID(rand.Int64())
 
- }
 
 
  |