00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 #ifndef INC_MI32_FILEFIND_H
00076 #define INC_MI32_FILEFIND_H
00077
00078 #ifndef INC_MI32_DELEGATE_H
00079 #include <mi32/delegate.h>
00080 #endif
00081
00082 #ifdef MISYSTEMDLL
00083 #define CLASSLIBEXPORT MI_DLLCLASSEXPORT
00084 #else
00085 #define CLASSLIBEXPORT MI_DLLCLASSIMPORT
00086 #endif
00087
00088 #ifndef GENERATING_DOXYGEN_OUTPUT
00089 class FILEPATH;
00090 class FILEPATHLIST;
00091 #endif
00092
00093
00095 class CLASSLIBEXPORT FILEFIND {
00096 public:
00097
00099 enum ADDPOSN {
00100 ADDPOSN_ToFront,
00101 ADDPOSN_ToBack
00102 };
00103
00104 enum LOCATIONS {
00105 LOCATION_None = 0x0000,
00106 LOCATION_Locale = 0x0001,
00107 LOCATION_Home = 0x0002,
00108 LOCATION_Current = 0x0004,
00109 LOCATION_Process = 0x0008,
00110 LOCATION_PATH = 0x0010,
00111 LOCATION_Installation = 0x0020,
00112 LOCATION_Settings_CurInst_CurUser = 0x0100,
00113 LOCATION_Settings_CurInst_AllUsers = 0x0200,
00114 LOCATION_Settings_AllInst_CurUser = 0x0400,
00115 LOCATION_Settings_AllInst_AllUsers = 0x0800,
00116 LOCATIONS_Executable = (LOCATION_Installation | LOCATION_Process | LOCATION_Current | LOCATION_PATH),
00117 LOCATIONS_Reference = (LOCATION_Installation | LOCATION_Process | LOCATION_Current),
00118 LOCATIONS_Temporary = 0x1000,
00119 #ifndef GENERATING_DOXYGEN_OUTPUT
00120 #ifdef MISYSTEMDLL
00121 LOCATIONS_Settings_Mask = 0x0F00,
00122 #endif
00123 #endif // GENERATING_DOXYGEN_OUTPUT
00124 };
00125
00132 enum RELATEDORDER {
00133 #ifndef GENERATING_DOXYGEN_OUTPUT
00134 SUBORDER_Original = 0x01,
00135 SUBORDER_Media = 0x02,
00136 SUBORDER_Source = 0x03,
00137 SUBORDER_Tree = 0x04,
00138 SUBORDER_Mask = 0x0F,
00139 #endif
00140 RELATEDORDER_SourceOriginalMediaTree = ((SUBORDER_Source) | (SUBORDER_Original << 4) | (SUBORDER_Media << 8) | (SUBORDER_Tree << 12)),
00141 RELATEDORDER_OriginalSourceMediaTree = ((SUBORDER_Original) | (SUBORDER_Source << 4) | (SUBORDER_Media << 8) | (SUBORDER_Tree << 12)),
00142 RELATEDORDER_SourceMediaOriginalTree = ((SUBORDER_Source) | (SUBORDER_Media << 4) | (SUBORDER_Original << 8) | (SUBORDER_Tree << 12)),
00143 RELATEDORDER_MediaSourceOriginalTree = ((SUBORDER_Media) | (SUBORDER_Source << 4) | (SUBORDER_Original << 8) | (SUBORDER_Tree << 12)),
00144 RELATEDORDER_MediaTreeSourceOriginal = ((SUBORDER_Media) | (SUBORDER_Tree << 4) | (SUBORDER_Source << 8) | (SUBORDER_Original << 12)),
00145 RELATEDORDER_NoPrompt = 0x80000000
00146 };
00147
00149 class CLASSLIBEXPORT FILTER {
00150 public:
00151
00153 virtual bool v_Filter (
00154 const FILEPATH& path
00155 ) = 0;
00156
00160 virtual bool v_Prompt (
00161 FILEPATH& path,
00162 const MISTRING *pPromptStr
00163 );
00164 };
00165
00168 class MISSINGFILEPROMPTDISABLER {
00169 public:
00171 MISSINGFILEPROMPTDISABLER (
00172 ) { FILEFIND::MissingFilePromptDisable(); }
00174 ~MISSINGFILEPROMPTDISABLER (
00175 ) { FILEFIND::MissingFilePromptEnable(); }
00176
00177 private:
00178 #ifndef GENERATING_DOXYGEN_OUTPUT
00179 MISSINGFILEPROMPTDISABLER (const MISSINGFILEPROMPTDISABLER&);
00180 MISSINGFILEPROMPTDISABLER& operator= (const MISSINGFILEPROMPTDISABLER&);
00181 #endif // GENERATING_DOXYGEN_OUTPUT
00182 };
00183
00186 typedef FastDelegate<bool(FILEPATH&, FILEFIND::FILTER*, const MISTRING*)> DELEGATE_PROMPT;
00187
00189 typedef FastDelegate<void(FILEPATH&)> DELEGATE_MOUNT;
00190
00192 static void ClearMissingFileList ();
00193
00199 static ERRVALUE GetDefaultTempFolder (
00200 FILEPATH& Folder,
00201 bool bCreateIfMissing
00202 );
00203
00210 static bool LocateExecutableFile (
00211 const char* ExecutableFileName,
00212 FILEPATH& ExecutableFilePath
00213 );
00214
00224 static bool LocateReferenceFile (
00225 const char* ReferenceFileName,
00226 FILEPATH& ReferenceFilePath,
00227 LOCATIONS locations = LOCATION_None
00228 );
00229
00239 static bool LocateReferenceFile (
00240 const MISTRING& ReferenceFileName,
00241 FILEPATH& ReferenceFilePath,
00242 LOCATIONS locations = LOCATION_None
00243 );
00244
00247 static bool LocateRelatedFile (
00248 const FILEPATH& SourcePath,
00249 FILEPATH& RelatedPath,
00250 RELATEDORDER order,
00251 FILTER *pFilter = 0
00252 );
00253
00267 static bool LocateSettingsFile (
00268 const char* SettingsFileName,
00269 FILEPATH& SettingsFilePath,
00270 LOCATIONS PreferredLocation,
00271 LOCATIONS LegacyLocations = LOCATION_None
00272 );
00273
00275 static ERRVALUE LocateTrueTypeFontFiles (
00276 FILEPATHLIST& TrueTypeFiles
00277 );
00278
00291 static ERRVALUE MakeSettingsFilePath (
00292 const char* SettingsFileName,
00293 FILEPATH& SettingsFilePath,
00294 LOCATIONS locations
00295 );
00296
00299 static ERRVALUE MakeTempFile (
00300 FILEPATH& TempFilePath,
00301 INT64 MinSize,
00302 bool LargestPath,
00303 const MISTRING& basename,
00304 const char *extn = "tmp"
00305 );
00306
00309 static ERRVALUE MakeTempFile (
00310 FILEPATH& TempFilePath,
00311 INT64 MinSize,
00312 bool LargestPath
00313 );
00314
00317 static void MissingFilePromptDisable ();
00318
00321 static void MissingFilePromptEnable ();
00322
00324 static void RegisterMountDelegate (
00325 DELEGATE_MOUNT delegate
00326 );
00327
00329 static void RegisterPromptDelegate (
00330 DELEGATE_PROMPT delegate
00331 );
00332
00345 explicit FILEFIND (
00346 LOCATIONS locations = LOCATION_None
00347 );
00348
00350 FILEFIND (
00351 const FILEFIND& rhs
00352 );
00353
00355 ~FILEFIND (
00356 );
00357
00359 FILEFIND& operator= (
00360 const FILEFIND& rhs
00361 );
00362
00365 void AddEnvVar (
00366 const char* EnvTag,
00367 ADDPOSN AddPosn = ADDPOSN_ToBack,
00368 bool NeedWritable = false
00369 );
00370
00373 void AddLocale (
00374 bool IncludeDefault = true,
00375 ADDPOSN AddPosn = ADDPOSN_ToBack
00376 );
00377
00379 void AddPath (
00380 const FILEPATH& path,
00381 ADDPOSN AddPosn = ADDPOSN_ToBack,
00382 bool NeedWritable = false
00383 );
00384
00386 void AddString (
00387 const MISTRING& mpath,
00388 ADDPOSN AddPosn = ADDPOSN_ToBack,
00389 bool NeedWritable = false,
00390 MIUNICODE Separator = 0xFFFF
00391 );
00392
00397 bool CreatePath (
00398 const MISTRING& name,
00399 FILEPATH& path
00400 ) const;
00401
00406 bool CreatePath (
00407 const char* name,
00408 FILEPATH& path
00409 ) const;
00410
00412 const FILEPATHLIST& GetPathList (
00413 ) const { return (*m_pPathList); }
00414
00417 bool IsEmpty (
00418 ) const;
00419
00422 bool LocateFile (
00423 const char* name,
00424 FILEPATH& path
00425 ) const;
00426
00429 bool LocateFile (
00430 const MISTRING& relfile,
00431 FILEPATH& path
00432 ) const;
00433
00436 bool LocateFiles (
00437 const MISTRING& pattern,
00438 FILEPATHLIST& PathList
00439 ) const;
00440
00443 bool LocatePath (
00444 FILTER& filter,
00445 FILEPATH& path
00446 ) const;
00447
00448 private:
00449 #ifndef GENERATING_DOXYGEN_OUTPUT
00450
00451 FILEPATHLIST *m_pPathList;
00452 static const MIUNICODE s_SepMark;
00453 static FILEPATH& GetLocaleDir();
00454 static DELEGATE_MOUNT s_DelegateMount;
00455 static DELEGATE_PROMPT s_DelegatePrompt;
00456 static UINT32 s_PromptDisabledCount;
00457
00458 void AddTempEnvVar (const char *EnvTag);
00459
00460 bool CreatePathLow (
00461 const MISTRING& name,
00462 FILEPATH& path,
00463 MISTRING& errdetails
00464 ) const;
00465
00466 bool CreatePathLow (
00467 const char *name,
00468 FILEPATH& path,
00469 MISTRING& errdetails
00470 ) const;
00471
00472 void MoveOldTemp (
00473 const FILEPATH& FolderPathNew,
00474 const FILEPATH& FolderPathOld,
00475 const char *name
00476 );
00477
00478 friend class FILEFIND::FILTER;
00479
00480 #endif // GENERATING_DOXYGEN_OUTPUT
00481
00482 };
00483
00484 #ifndef GENERATING_DOXYGEN_OUTPUT
00485 DEFINE_ENUM_OP_BITWISE(FILEFIND::LOCATIONS);
00486 DEFINE_ENUM_OP_BITWISE(FILEFIND::RELATEDORDER);
00487 #endif
00488
00489 #undef CLASSLIBEXPORT
00490 #endif // INC_MI32_FILEFIND_H