"io"
"io/fs"
"os"
- "path"
- "strings"
+ "path/filepath"
)
const (
incompleteFileSuffix = ".incomplete"
- infoForkNameTemplate = "%s.info_%s" // template string for info fork filenames
- rsrcForkNameTemplate = "%s.rsrc_%s" // template string for resource fork filenames
+ infoForkNameTemplate = ".info_%s" // template string for info fork filenames
+ rsrcForkNameTemplate = ".rsrc_%s" // template string for resource fork filenames
)
// fileWrapper encapsulates the data, info, and resource forks of a Hotline file and provides methods to manage the files.
rsrcPath string // path to the file resource fork
infoPath string // path to the file information fork
incompletePath string // path to partially transferred temp file
- saveMetaData bool // if true, enables saving of info and resource forks in sidecar files
infoFork *FlatFileInformationFork
ffo *flattenedFileObject
}
func newFileWrapper(fs FileStore, path string, dataOffset int64) (*fileWrapper, error) {
- pathSegs := strings.Split(path, pathSeparator)
- dir := strings.Join(pathSegs[:len(pathSegs)-1], pathSeparator)
- fName := pathSegs[len(pathSegs)-1]
+ dir := filepath.Dir(path)
+ fName := filepath.Base(path)
f := fileWrapper{
fs: fs,
name: fName,
path: dir,
dataPath: path,
dataOffset: dataOffset,
- rsrcPath: fmt.Sprintf(rsrcForkNameTemplate, dir+"/", fName),
- infoPath: fmt.Sprintf(infoForkNameTemplate, dir+"/", fName),
- incompletePath: dir + "/" + fName + incompleteFileSuffix,
+ rsrcPath: filepath.Join(dir, fmt.Sprintf(rsrcForkNameTemplate, fName)),
+ infoPath: filepath.Join(dir, fmt.Sprintf(infoForkNameTemplate, fName)),
+ incompletePath: filepath.Join(dir, fName+incompleteFileSuffix),
ffo: &flattenedFileObject{},
}
}
func (f *fileWrapper) rsrcForkName() string {
- return fmt.Sprintf(rsrcForkNameTemplate, "", f.name)
+ return fmt.Sprintf(rsrcForkNameTemplate, f.name)
}
func (f *fileWrapper) infoForkName() string {
- return fmt.Sprintf(infoForkNameTemplate, "", f.name)
+ return fmt.Sprintf(infoForkNameTemplate, f.name)
}
-func (f *fileWrapper) creatorCode() []byte {
- if f.ffo.FlatFileInformationFork.CreatorSignature != nil {
- return f.infoFork.CreatorSignature
- }
- return []byte(fileTypeFromFilename(f.name).CreatorCode)
-}
-
-func (f *fileWrapper) typeCode() []byte {
- if f.infoFork != nil {
- return f.infoFork.TypeSignature
- }
- return []byte(fileTypeFromFilename(f.name).TypeCode)
-}
-
-func (f *fileWrapper) rsrcForkWriter() (io.Writer, error) {
+func (f *fileWrapper) rsrcForkWriter() (io.WriteCloser, error) {
file, err := os.OpenFile(f.rsrcPath, os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return nil, err
return file, nil
}
-func (f *fileWrapper) infoForkWriter() (io.Writer, error) {
+func (f *fileWrapper) infoForkWriter() (io.WriteCloser, error) {
file, err := os.OpenFile(f.infoPath, os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return nil, err
return file, nil
}
-func (f *fileWrapper) incFileWriter() (io.Writer, error) {
+func (f *fileWrapper) incFileWriter() (io.WriteCloser, error) {
file, err := os.OpenFile(f.incompletePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
return nil, err
// move a fileWrapper and its associated metadata files to newPath
func (f *fileWrapper) move(newPath string) error {
- err := f.fs.Rename(f.dataPath, path.Join(newPath, f.name))
+ err := f.fs.Rename(f.dataPath, filepath.Join(newPath, f.name))
if err != nil {
// TODO
}
- err = f.fs.Rename(f.incompletePath, path.Join(newPath, f.incompleteDataName()))
+ err = f.fs.Rename(f.incompletePath, filepath.Join(newPath, f.incompleteDataName()))
if err != nil {
// TODO
}
- err = f.fs.Rename(f.rsrcPath, path.Join(newPath, f.rsrcForkName()))
+ err = f.fs.Rename(f.rsrcPath, filepath.Join(newPath, f.rsrcForkName()))
if err != nil {
// TODO
}
- err = f.fs.Rename(f.infoPath, path.Join(newPath, f.infoForkName()))
+ err = f.fs.Rename(f.infoPath, filepath.Join(newPath, f.infoForkName()))
if err != nil {
// TODO
}