Common.h 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. //---------------------------------------------------------------------------
  2. #ifndef CommonH
  3. #define CommonH
  4. //---------------------------------------------------------------------------
  5. #include <vector>
  6. //---------------------------------------------------------------------------
  7. #define EXCEPTION throw ExtException(NULL, L"")
  8. #define THROWOSIFFALSE(C) { if (!(C)) RaiseLastOSError(); }
  9. #define SAFE_DESTROY_EX(CLASS, OBJ) { CLASS * PObj = OBJ; OBJ = NULL; delete PObj; }
  10. #define SAFE_DESTROY(OBJ) SAFE_DESTROY_EX(TObject, OBJ)
  11. #define NULL_TERMINATE(S) S[LENOF(S) - 1] = L'\0'
  12. #define ASCOPY(dest, source) \
  13. { \
  14. AnsiString CopyBuf = source; \
  15. strncpy(dest, CopyBuf.c_str(), LENOF(dest)); \
  16. dest[LENOF(dest)-1] = '\0'; \
  17. }
  18. #define SWAP(TYPE, FIRST, SECOND) \
  19. { TYPE __Backup = FIRST; FIRST = SECOND; SECOND = __Backup; }
  20. //---------------------------------------------------------------------------
  21. #define PARENTDIRECTORY L".."
  22. #define THISDIRECTORY L"."
  23. //---------------------------------------------------------------------------
  24. extern const UnicodeString AnyMask;
  25. extern const wchar_t EngShortMonthNames[12][4];
  26. extern const char Bom[3];
  27. extern const wchar_t TokenPrefix;
  28. extern const wchar_t NoReplacement;
  29. extern const wchar_t TokenReplacement;
  30. extern const UnicodeString LocalInvalidChars;
  31. extern const UnicodeString PasswordMask;
  32. extern const UnicodeString Ellipsis;
  33. extern const UnicodeString TitleSeparator;
  34. //---------------------------------------------------------------------------
  35. extern const UnicodeString HttpProtocol;
  36. extern const UnicodeString HttpsProtocol;
  37. extern const UnicodeString ProtocolSeparator;
  38. //---------------------------------------------------------------------------
  39. UnicodeString ReplaceChar(UnicodeString Str, wchar_t A, wchar_t B);
  40. UnicodeString DeleteChar(UnicodeString Str, wchar_t C);
  41. void PackStr(UnicodeString & Str);
  42. void PackStr(RawByteString & Str);
  43. void PackStr(AnsiString & Str);
  44. void __fastcall Shred(UnicodeString & Str);
  45. void __fastcall Shred(UTF8String & Str);
  46. void __fastcall Shred(AnsiString & Str);
  47. void __fastcall Shred(RawByteString & Str);
  48. UnicodeString AnsiToString(const RawByteString & S);
  49. UnicodeString AnsiToString(const char * S, size_t Len);
  50. UnicodeString MakeValidFileName(UnicodeString FileName);
  51. UnicodeString RootKeyToStr(HKEY RootKey, const UnicodeString & Default = EmptyStr);
  52. UnicodeString BooleanToStr(bool B);
  53. UnicodeString BooleanToEngStr(bool B);
  54. UnicodeString DefaultStr(const UnicodeString & Str, const UnicodeString & Default);
  55. UnicodeString CutToChar(UnicodeString &Str, wchar_t Ch, bool Trim);
  56. UnicodeString CopyToChars(const UnicodeString & Str, int & From, UnicodeString Chs, bool Trim,
  57. wchar_t * Delimiter = NULL, bool DoubleDelimiterEscapes = false);
  58. UnicodeString CopyToChar(const UnicodeString & Str, wchar_t Ch, bool Trim);
  59. UnicodeString RemoveSuffix(const UnicodeString & Str, const UnicodeString & Suffix, bool RemoveNumbersAfterSuffix = false);
  60. UnicodeString DelimitStr(const UnicodeString & Str, wchar_t Quote = L'"');
  61. UnicodeString MidStr(const UnicodeString & Text, int Start);
  62. UnicodeString ShellQuoteStr(const UnicodeString & Str);
  63. UnicodeString ExceptionLogString(Exception *E);
  64. UnicodeString __fastcall MainInstructions(const UnicodeString & S);
  65. bool __fastcall HasParagraphs(const UnicodeString & S);
  66. UnicodeString __fastcall MainInstructionsFirstParagraph(const UnicodeString & S);
  67. bool ExtractMainInstructions(UnicodeString & S, UnicodeString & MainInstructions);
  68. UnicodeString RemoveMainInstructionsTag(UnicodeString S);
  69. UnicodeString UnformatMessage(UnicodeString S);
  70. UnicodeString RemoveInteractiveMsgTag(UnicodeString S);
  71. UnicodeString RemoveEmptyLines(const UnicodeString & S);
  72. bool IsNumber(const UnicodeString Str);
  73. extern const wchar_t NormalizedFingerprintSeparator;
  74. UnicodeString EncodeStrToBase64(const RawByteString & Str);
  75. RawByteString DecodeBase64ToStr(const UnicodeString & Str);
  76. UnicodeString Base64ToUrlSafe(const UnicodeString & S);
  77. UnicodeString MD5ToUrlSafe(const UnicodeString & S);
  78. bool SameChecksum(const UnicodeString & AChecksum1, const UnicodeString & AChecksum2, bool Base64);
  79. UnicodeString __fastcall SystemTemporaryDirectory();
  80. UnicodeString __fastcall GetShellFolderPath(int CSIdl);
  81. UnicodeString __fastcall GetPersonalFolder();
  82. UnicodeString __fastcall GetDesktopFolder();
  83. UnicodeString __fastcall StripPathQuotes(const UnicodeString Path);
  84. UnicodeString __fastcall AddQuotes(UnicodeString Str);
  85. UnicodeString __fastcall AddPathQuotes(UnicodeString Path);
  86. void __fastcall SplitCommand(UnicodeString Command, UnicodeString &Program,
  87. UnicodeString & Params, UnicodeString & Dir);
  88. UnicodeString __fastcall ValidLocalFileName(UnicodeString FileName);
  89. UnicodeString __fastcall ValidLocalFileName(
  90. UnicodeString FileName, wchar_t InvalidCharsReplacement,
  91. const UnicodeString & TokenizibleChars, const UnicodeString & LocalInvalidChars);
  92. UnicodeString __fastcall ExtractProgram(UnicodeString Command);
  93. UnicodeString __fastcall ExtractProgramName(UnicodeString Command);
  94. UnicodeString __fastcall FormatCommand(UnicodeString Program, UnicodeString Params);
  95. UnicodeString __fastcall ExpandFileNameCommand(const UnicodeString Command,
  96. const UnicodeString FileName);
  97. void __fastcall ReformatFileNameCommand(UnicodeString & Command);
  98. UnicodeString __fastcall EscapeParam(const UnicodeString & Param);
  99. UnicodeString __fastcall EscapePuttyCommandParam(UnicodeString Param);
  100. UnicodeString __fastcall StringsToParams(TStrings * Strings);
  101. UnicodeString __fastcall ExpandEnvironmentVariables(const UnicodeString & Str);
  102. bool __fastcall SamePaths(const UnicodeString & Path1, const UnicodeString & Path2);
  103. UnicodeString GetNormalizedPath(const UnicodeString & Path);
  104. UnicodeString GetCanonicalPath(const UnicodeString & Path);
  105. bool __fastcall IsPathToSameFile(const UnicodeString & Path1, const UnicodeString & Path2);
  106. int __fastcall CompareLogicalText(
  107. const UnicodeString & S1, const UnicodeString & S2, bool NaturalOrderNumericalSorting);
  108. int __fastcall CompareNumber(__int64 Value1, __int64 Value2);
  109. bool ContainsTextSemiCaseSensitive(const UnicodeString & Text, const UnicodeString & SubText);
  110. bool __fastcall IsReservedName(UnicodeString FileName);
  111. UnicodeString __fastcall ApiPath(UnicodeString Path);
  112. UnicodeString __fastcall DisplayableStr(const RawByteString & Str);
  113. UnicodeString __fastcall ByteToHex(unsigned char B, bool UpperCase = true);
  114. UnicodeString __fastcall BytesToHex(const unsigned char * B, size_t Length, bool UpperCase = true, wchar_t Separator = L'\0');
  115. UnicodeString __fastcall BytesToHex(RawByteString Str, bool UpperCase = true, wchar_t Separator = L'\0');
  116. UnicodeString __fastcall CharToHex(wchar_t Ch, bool UpperCase = true);
  117. RawByteString __fastcall HexToBytes(const UnicodeString Hex);
  118. unsigned char __fastcall HexToByte(const UnicodeString Hex);
  119. bool __fastcall IsLowerCaseLetter(wchar_t Ch);
  120. bool __fastcall IsUpperCaseLetter(wchar_t Ch);
  121. bool __fastcall IsLetter(wchar_t Ch);
  122. bool __fastcall IsDigit(wchar_t Ch);
  123. bool __fastcall IsHex(wchar_t Ch);
  124. UnicodeString __fastcall DecodeUrlChars(UnicodeString S);
  125. UnicodeString __fastcall EncodeUrlString(UnicodeString S);
  126. UnicodeString __fastcall EncodeUrlPath(UnicodeString S);
  127. UnicodeString __fastcall AppendUrlParams(UnicodeString URL, UnicodeString Params);
  128. UnicodeString __fastcall ExtractFileNameFromUrl(const UnicodeString & Url);
  129. bool IsDomainOrSubdomain(const UnicodeString & FullDomain, const UnicodeString & Domain);
  130. bool __fastcall RecursiveDeleteFile(const UnicodeString & FileName, bool ToRecycleBin = false);
  131. int __fastcall RecursiveDeleteFileChecked(const UnicodeString & FileName, bool ToRecycleBin);
  132. void __fastcall DeleteFileChecked(const UnicodeString & FileName);
  133. unsigned int __fastcall CancelAnswer(unsigned int Answers);
  134. unsigned int __fastcall AbortAnswer(unsigned int Answers);
  135. unsigned int __fastcall ContinueAnswer(unsigned int Answers);
  136. UnicodeString __fastcall LoadStr(int Ident, unsigned int MaxLength);
  137. UnicodeString __fastcall LoadStrFrom(HINSTANCE Module, int Ident);
  138. UnicodeString __fastcall LoadStrPart(int Ident, int Part);
  139. UnicodeString __fastcall EscapeHotkey(const UnicodeString & Caption);
  140. bool __fastcall CutToken(UnicodeString & Str, UnicodeString & Token,
  141. UnicodeString * RawToken = NULL, UnicodeString * Separator = NULL);
  142. bool __fastcall CutTokenEx(UnicodeString & Str, UnicodeString & Token,
  143. UnicodeString * RawToken = NULL, UnicodeString * Separator = NULL);
  144. void __fastcall AddToList(UnicodeString & List, const UnicodeString & Value, const UnicodeString & Delimiter);
  145. void AddToShellFileListCommandLine(UnicodeString & List, const UnicodeString & Value);
  146. bool __fastcall IsWinVista();
  147. bool __fastcall IsWin7();
  148. bool __fastcall IsWin8();
  149. bool __fastcall IsWin10();
  150. bool __fastcall IsWin10Build(unsigned int BuildNumber);
  151. bool IsWin11();
  152. bool __fastcall IsWine();
  153. void EnableUWPTestMode();
  154. bool __fastcall IsUWP();
  155. UnicodeString GetPackageName();
  156. bool IsOfficialPackage();
  157. TLibModule * __fastcall FindModule(void * Instance);
  158. __int64 __fastcall Round(double Number);
  159. bool __fastcall TryRelativeStrToDateTime(UnicodeString S, TDateTime & DateTime, bool Add);
  160. bool TryStrToDateTimeStandard(const UnicodeString & S, TDateTime & Value);
  161. bool __fastcall TryStrToSize(UnicodeString SizeStr, __int64 & Size);
  162. UnicodeString __fastcall SizeToStr(__int64 Size);
  163. LCID __fastcall GetDefaultLCID();
  164. UnicodeString __fastcall DefaultEncodingName();
  165. UnicodeString __fastcall WindowsProductName();
  166. bool _fastcall GetWindowsProductType(DWORD & Type);
  167. int __fastcall GetWindowsBuild();
  168. UnicodeString __fastcall WindowsVersion();
  169. UnicodeString __fastcall WindowsVersionLong();
  170. bool __fastcall IsDirectoryWriteable(const UnicodeString & Path);
  171. UnicodeString __fastcall FormatNumber(__int64 Size);
  172. UnicodeString __fastcall FormatSize(__int64 Size);
  173. UnicodeString __fastcall ExtractFileBaseName(const UnicodeString & Path);
  174. TStringList * __fastcall TextToStringList(const UnicodeString & Text);
  175. UnicodeString __fastcall StringsToText(TStrings * Strings);
  176. TStringList * __fastcall CommaTextToStringList(const UnicodeString & CommaText);
  177. TStrings * __fastcall CloneStrings(TStrings * Strings);
  178. UnicodeString __fastcall TrimVersion(UnicodeString Version);
  179. UnicodeString __fastcall FormatVersion(int MajovVersion, int MinorVersion, int Release);
  180. TFormatSettings __fastcall GetEngFormatSettings();
  181. int __fastcall ParseShortEngMonthName(const UnicodeString & MonthStr);
  182. // The defaults are equal to defaults of TStringList class (except for Sorted)
  183. TStringList * __fastcall CreateSortedStringList(bool CaseSensitive = false, System::Types::TDuplicates Duplicates = dupIgnore);
  184. bool SameIdent(const UnicodeString & Ident1, const UnicodeString & Ident2);
  185. UnicodeString __fastcall FindIdent(const UnicodeString & Ident, TStrings * Idents);
  186. void __fastcall CheckCertificate(const UnicodeString & Path);
  187. typedef struct x509_st X509;
  188. typedef struct evp_pkey_st EVP_PKEY;
  189. void __fastcall ParseCertificate(const UnicodeString & Path,
  190. const UnicodeString & Passphrase, X509 *& Certificate, EVP_PKEY *& PrivateKey,
  191. bool & WrongPassphrase);
  192. bool __fastcall IsHttpUrl(const UnicodeString & S);
  193. bool __fastcall IsHttpOrHttpsUrl(const UnicodeString & S);
  194. UnicodeString __fastcall ChangeUrlProtocol(const UnicodeString & S, const UnicodeString & Protocol);
  195. void __fastcall LoadScriptFromFile(UnicodeString FileName, TStrings * Lines, bool FallbackToAnsi = false);
  196. UnicodeString __fastcall StripEllipsis(const UnicodeString & S);
  197. UnicodeString __fastcall GetFileMimeType(const UnicodeString & FileName);
  198. bool __fastcall IsRealFile(const UnicodeString & FileName);
  199. UnicodeString GetOSInfo();
  200. UnicodeString GetEnvironmentInfo();
  201. void SetStringValueEvenIfEmpty(TStrings * Strings, const UnicodeString & Name, const UnicodeString & Value);
  202. UnicodeString __fastcall GetAncestorProcessName(int Levels = 1);
  203. UnicodeString GetAncestorProcessNames();
  204. void NotSupported();
  205. void NotImplemented();
  206. UnicodeString GetDividerLine();
  207. //---------------------------------------------------------------------------
  208. struct TSearchRecSmart : public TSearchRec
  209. {
  210. public:
  211. TSearchRecSmart();
  212. void Clear();
  213. TDateTime GetLastWriteTime() const;
  214. bool IsRealFile() const;
  215. bool IsDirectory() const;
  216. bool IsHidden() const;
  217. private:
  218. mutable FILETIME FLastWriteTimeSource;
  219. mutable TDateTime FLastWriteTime;
  220. };
  221. //---------------------------------------------------------------------------
  222. typedef void __fastcall (__closure* TProcessLocalFileEvent)
  223. (const UnicodeString & FileName, const TSearchRecSmart & Rec, void * Param);
  224. bool __fastcall FileSearchRec(const UnicodeString FileName, TSearchRec & Rec);
  225. void CopySearchRec(const TSearchRec & Source, TSearchRec & Dest);
  226. struct TSearchRecChecked : public TSearchRecSmart
  227. {
  228. UnicodeString Path;
  229. UnicodeString Dir;
  230. bool Opened;
  231. UnicodeString GetFilePath() const;
  232. };
  233. struct TSearchRecOwned : public TSearchRecChecked
  234. {
  235. ~TSearchRecOwned();
  236. void Close();
  237. };
  238. int __fastcall FindCheck(int Result, const UnicodeString & Path);
  239. int __fastcall FindFirstUnchecked(const UnicodeString & Path, int Attr, TSearchRecChecked & F);
  240. int __fastcall FindFirstChecked(const UnicodeString & Path, int Attr, TSearchRecChecked & F);
  241. int __fastcall FindNextChecked(TSearchRecChecked & F);
  242. int __fastcall FindNextUnchecked(TSearchRecChecked & F);
  243. void __fastcall ProcessLocalDirectory(UnicodeString DirName,
  244. TProcessLocalFileEvent CallBackFunc, void * Param = NULL, int FindAttrs = -1);
  245. int __fastcall FileGetAttrFix(const UnicodeString & FileName);
  246. //---------------------------------------------------------------------------
  247. extern const wchar_t * DSTModeNames;
  248. enum TDSTMode
  249. {
  250. dstmWin = 0, //
  251. dstmUnix = 1, // adjust UTC time to Windows "bug"
  252. dstmKeep = 2
  253. };
  254. bool __fastcall UsesDaylightHack();
  255. TDateTime __fastcall EncodeDateVerbose(Word Year, Word Month, Word Day);
  256. TDateTime __fastcall EncodeTimeVerbose(Word Hour, Word Min, Word Sec, Word MSec);
  257. double __fastcall DSTDifferenceForTime(TDateTime DateTime);
  258. TDateTime __fastcall SystemTimeToDateTimeVerbose(const SYSTEMTIME & SystemTime);
  259. TDateTime __fastcall UnixToDateTime(__int64 TimeStamp, TDSTMode DSTMode);
  260. TDateTime __fastcall ConvertTimestampToUTC(TDateTime DateTime);
  261. TDateTime __fastcall ConvertTimestampFromUTC(TDateTime DateTime);
  262. FILETIME __fastcall DateTimeToFileTime(const TDateTime DateTime, TDSTMode DSTMode);
  263. TDateTime __fastcall AdjustDateTimeFromUnix(TDateTime DateTime, TDSTMode DSTMode);
  264. void __fastcall UnifyDateTimePrecision(TDateTime & DateTime1, TDateTime & DateTime2);
  265. TDateTime __fastcall FileTimeToDateTime(const FILETIME & FileTime);
  266. __int64 __fastcall ConvertTimestampToUnix(const FILETIME & FileTime,
  267. TDSTMode DSTMode);
  268. __int64 __fastcall ConvertTimestampToUnixSafe(const FILETIME & FileTime,
  269. TDSTMode DSTMode);
  270. UnicodeString __fastcall FixedLenDateTimeFormat(const UnicodeString & Format);
  271. UnicodeString __fastcall StandardTimestamp(const TDateTime & DateTime);
  272. UnicodeString __fastcall StandardTimestamp();
  273. UnicodeString __fastcall StandardDatestamp();
  274. UnicodeString __fastcall FormatTimeZone(long Sec);
  275. UnicodeString __fastcall GetTimeZoneLogString();
  276. bool __fastcall AdjustClockForDSTEnabled();
  277. int __fastcall CompareFileTime(TDateTime T1, TDateTime T2);
  278. int __fastcall TimeToMSec(TDateTime T);
  279. int __fastcall TimeToSeconds(TDateTime T);
  280. int __fastcall TimeToMinutes(TDateTime T);
  281. UnicodeString FormatDateTimeSpan(const TDateTime & DateTime);
  282. UnicodeString FormatRelativeTime(const TDateTime & ANow, const TDateTime & AThen, bool DateOnly);
  283. TStrings * TlsCipherList();
  284. //---------------------------------------------------------------------------
  285. template<class MethodT>
  286. MethodT __fastcall MakeMethod(void * Data, void * Code)
  287. {
  288. MethodT Method;
  289. ((TMethod*)&Method)->Data = Data;
  290. ((TMethod*)&Method)->Code = Code;
  291. return Method;
  292. }
  293. //---------------------------------------------------------------------------
  294. enum TAssemblyLanguage { alCSharp, alVBNET, alPowerShell };
  295. extern const UnicodeString RtfPara;
  296. extern const UnicodeString AssemblyNamespace;
  297. extern const UnicodeString SessionClassName;
  298. extern const UnicodeString TransferOptionsClassName;
  299. //---------------------------------------------------------------------
  300. UnicodeString __fastcall RtfText(const UnicodeString & Text, bool Rtf = true);
  301. UnicodeString __fastcall RtfColor(int Index);
  302. UnicodeString __fastcall RtfOverrideColorText(const UnicodeString & Text);
  303. UnicodeString __fastcall RtfColorItalicText(int Color, const UnicodeString & Text);
  304. UnicodeString __fastcall RtfColorText(int Color, const UnicodeString & Text);
  305. UnicodeString __fastcall RtfKeyword(const UnicodeString & Text);
  306. UnicodeString __fastcall RtfParameter(const UnicodeString & Text);
  307. UnicodeString __fastcall RtfString(const UnicodeString & Text);
  308. UnicodeString __fastcall RtfLink(const UnicodeString & Link, const UnicodeString & RtfText);
  309. UnicodeString __fastcall RtfSwitch(
  310. const UnicodeString & Name, const UnicodeString & Link, bool Rtf = true);
  311. UnicodeString __fastcall RtfSwitchValue(
  312. const UnicodeString & Name, const UnicodeString & Link, const UnicodeString & Value, bool Rtf = true);
  313. UnicodeString __fastcall RtfSwitch(
  314. const UnicodeString & Name, const UnicodeString & Link, const UnicodeString & Value, bool Rtf = true);
  315. UnicodeString __fastcall RtfSwitch(
  316. const UnicodeString & Name, const UnicodeString & Link, int Value, bool Rtf = true);
  317. UnicodeString __fastcall RtfEscapeParam(UnicodeString Param, bool PowerShellEscape);
  318. UnicodeString __fastcall RtfRemoveHyperlinks(UnicodeString Text);
  319. UnicodeString __fastcall ScriptCommandLink(const UnicodeString & Command);
  320. UnicodeString __fastcall AssemblyBoolean(TAssemblyLanguage Language, bool Value);
  321. UnicodeString __fastcall AssemblyString(TAssemblyLanguage Language, UnicodeString S);
  322. UnicodeString __fastcall AssemblyCommentLine(TAssemblyLanguage Language, const UnicodeString & Text);
  323. UnicodeString __fastcall AssemblyPropertyRaw(
  324. TAssemblyLanguage Language, const UnicodeString & ClassName, const UnicodeString & Name,
  325. const UnicodeString & Value, bool Inline);
  326. UnicodeString __fastcall AssemblyProperty(
  327. TAssemblyLanguage Language, const UnicodeString & ClassName, const UnicodeString & Name,
  328. const UnicodeString & Type, const UnicodeString & Member, bool Inline);
  329. UnicodeString __fastcall AssemblyProperty(
  330. TAssemblyLanguage Language, const UnicodeString & ClassName, const UnicodeString & Name,
  331. const UnicodeString & Value, bool Inline);
  332. UnicodeString __fastcall AssemblyProperty(
  333. TAssemblyLanguage Language, const UnicodeString & ClassName, const UnicodeString & Name, int Value, bool Inline);
  334. UnicodeString __fastcall AssemblyProperty(
  335. TAssemblyLanguage Language, const UnicodeString & ClassName, const UnicodeString & Name, bool Value, bool Inline);
  336. UnicodeString __fastcall RtfLibraryMethod(const UnicodeString & ClassName, const UnicodeString & MethodName, bool Inpage);
  337. UnicodeString __fastcall RtfLibraryClass(const UnicodeString & ClassName);
  338. UnicodeString __fastcall AssemblyVariableName(TAssemblyLanguage Language, const UnicodeString & ClassName);
  339. UnicodeString __fastcall AssemblyStatementSeparator(TAssemblyLanguage Language);
  340. UnicodeString __fastcall AssemblyVariableDeclaration(TAssemblyLanguage Language);
  341. UnicodeString __fastcall AssemblyNewClassInstance(
  342. TAssemblyLanguage Language, const UnicodeString & ClassName, bool Inline);
  343. UnicodeString __fastcall AssemblyNewClassInstanceStart(
  344. TAssemblyLanguage Language, const UnicodeString & ClassName, bool Inline);
  345. UnicodeString __fastcall AssemblyNewClassInstanceEnd(TAssemblyLanguage Language, bool Inline);
  346. UnicodeString __fastcall AssemblyAddRawSettings(
  347. TAssemblyLanguage Language, TStrings * RawSettings, const UnicodeString & ClassName,
  348. const UnicodeString & MethodName);
  349. //---------------------------------------------------------------------------
  350. #include "Global.h"
  351. //---------------------------------------------------------------------------
  352. template<class T>
  353. class TValueRestorer
  354. {
  355. public:
  356. __fastcall TValueRestorer(T & Target, const T & Value) :
  357. FTarget(Target),
  358. FValue(Value),
  359. FArmed(true)
  360. {
  361. }
  362. __fastcall TValueRestorer(T & Target) :
  363. FTarget(Target),
  364. FValue(Target),
  365. FArmed(true)
  366. {
  367. }
  368. void Release()
  369. {
  370. if (FArmed)
  371. {
  372. FTarget = FValue;
  373. FArmed = false;
  374. }
  375. }
  376. __fastcall ~TValueRestorer()
  377. {
  378. Release();
  379. }
  380. protected:
  381. T & FTarget;
  382. T FValue;
  383. bool FArmed;
  384. };
  385. //---------------------------------------------------------------------------
  386. class TAutoNestingCounter : public TValueRestorer<int>
  387. {
  388. public:
  389. __fastcall TAutoNestingCounter(int & Target) :
  390. TValueRestorer<int>(Target)
  391. {
  392. DebugAssert(Target >= 0);
  393. ++Target;
  394. }
  395. __fastcall ~TAutoNestingCounter()
  396. {
  397. DebugAssert(!FArmed || (FTarget == (FValue + 1)));
  398. }
  399. };
  400. //---------------------------------------------------------------------------
  401. class TAutoFlag : public TValueRestorer<bool>
  402. {
  403. public:
  404. __fastcall TAutoFlag(bool & Target) :
  405. TValueRestorer<bool>(Target)
  406. {
  407. DebugAssert(!Target);
  408. Target = true;
  409. }
  410. __fastcall ~TAutoFlag()
  411. {
  412. DebugAssert(!FArmed || FTarget);
  413. }
  414. };
  415. //---------------------------------------------------------------------------
  416. #include <map>
  417. //---------------------------------------------------------------------------
  418. template<class T1, class T2>
  419. class BiDiMap
  420. {
  421. public:
  422. typedef std::map<T1, T2> TFirstToSecond;
  423. typedef TFirstToSecond::const_iterator const_iterator;
  424. void Add(const T1 & Value1, const T2 & Value2)
  425. {
  426. FFirstToSecond.insert(std::make_pair(Value1, Value2));
  427. FSecondToFirst.insert(std::make_pair(Value2, Value1));
  428. }
  429. T1 LookupFirst(const T2 & Value2) const
  430. {
  431. TSecondToFirst::const_iterator Iterator = FSecondToFirst.find(Value2);
  432. DebugAssert(Iterator != FSecondToFirst.end());
  433. return Iterator->second;
  434. }
  435. T2 LookupSecond(const T1 & Value1) const
  436. {
  437. const_iterator Iterator = FFirstToSecond.find(Value1);
  438. DebugAssert(Iterator != FFirstToSecond.end());
  439. return Iterator->second;
  440. }
  441. const_iterator begin()
  442. {
  443. return FFirstToSecond.begin();
  444. }
  445. const_iterator end()
  446. {
  447. return FFirstToSecond.end();
  448. }
  449. private:
  450. TFirstToSecond FFirstToSecond;
  451. typedef std::map<T2, T1> TSecondToFirst;
  452. TSecondToFirst FSecondToFirst;
  453. };
  454. //---------------------------------------------------------------------------
  455. template<class T>
  456. class TMulticastEvent
  457. {
  458. public:
  459. TMulticastEvent()
  460. {
  461. // noop
  462. }
  463. TMulticastEvent(const TMulticastEvent & Other) :
  464. FEventHandlers(Other.FEventHandlers)
  465. {
  466. }
  467. explicit TMulticastEvent(T EventHandler)
  468. {
  469. Add(EventHandler);
  470. }
  471. void Add(T EventHandler)
  472. {
  473. DebugAssert(EventHandler != NULL);
  474. DebugAssert(Find(EventHandler) == FEventHandlers.end());
  475. FEventHandlers.push_back(EventHandler);
  476. }
  477. void Remove(T EventHandler)
  478. {
  479. TEventHandlers::iterator I = Find(EventHandler);
  480. if (DebugAlwaysTrue(I != FEventHandlers.end()))
  481. {
  482. FEventHandlers.erase(I);
  483. }
  484. }
  485. #pragma warn -inl
  486. template<typename P>
  487. void Invoke(const P & p)
  488. {
  489. TEventHandlers::iterator I = FEventHandlers.begin();
  490. while (I != FEventHandlers.end())
  491. {
  492. (*I)(p);
  493. ++I;
  494. }
  495. }
  496. #pragma warn .inl
  497. bool Contains(T EventHandler)
  498. {
  499. return (Find(EventHandler) != FEventHandlers.end());
  500. }
  501. bool Any() const
  502. {
  503. return (FEventHandlers.size() > 0);
  504. }
  505. bool operator==(const TMulticastEvent<T> Other) const
  506. {
  507. return (FEventHandlers == Other.FEventHandlers);
  508. }
  509. void operator=(const TMulticastEvent<T> & Other)
  510. {
  511. FEventHandlers = Other.FEventHandlers;
  512. }
  513. private:
  514. typedef std::vector<T> TEventHandlers;
  515. TEventHandlers FEventHandlers;
  516. TEventHandlers::iterator Find(T EventHandler)
  517. {
  518. return std::find(FEventHandlers.begin(), FEventHandlers.end(), EventHandler);
  519. }
  520. };
  521. //---------------------------------------------------------------------------
  522. typedef std::vector<UnicodeString> TUnicodeStringVector;
  523. //---------------------------------------------------------------------------
  524. #endif