ciderpress/app/FileNameConv.h

140 lines
4.5 KiB
C++

/*
* CiderPress
* Copyright (C) 2007 by faddenSoft, LLC. All Rights Reserved.
* See the file LICENSE for distribution terms.
*/
/*
* File name conversion.
*/
#ifndef APP_FILENAMECONV_H
#define APP_FILENAMECONV_H
#include "GenericArchive.h"
#define kUnknownTypeStr L"???"
/*
* Proposal for an output pathname, based on the contents of a GenericEntry.
*/
class PathProposal {
public:
typedef GenericEntry::RecordKind RecordKind;
enum {
kDefaultStoredFssep = ':',
kLocalFssep = '\\', // PATH_SEP
kAltLocalFssep = '/' // PATH_SEP2
};
PathProposal(void) {
fStoredPathName = L":BOGUS:";
fStoredFssep = '[';
fFileType = 256;
fAuxType = 65536;
fThreadKind = 0;
fLocalPathName = L":HOSED:";
fLocalFssep = ']';
fPreservation = false;
fAddExtension = false;
fJunkPaths = false;
fStripDiskImageSuffix = false;
}
virtual ~PathProposal(void) {}
// init the "extract from archive" side from a GenericEntry struct
void Init(GenericEntry* pEntry) {
fStoredPathName = pEntry->GetPathName();
fStoredFssep = pEntry->GetFssep();
//if (fStoredFssep == '\0') // e.g. embedded DOS 3.3 volume
// fStoredFssep = kDefaultStoredFssep;
fFileType = pEntry->GetFileType();
fAuxType = pEntry->GetAuxType();
//fThreadKind set from SelectionEntry
// reset the "output" fields
fLocalPathName = L":HOSED:";
fLocalFssep = ']';
// I expect these to be as-yet unset; check it
ASSERT(!fPreservation);
ASSERT(!fAddExtension);
ASSERT(!fJunkPaths);
}
// init the "add to archive" side
void Init(const WCHAR* localPathName) {
//ASSERT(basePathName[strlen(basePathName)-1] != kLocalFssep);
//fLocalPathName = localPathName + strlen(basePathName)+1;
fLocalPathName = localPathName;
fLocalFssep = kLocalFssep;
// reset the "output" fields
fStoredPathName = L":HOSED:";
fStoredFssep = '[';
fFileType = 0;
fAuxType = 0;
fThreadKind = GenericEntry::kDataThread;
// I expect these to be as-yet unset; check it
ASSERT(!fPreservation);
ASSERT(!fAddExtension);
ASSERT(!fJunkPaths);
}
// Convert a partial pathname from the archive to a local partial path.
void ArchiveToLocal(void);
// Same thing, other direction.
void LocalToArchive(const AddFilesDialog* pAddOpts);
/*
* Fields for the "archive" side.
*/
// pathname from record or full pathname from disk image
CString fStoredPathName;
// filesystem separator char (or '\0' for things like DOS 3.3)
char fStoredFssep;
// file type, aux type, and what piece of the file this is
unsigned long fFileType;
unsigned long fAuxType;
int fThreadKind; // GenericEntry, e.g. kDataThread
/*
* Fields for the "local" Side.
*/
// relative path of file for local filesystem
CString fLocalPathName;
// filesystem separator char for new path (always '\\' for us)
char fLocalFssep;
/*
* Flags.
*/
// filename/filetype preservation flags
bool fPreservation;
bool fAddExtension;
bool fJunkPaths;
bool fStripDiskImageSuffix;
/*
* Misc utility functions.
*/
static const WCHAR* FileTypeString(unsigned long fileType);
static const WCHAR* FileTypeDescription(long fileType, long auxType);
private:
void Win32NormalizeFileName(const WCHAR* srcp, long srcLen,
char fssep, WCHAR** pDstp, long dstLen);
void NormalizeFileName(const WCHAR* srcp, long srcLen,
char fssep, WCHAR** pDstp, long dstLen);
void NormalizeDirectoryName(const WCHAR* srcp, long srcLen,
char fssep, WCHAR** pDstp, long dstLen);
void AddPreservationString(const WCHAR* pathBuf, WCHAR* extBuf);
void AddTypeExtension(const WCHAR* pathBuf, WCHAR* extBuf);
void ReplaceFssep(WCHAR* str, char oldc, char newc, char newSubst);
void LookupExtension(const WCHAR* ext);
bool ExtractPreservationString(WCHAR* pathName);
void InterpretExtension(const WCHAR* pathName);
void DenormalizePath(WCHAR* pathBuf);
void StripDiskImageSuffix(WCHAR* pathName);
};
#endif /*APP_FILENAMECONV_H*/