Common.h 26 KB

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