ciderpress/app/DiskFSTree.h
Andy McFadden d23a3b1ad8 Replace place-holder strings
The NufxLib and diskimg libraries want narrow strings for certain
things, notably for the "storage name", i.e. how the name will appear
on the disk image or in the file archive.  We need to convert from
Windows UTF-16 to an Apple II filesystem-specific 8-bit character
representation.

We used to just pass narrow strings all the way through, so we didn't
need any intermediate storage to hold the conversion.  Now we do.  In
some cases there's nowhere good to put it.  The initial UTF-16
conversion changes just dropped in some place-holder strings.

This corrects the behavior, though in a couple of cases we're adding
kluges on top of code that was already badly bent from its original
intent (as initially conceived, CiderPress wasn't going to handle disk
images, just ShrinkIt archives).  It's not pretty, but it should work
for now.
2014-12-04 17:05:48 -08:00

127 lines
3.8 KiB
C++

/*
* CiderPress
* Copyright (C) 2007 by faddenSoft, LLC. All Rights Reserved.
* See the file LICENSE for distribution terms.
*/
/*
* Fill out a CTreeCtrl with the results of a tree search through a DiskFS and
* its sub-volumes.
*/
#ifndef APP_DISKFSTREE_H
#define APP_DISKFSTREE_H
#include "resource.h"
#include "../diskimg/DiskImg.h"
/*
* Utility class for extracting a directory hierarchy from a DiskFS and
* adding it to a CTreeCtrl.
*
* The storage for some of the strings provided to the tree control is
* managed by this class, so delete this object after the CTreeCtrl is
* deleted. (Generally, this should be paired with a CTreeCtrl in a dialog
* object.)
*/
class DiskFSTree {
public:
DiskFSTree(void) {
fIncludeSubdirs = false;
fExpandDepth = 0;
fpDiskFS = NULL;
fpTargetData = NULL;
LoadTreeImages();
}
virtual ~DiskFSTree(void) { FreeAllTargetData(); }
/*
* Create the contents of the tree control.
*/
bool BuildTree(DiskImgLib::DiskFS* pDiskFS, CTreeCtrl* pTree);
/* if set, includes folders as well as disks */
bool fIncludeSubdirs;
/* start with the tree expanded to this depth (0=none, -1=all) */
int fExpandDepth;
typedef enum {
kTargetUnknown = 0, kTargetDiskFS, kTargetSubdir
} TargetKind;
struct TargetData {
TargetData()
: kind(kTargetUnknown), selectable(false), pDiskFS(NULL),
pFile(NULL), pNext(NULL)
{}
TargetKind kind;
bool selectable;
DiskImgLib::DiskFS* pDiskFS;
DiskImgLib::A2File* pFile;
// easier to keep a list than to chase through the tree
struct TargetData* pNext;
};
private:
/*
* Load the specified DiskFS into the tree, recursively adding any
* sub-volumes. Pass in an initial depth of 1.
*
* Returns true on success.
*/
bool AddDiskFS(CTreeCtrl* pTree, HTREEITEM root,
DiskImgLib::DiskFS* pDiskFS, int depth);
/*
* Add the subdir and all of the subdirectories of the current subdir.
*
* The files are held in a linear list in the DiskFS, so we have to
* reconstruct the hierarchy from the path names. Pass in NULL for the
* root volume.
*
* Returns a pointer to the next A2File in the list (i.e. the first one
* that we couldn't digest). This assumes that the contents of a
* subdirectory are grouped together in the linear list, so that we can
* immediately bail when the first misfit is encountered.
*/
DiskImgLib::A2File* AddSubdir(CTreeCtrl* pTree, HTREEITEM parent,
DiskImgLib::DiskFS* pDiskFS, DiskImgLib::A2File* pFile,
int depth);
/*
* Allocate a new TargetData struct, and add it to our list.
*/
TargetData* AllocTargetData(void);
/*
* Free up the TargetData structures we created.
*/
void FreeAllTargetData(void);
/*
* Load bitmaps used in the tree control.
*/
void LoadTreeImages(void) {
if (!fTreeImageList.Create(IDB_TREE_PICS, 16, 1, CLR_DEFAULT)) {
LOGW("GLITCH: list image create failed");
}
fTreeImageList.SetBkColor(::GetSysColor(COLOR_WINDOW));
}
enum { // defs for IDB_TREE_PICS
kTreeImageFolderClosed = 0,
kTreeImageFolderOpen = 1,
kTreeImageHardDriveRW = 2,
kTreeImageHardDriveRO = 3,
};
CImageList fTreeImageList;
DiskImgLib::DiskFS* fpDiskFS;
TargetData* fpTargetData;
// Storage for wide strings that were converted from DiskFS narrow strings.
CStringArray fStringHolder;
};
#endif /*APP_DISKFSTREE_H*/