Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #pragma once
00009
00010 #include "cabinet.h"
00011
00012 typedef struct _CABINET_NAME {
00013 struct _CABINET_NAME *Next;
00014 ULONG DiskNumber;
00015 char Name[128];
00016 } CABINET_NAME, *PCABINET_NAME;
00017
00018 typedef struct _DISK_NUMBER {
00019 struct _DISK_NUMBER *Next;
00020 ULONG DiskNumber;
00021 ULONG Number;
00022 } DISK_NUMBER, *PDISK_NUMBER;
00023
00024 typedef enum {
00025 TokenUnknown,
00026 TokenInteger,
00027 TokenIdentifier,
00028 TokenString,
00029 TokenSpace,
00030 TokenSemi,
00031 TokenEqual,
00032 TokenPeriod,
00033 TokenBackslash,
00034 TokenEnd,
00035 } DFP_TOKEN;
00036
00037
00038 typedef enum {
00039 stCabinetName,
00040 stCabinetNameTemplate,
00041 stDiskLabel,
00042 stDiskLabelTemplate,
00043 stMaxDiskSize,
00044 stInfFileName
00045 } SETTYPE;
00046
00047
00048 typedef enum {
00049 ntDisk,
00050 ntCabinet,
00051 ntFolder,
00052 } NEWTYPE;
00053
00054
00055
00056
00057 class CDFParser : public CCabinet {
00058 public:
00059 CDFParser();
00060 virtual ~CDFParser();
00061 ULONG Load(char* FileName);
00062 ULONG Parse();
00063 void SetFileRelativePath(char* Path);
00064 bool InfFileOnly;
00065 bool DontGenerateInf;
00066 char FileRelativePath[300];
00067 private:
00068
00069 virtual bool OnDiskLabel(ULONG Number, char* Label);
00070 virtual bool OnCabinetName(ULONG Number, char* Name);
00071
00072 void WriteInfLine(char* InfLine);
00073 bool SetDiskName(PCABINET_NAME *List, ULONG Number, char* String);
00074 bool GetDiskName(PCABINET_NAME *List, ULONG Number, char* String);
00075 bool SetDiskNumber(PDISK_NUMBER *List, ULONG Number, ULONG Value);
00076 bool GetDiskNumber(PDISK_NUMBER *List, ULONG Number, PULONG Value);
00077 bool DoDiskLabel(ULONG Number, char* Label);
00078 void DoDiskLabelTemplate(char* Template);
00079 bool DoCabinetName(ULONG Number, char* Name);
00080 void DoCabinetNameTemplate(char* Template);
00081 void DoInfFileName(char* InfFileName);
00082 ULONG DoMaxDiskSize(bool NumberValid, ULONG Number);
00083 ULONG SetupNewDisk();
00084 ULONG PerformSetCommand();
00085 ULONG PerformNewCommand();
00086 ULONG PerformInfBeginCommand();
00087 ULONG PerformInfEndCommand();
00088 ULONG PerformCommand();
00089 ULONG PerformFileCopy();
00090 void SkipSpaces();
00091 bool IsNextToken(DFP_TOKEN Token, bool NoSpaces);
00092 bool ReadLine();
00093 void NextToken();
00094
00095 bool FileLoaded;
00096 FILEHANDLE FileHandle;
00097 char* FileBuffer;
00098 ULONG FileBufferSize;
00099 ULONG CurrentOffset;
00100 char Line[PATH_MAX + 6];
00101 ULONG LineLength;
00102 ULONG CurrentLine;
00103 ULONG CurrentChar;
00104
00105 DFP_TOKEN CurrentToken;
00106 ULONG CurrentInteger;
00107 char CurrentString[256];
00108
00109
00110 bool CabinetCreated;
00111 bool DiskCreated;
00112 bool FolderCreated;
00113
00114 bool Cabinet;
00115 ULONG CabinetFileCountThreshold;
00116 PCABINET_NAME CabinetName;
00117 bool CabinetNameTemplateSet;
00118 char CabinetNameTemplate[128];
00119 bool InfFileNameSet;
00120 char InfFileName[256];
00121 bool Compress;
00122 ULONG CompressionType;
00123 PCABINET_NAME DiskLabel;
00124 bool DiskLabelTemplateSet;
00125 char DiskLabelTemplate[128];
00126 ULONG FolderFileCountThreshold;
00127 ULONG FolderSizeThreshold;
00128 ULONG MaxCabinetSize;
00129 ULONG MaxDiskFileCount;
00130 PDISK_NUMBER MaxDiskSize;
00131 bool MaxDiskSizeAllSet;
00132 ULONG MaxDiskSizeAll;
00133 ULONG ReservePerCabinetSize;
00134 ULONG ReservePerDataBlockSize;
00135 ULONG ReservePerFolderSize;
00136 char SourceDir[256];
00137 FILEHANDLE InfFileHandle;
00138 bool InfModeEnabled;
00139 };
00140
00141