X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/blobdiff_plain/00d1ef67636df59460bd4e060f6da4b0c9bcb24c..7e2e07da8cc7985e773e619410801c6dd84afe8b:/hotline/file_path.go?ds=sidebyside diff --git a/hotline/file_path.go b/hotline/file_path.go index d6c05bc..d5ddd23 100644 --- a/hotline/file_path.go +++ b/hotline/file_path.go @@ -5,6 +5,7 @@ import ( "encoding/binary" "errors" "path" + "strings" ) const pathSeparator = "/" // File path separator TODO: make configurable to support Windows @@ -31,7 +32,11 @@ type FilePath struct { } const minFilePathLen = 2 + func (fp *FilePath) UnmarshalBinary(b []byte) error { + if b == nil { + return nil + } if len(b) < minFilePathLen { return errors.New("insufficient bytes") } @@ -50,6 +55,22 @@ func (fp *FilePath) UnmarshalBinary(b []byte) error { return nil } +func (fp *FilePath) IsDropbox() bool { + if fp.Len() == 0 { + return false + } + + return strings.Contains(strings.ToLower(string(fp.Items[fp.Len()-1].Name)), "drop box") +} + +func (fp *FilePath) IsUploadDir() bool { + if fp.Len() == 0 { + return false + } + + return strings.Contains(strings.ToLower(string(fp.Items[fp.Len()-1].Name)), "uploads") +} + func (fp *FilePath) Len() uint16 { return binary.BigEndian.Uint16(fp.ItemCount[:]) } @@ -71,3 +92,21 @@ func ReadFilePath(filePathFieldData []byte) string { } return fp.String() } + +func readPath(fileRoot string, filePath, fileName []byte) (fullPath string, err error) { + var fp FilePath + if filePath != nil { + if err = fp.UnmarshalBinary(filePath); err != nil { + return "", err + } + } + + fullPath = path.Join( + "/", + fileRoot, + fp.String(), + path.Join("/", string(fileName)), + ) + + return fullPath, nil +}