mirror of
https://github.com/marketideas/qasm.git
synced 2024-12-29 12:33:03 +00:00
198 lines
6.3 KiB
C
198 lines
6.3 KiB
C
|
/*
|
||
|
* CiderPress
|
||
|
* Copyright (C) 2007 by faddenSoft, LLC. All Rights Reserved.
|
||
|
* See the file LICENSE for distribution terms.
|
||
|
*/
|
||
|
/*
|
||
|
* File name conversion.
|
||
|
* TODO: rename to PathProposal.h
|
||
|
*/
|
||
|
#ifndef APP_FILENAMECONV_H
|
||
|
#define APP_FILENAMECONV_H
|
||
|
|
||
|
#include "GenericArchive.h"
|
||
|
|
||
|
|
||
|
/*
|
||
|
* 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);
|
||
|
|
||
|
// init the "add to archive" side
|
||
|
void Init(const WCHAR* localPathName);
|
||
|
|
||
|
/*
|
||
|
* Convert a pathname pulled out of an archive to something suitable for the
|
||
|
* local filesystem.
|
||
|
*
|
||
|
* The new pathname may be shorter (because characters were removed) or
|
||
|
* longer (if we add a "#XXYYYYZ" extension or replace chars with '%' codes).
|
||
|
*/
|
||
|
void ArchiveToLocal(void);
|
||
|
|
||
|
/*
|
||
|
* Convert a local path into something suitable for storage in an archive.
|
||
|
* Type preservation strings are interpreted and stripped as appropriate.
|
||
|
*
|
||
|
* This does *not* do filesystem-specific normalization here. (It could, but
|
||
|
* it's better to leave that for later so we can do uniqueification.)
|
||
|
*
|
||
|
* In the current implementation, fStoredPathName will always get smaller,
|
||
|
* but it would be unwise to rely on that.
|
||
|
*/
|
||
|
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
|
||
|
uint32_t fFileType;
|
||
|
uint32_t 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;
|
||
|
|
||
|
/*
|
||
|
* Return a pointer to the three-letter representation of the file type name.
|
||
|
*/
|
||
|
static const WCHAR* FileTypeString(uint32_t fileType);
|
||
|
|
||
|
/*
|
||
|
* Find an entry in the type description table that matches both file type and
|
||
|
* aux type. If no match is found, NULL is returned.
|
||
|
*/
|
||
|
static const WCHAR* FileTypeDescription(long fileType, long auxType);
|
||
|
|
||
|
private:
|
||
|
/*
|
||
|
* Filename normalization for Win32 filesystems. You can't use [ \/:*?"<>| ]
|
||
|
* or control characters, and we're currently avoiding high-ASCII stuff.
|
||
|
*/
|
||
|
void Win32NormalizeFileName(const WCHAR* srcp, long srcLen,
|
||
|
char fssep, WCHAR** pDstp, long dstLen);
|
||
|
|
||
|
/*
|
||
|
* Normalize a file name to local filesystem conventions. The input
|
||
|
* is quite possibly *NOT* null-terminated, since it may represent a
|
||
|
* substring of a full pathname. Use "srcLen".
|
||
|
*
|
||
|
* The output filename is copied to *pDstp, which is advanced forward.
|
||
|
*
|
||
|
* The output buffer must be able to hold 3x the original string length.
|
||
|
*/
|
||
|
void NormalizeFileName(const WCHAR* srcp, long srcLen,
|
||
|
char fssep, WCHAR** pDstp, long dstLen);
|
||
|
|
||
|
/*
|
||
|
* Normalize a directory name to local filesystem conventions.
|
||
|
*/
|
||
|
void NormalizeDirectoryName(const WCHAR* srcp, long srcLen,
|
||
|
char fssep, WCHAR** pDstp, long dstLen);
|
||
|
|
||
|
/*
|
||
|
* Add a preservation string.
|
||
|
*
|
||
|
* "pathBuf" is assumed to have enough space to hold the current path
|
||
|
* plus kMaxPathGrowth more. It will be modified in place.
|
||
|
*/
|
||
|
void AddPreservationString(const WCHAR* pathBuf, WCHAR* extBuf);
|
||
|
|
||
|
/*
|
||
|
* Add a ".type" extension to the filename.
|
||
|
*
|
||
|
* We either need to retain the existing extension (possibly obscured by file
|
||
|
* type preservation) or append an extension based on the ProDOS file type.
|
||
|
*/
|
||
|
void AddTypeExtension(const WCHAR* pathBuf, WCHAR* extBuf);
|
||
|
|
||
|
/*
|
||
|
* Replace "oldc" with "newc". If we find an instance of "newc" already
|
||
|
* in the string, replace it with "newSubst".
|
||
|
*/
|
||
|
void ReplaceFssep(WCHAR* str, char oldc, char newc, char newSubst);
|
||
|
|
||
|
/*
|
||
|
* Try to figure out what file type is associated with a filename extension.
|
||
|
*
|
||
|
* This checks the standard list of ProDOS types (which should catch things
|
||
|
* like "TXT" and "BIN") and the separate list of recognized extensions.
|
||
|
*/
|
||
|
void LookupExtension(const WCHAR* ext);
|
||
|
|
||
|
/*
|
||
|
* Try to associate some meaning with the file extension.
|
||
|
*/
|
||
|
void InterpretExtension(const WCHAR* pathName);
|
||
|
|
||
|
/*
|
||
|
* Check to see if there's a preservation string on the filename. If so,
|
||
|
* set the filetype and auxtype information, and trim the preservation
|
||
|
* string off.
|
||
|
*/
|
||
|
bool ExtractPreservationString(WCHAR* pathName);
|
||
|
|
||
|
/*
|
||
|
* Remove NuLib2's normalization magic (e.g. "%2f" for '/').
|
||
|
*
|
||
|
* This always results in the filename staying the same length or getting
|
||
|
* smaller, so we can do it in place in the buffer.
|
||
|
*/
|
||
|
void DenormalizePath(WCHAR* pathBuf);
|
||
|
|
||
|
/*
|
||
|
* Remove a disk image suffix.
|
||
|
*
|
||
|
* Useful when adding disk images directly from a .SDK or .2MG file. We
|
||
|
* don't want them to retain their original suffix.
|
||
|
*/
|
||
|
void StripDiskImageSuffix(WCHAR* pathName);
|
||
|
};
|
||
|
|
||
|
#endif /*APP_FILENAMECONV_H*/
|