/*+-------------------------------------------------------------------------+
  | Copyright 1993-1994 (C) Microsoft Corporation - All rights reserved.    |
  +-------------------------------------------------------------------------+*/

#ifndef _HFILESEL_
#define _HFILESEL_

#ifdef __cplusplus
extern "C"{
#endif

// Forward references as the structures are recursively linked
struct _DIR_BUFFER;
struct _DIR_LIST;
struct _FILE_BUFFER;
struct _FILE_LIST;
struct SHARE_BUFFER;

/*+-------------------------------------------------------------------------+
  |
  |  The dir/file lists contain all the information used when working with
  |  a file tree.  The naming convention is that a buffer (I.E.
  |  DIR_BUFFER) contains the information for one entry (one directory
  |  or one file).  A List is an array of buffers of the appropriate
  |  type (DIR_LIST contains an array of DIR_BUFFERS).
  |
  |  The whole mess starts with a root DIR_BUFFER, the DIR_BUFFER then 
  |  points to a cascading chain of DIR and FILE LISTS.
  |
  |  Almost all of the structures are a doubly linked list with a pointer back
  |  to their parent.  A buffer parent pointer, points to it's parent list
  |  structure.  The List structure then has a back pointer to the parent
  |  DIR_BUFFER.  This facilitates recursing up and down the chain when
  |  an item is checked/un-checked and it's parent and/or children are affected.
  |  
  |  +--------+     +----------+
  |  |  Dir   |<--->| Dir List |
  |  | Buffer |<-+  +----------+
  |  +--------+  |  |   Dir    |-->Dir List...
  |              |  |  Buffer  |-->File List...
  |              |  + - - - - -+
  |              |  |          |
  |              |  + - - - - -+
  |              |  |          |
  |              |
  |              |
  |              |  +-----------+
  |              +->| File List |
  |                 +-----------+
  |                 |   File    |
  |                 |  Buffer   |
  |                 + - - - - - +
  |                 |           |
  |                 + - - - - - +
  |                 |           |
  |
  +-------------------------------------------------------------------------+*/
#define CONVERT_NONE 0
#define CONVERT_ALL 1
#define CONVERT_PARTIAL 2
  
// A dir buffer holds a directory or sub-directory entry, with pointers to the
// files and other dirs within it.
typedef struct _DIR_BUFFER {
   TCHAR Name[MAX_PATH];
   struct _DIR_LIST *parent;
   BOOL Last;                    // Flag is last dir-buffer in list
   DWORD Attributes;
   BYTE Convert;                 // None, All or Partial
   BOOL Special;

   struct _DIR_LIST *DirList;    // Directory List structure
   struct _FILE_LIST *FileList;  // File List structure
} DIR_BUFFER;

// A dir list contains the sub-directories in a directory - basically a count
// and then array of sub-dirs.
typedef struct _DIR_LIST {
   ULONG Count;
   DIR_BUFFER *parent;
   UINT Level;             // how deeply nested in file tree (nesting level)
   DIR_BUFFER DirBuffer[];
} DIR_LIST;


// Structures to hold information on individual files selected/de-selected for
// conversion
typedef struct _FILE_BUFFER {
   TCHAR Name[MAX_PATH];
   struct _FILE_LIST *parent;
   BOOL Convert;
   DWORD Attributes;
   ULONG Size;
} FILE_BUFFER;

typedef struct _FILE_LIST {
   ULONG Count;
   DIR_BUFFER *parent;
   FILE_BUFFER FileBuffer[];
} FILE_LIST;


typedef struct _FILE_PATH_BUFFER {
   LPTSTR Server;
   LPTSTR Share;
   LPTSTR Path;
   TCHAR FullPath[MAX_PATH + 1];
} FILE_PATH_BUFFER;


/*+-------------------------------------------------------------------------+
  | Function Prototypes                                                     |
  +-------------------------------------------------------------------------+*/
void TreeDelete(DIR_BUFFER *Dir);
void TreePrune(DIR_BUFFER *Dir);
ULONG TreeCount(DIR_BUFFER *Dir);
DIR_BUFFER *TreeCopy(DIR_BUFFER *Dir);

FILE_PATH_BUFFER *FilePathInit();
void FilePathServerSet(FILE_PATH_BUFFER *fpBuf, LPTSTR Server);
void FilePathShareSet(FILE_PATH_BUFFER *fpBuf, LPTSTR Share);
void FilePathPathSet(FILE_PATH_BUFFER *fpBuf, LPTSTR Path);

#ifdef __cplusplus
}
#endif

#endif