Common.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. //---------------------------------------------------------------------------
  2. #ifndef CommonH
  3. #define CommonH
  4. //---------------------------------------------------------------------------
  5. #define EXCEPTION throw ExtException(NULL, L"")
  6. #define THROWOSIFFALSE(C) { if (!(C)) RaiseLastOSError(); }
  7. #define SAFE_DESTROY_EX(CLASS, OBJ) { CLASS * PObj = OBJ; OBJ = NULL; delete PObj; }
  8. #define SAFE_DESTROY(OBJ) SAFE_DESTROY_EX(TObject, OBJ)
  9. #define NULL_TERMINATE(S) S[LENOF(S) - 1] = L'\0'
  10. #define ASCOPY(dest, source) \
  11. { \
  12. AnsiString CopyBuf = source; \
  13. strncpy(dest, CopyBuf.c_str(), LENOF(dest)); \
  14. dest[LENOF(dest)-1] = '\0'; \
  15. }
  16. #define SWAP(TYPE, FIRST, SECOND) \
  17. { TYPE __Backup = FIRST; FIRST = SECOND; SECOND = __Backup; }
  18. //---------------------------------------------------------------------------
  19. extern const wchar_t EngShortMonthNames[12][4];
  20. extern const char Bom[3];
  21. extern const wchar_t TokenPrefix;
  22. extern const wchar_t NoReplacement;
  23. extern const wchar_t TokenReplacement;
  24. extern const UnicodeString LocalInvalidChars;
  25. extern const UnicodeString PasswordMask;
  26. //---------------------------------------------------------------------------
  27. UnicodeString ReplaceChar(UnicodeString Str, wchar_t A, wchar_t B);
  28. UnicodeString DeleteChar(UnicodeString Str, wchar_t C);
  29. int PosFrom(const UnicodeString & SubStr, const UnicodeString & Str, int Index);
  30. void PackStr(UnicodeString & Str);
  31. void PackStr(RawByteString & Str);
  32. void PackStr(AnsiString & Str);
  33. void __fastcall Shred(UnicodeString & Str);
  34. void __fastcall Shred(UTF8String & Str);
  35. void __fastcall Shred(AnsiString & Str);
  36. UnicodeString AnsiToString(const RawByteString & S);
  37. UnicodeString AnsiToString(const char * S, size_t Len);
  38. UnicodeString MakeValidFileName(UnicodeString FileName);
  39. UnicodeString RootKeyToStr(HKEY RootKey);
  40. UnicodeString BooleanToStr(bool B);
  41. UnicodeString BooleanToEngStr(bool B);
  42. UnicodeString DefaultStr(const UnicodeString & Str, const UnicodeString & Default);
  43. UnicodeString CutToChar(UnicodeString &Str, wchar_t Ch, bool Trim);
  44. UnicodeString CopyToChars(const UnicodeString & Str, int & From, UnicodeString Chs, bool Trim,
  45. wchar_t * Delimiter = NULL, bool DoubleDelimiterEscapes = false);
  46. UnicodeString CopyToChar(const UnicodeString & Str, wchar_t Ch, bool Trim);
  47. UnicodeString DelimitStr(UnicodeString Str, UnicodeString Chars);
  48. UnicodeString ShellDelimitStr(UnicodeString Str, wchar_t Quote);
  49. UnicodeString ExceptionLogString(Exception *E);
  50. UnicodeString __fastcall MainInstructions(const UnicodeString & S);
  51. bool __fastcall HasParagraphs(const UnicodeString & S);
  52. UnicodeString __fastcall MainInstructionsFirstParagraph(const UnicodeString & S);
  53. bool ExtractMainInstructions(UnicodeString & S, UnicodeString & MainInstructions);
  54. UnicodeString RemoveMainInstructionsTag(UnicodeString S);
  55. UnicodeString UnformatMessage(UnicodeString S);
  56. UnicodeString RemoveInteractiveMsgTag(UnicodeString S);
  57. UnicodeString RemoveEmptyLines(const UnicodeString & S);
  58. bool IsNumber(const UnicodeString Str);
  59. UnicodeString __fastcall SystemTemporaryDirectory();
  60. UnicodeString __fastcall GetShellFolderPath(int CSIdl);
  61. UnicodeString __fastcall StripPathQuotes(const UnicodeString Path);
  62. UnicodeString __fastcall AddQuotes(UnicodeString Str);
  63. UnicodeString __fastcall AddPathQuotes(UnicodeString Path);
  64. void __fastcall SplitCommand(UnicodeString Command, UnicodeString &Program,
  65. UnicodeString & Params, UnicodeString & Dir);
  66. UnicodeString __fastcall ValidLocalFileName(UnicodeString FileName);
  67. UnicodeString __fastcall ValidLocalFileName(
  68. UnicodeString FileName, wchar_t InvalidCharsReplacement,
  69. const UnicodeString & TokenizibleChars, const UnicodeString & LocalInvalidChars);
  70. UnicodeString __fastcall ExtractProgram(UnicodeString Command);
  71. UnicodeString __fastcall ExtractProgramName(UnicodeString Command);
  72. UnicodeString __fastcall FormatCommand(UnicodeString Program, UnicodeString Params);
  73. UnicodeString __fastcall ExpandFileNameCommand(const UnicodeString Command,
  74. const UnicodeString FileName);
  75. void __fastcall ReformatFileNameCommand(UnicodeString & Command);
  76. UnicodeString __fastcall EscapeParam(const UnicodeString & Param);
  77. UnicodeString __fastcall EscapePuttyCommandParam(UnicodeString Param);
  78. UnicodeString __fastcall ExpandEnvironmentVariables(const UnicodeString & Str);
  79. bool __fastcall ComparePaths(const UnicodeString & Path1, const UnicodeString & Path2);
  80. bool __fastcall CompareFileName(const UnicodeString & Path1, const UnicodeString & Path2);
  81. int __fastcall CompareLogicalText(const UnicodeString & S1, const UnicodeString & S2);
  82. bool __fastcall IsReservedName(UnicodeString FileName);
  83. UnicodeString __fastcall ApiPath(UnicodeString Path);
  84. UnicodeString __fastcall DisplayableStr(const RawByteString & Str);
  85. UnicodeString __fastcall ByteToHex(unsigned char B, bool UpperCase = true);
  86. UnicodeString __fastcall BytesToHex(const unsigned char * B, size_t Length, bool UpperCase = true, wchar_t Separator = L'\0');
  87. UnicodeString __fastcall BytesToHex(RawByteString Str, bool UpperCase = true, wchar_t Separator = L'\0');
  88. UnicodeString __fastcall CharToHex(wchar_t Ch, bool UpperCase = true);
  89. RawByteString __fastcall HexToBytes(const UnicodeString Hex);
  90. unsigned char __fastcall HexToByte(const UnicodeString Hex);
  91. bool __fastcall IsLowerCaseLetter(wchar_t Ch);
  92. bool __fastcall IsUpperCaseLetter(wchar_t Ch);
  93. bool __fastcall IsLetter(wchar_t Ch);
  94. bool __fastcall IsDigit(wchar_t Ch);
  95. bool __fastcall IsHex(wchar_t Ch);
  96. UnicodeString __fastcall DecodeUrlChars(UnicodeString S);
  97. UnicodeString __fastcall EncodeUrlString(UnicodeString S);
  98. UnicodeString __fastcall EncodeUrlPath(UnicodeString S);
  99. UnicodeString __fastcall AppendUrlParams(UnicodeString URL, UnicodeString Params);
  100. bool __fastcall RecursiveDeleteFile(const UnicodeString & FileName, bool ToRecycleBin);
  101. void __fastcall RecursiveDeleteFileChecked(const UnicodeString & FileName, bool ToRecycleBin);
  102. void __fastcall DeleteFileChecked(const UnicodeString & FileName);
  103. unsigned int __fastcall CancelAnswer(unsigned int Answers);
  104. unsigned int __fastcall AbortAnswer(unsigned int Answers);
  105. unsigned int __fastcall ContinueAnswer(unsigned int Answers);
  106. UnicodeString __fastcall LoadStr(int Ident, unsigned int MaxLength);
  107. UnicodeString __fastcall LoadStrPart(int Ident, int Part);
  108. UnicodeString __fastcall EscapeHotkey(const UnicodeString & Caption);
  109. bool __fastcall CutToken(UnicodeString & Str, UnicodeString & Token,
  110. UnicodeString * RawToken = NULL, UnicodeString * Separator = NULL);
  111. void __fastcall AddToList(UnicodeString & List, const UnicodeString & Value, const UnicodeString & Delimiter);
  112. bool __fastcall IsWinVista();
  113. bool __fastcall IsWin7();
  114. bool __fastcall IsWin8();
  115. bool __fastcall IsWin10();
  116. bool __fastcall IsWine();
  117. TLibModule * __fastcall FindModule(void * Instance);
  118. __int64 __fastcall Round(double Number);
  119. bool __fastcall TryRelativeStrToDateTime(UnicodeString S, TDateTime & DateTime);
  120. LCID __fastcall GetDefaultLCID();
  121. UnicodeString __fastcall DefaultEncodingName();
  122. UnicodeString __fastcall WindowsProductName();
  123. bool _fastcall GetWindowsProductType(DWORD & Type);
  124. bool __fastcall IsDirectoryWriteable(const UnicodeString & Path);
  125. UnicodeString __fastcall FormatNumber(__int64 Size);
  126. UnicodeString __fastcall FormatSize(__int64 Size);
  127. UnicodeString __fastcall ExtractFileBaseName(const UnicodeString & Path);
  128. TStringList * __fastcall TextToStringList(const UnicodeString & Text);
  129. UnicodeString __fastcall StringsToText(TStrings * Strings);
  130. TStrings * __fastcall CloneStrings(TStrings * Strings);
  131. UnicodeString __fastcall TrimVersion(UnicodeString Version);
  132. UnicodeString __fastcall FormatVersion(int MajovVersion, int MinorVersion, int Release);
  133. TFormatSettings __fastcall GetEngFormatSettings();
  134. int __fastcall ParseShortEngMonthName(const UnicodeString & MonthStr);
  135. // The defaults are equal to defaults of TStringList class (except for Sorted)
  136. TStringList * __fastcall CreateSortedStringList(bool CaseSensitive = false, System::Types::TDuplicates Duplicates = dupIgnore);
  137. UnicodeString __fastcall FindIdent(const UnicodeString & Ident, TStrings * Idents);
  138. void __fastcall CheckCertificate(const UnicodeString & Path);
  139. typedef struct x509_st X509;
  140. typedef struct evp_pkey_st EVP_PKEY;
  141. void __fastcall ParseCertificate(const UnicodeString & Path,
  142. const UnicodeString & Passphrase, X509 *& Certificate, EVP_PKEY *& PrivateKey,
  143. bool & WrongPassphrase);
  144. bool __fastcall IsHttpUrl(const UnicodeString & S);
  145. //---------------------------------------------------------------------------
  146. typedef void __fastcall (__closure* TProcessLocalFileEvent)
  147. (const UnicodeString FileName, const TSearchRec Rec, void * Param);
  148. bool __fastcall FileSearchRec(const UnicodeString FileName, TSearchRec & Rec);
  149. struct TSearchRecChecked : public TSearchRec
  150. {
  151. UnicodeString Path;
  152. };
  153. int __fastcall FindCheck(int Result, const UnicodeString & Path);
  154. int __fastcall FindFirstUnchecked(const UnicodeString & Path, int Attr, TSearchRecChecked & F);
  155. int __fastcall FindFirstChecked(const UnicodeString & Path, int Attr, TSearchRecChecked & F);
  156. int __fastcall FindNextChecked(TSearchRecChecked & F);
  157. void __fastcall ProcessLocalDirectory(UnicodeString DirName,
  158. TProcessLocalFileEvent CallBackFunc, void * Param = NULL, int FindAttrs = -1);
  159. //---------------------------------------------------------------------------
  160. extern const wchar_t * DSTModeNames;
  161. enum TDSTMode
  162. {
  163. dstmWin = 0, //
  164. dstmUnix = 1, // adjust UTC time to Windows "bug"
  165. dstmKeep = 2
  166. };
  167. bool __fastcall UsesDaylightHack();
  168. TDateTime __fastcall EncodeDateVerbose(Word Year, Word Month, Word Day);
  169. TDateTime __fastcall EncodeTimeVerbose(Word Hour, Word Min, Word Sec, Word MSec);
  170. double __fastcall DSTDifferenceForTime(TDateTime DateTime);
  171. TDateTime __fastcall SystemTimeToDateTimeVerbose(const SYSTEMTIME & SystemTime);
  172. TDateTime __fastcall UnixToDateTime(__int64 TimeStamp, TDSTMode DSTMode);
  173. TDateTime __fastcall ConvertTimestampToUTC(TDateTime DateTime);
  174. TDateTime __fastcall ConvertTimestampFromUTC(TDateTime DateTime);
  175. FILETIME __fastcall DateTimeToFileTime(const TDateTime DateTime, TDSTMode DSTMode);
  176. TDateTime __fastcall AdjustDateTimeFromUnix(TDateTime DateTime, TDSTMode DSTMode);
  177. void __fastcall UnifyDateTimePrecision(TDateTime & DateTime1, TDateTime & DateTime2);
  178. TDateTime __fastcall FileTimeToDateTime(const FILETIME & FileTime);
  179. __int64 __fastcall ConvertTimestampToUnix(const FILETIME & FileTime,
  180. TDSTMode DSTMode);
  181. __int64 __fastcall ConvertTimestampToUnixSafe(const FILETIME & FileTime,
  182. TDSTMode DSTMode);
  183. UnicodeString __fastcall FixedLenDateTimeFormat(const UnicodeString & Format);
  184. UnicodeString __fastcall StandardTimestamp(const TDateTime & DateTime);
  185. UnicodeString __fastcall StandardTimestamp();
  186. UnicodeString __fastcall StandardDatestamp();
  187. UnicodeString __fastcall FormatTimeZone(long Sec);
  188. UnicodeString __fastcall GetTimeZoneLogString();
  189. bool __fastcall AdjustClockForDSTEnabled();
  190. int __fastcall CompareFileTime(TDateTime T1, TDateTime T2);
  191. int __fastcall TimeToMSec(TDateTime T);
  192. int __fastcall TimeToSeconds(TDateTime T);
  193. int __fastcall TimeToMinutes(TDateTime T);
  194. //---------------------------------------------------------------------------
  195. template<class MethodT>
  196. MethodT __fastcall MakeMethod(void * Data, void * Code)
  197. {
  198. MethodT Method;
  199. ((TMethod*)&Method)->Data = Data;
  200. ((TMethod*)&Method)->Code = Code;
  201. return Method;
  202. }
  203. //---------------------------------------------------------------------------
  204. extern const UnicodeString RtfPara;
  205. extern const UnicodeString RtfHyperlinkField;
  206. extern const UnicodeString RtfHyperlinkFieldPrefix;
  207. //---------------------------------------------------------------------
  208. UnicodeString __fastcall RtfText(const UnicodeString & Text);
  209. UnicodeString __fastcall RtfColor(int Index);
  210. UnicodeString __fastcall RtfOverrideColorText(const UnicodeString & Text);
  211. UnicodeString __fastcall RtfColorItalicText(int Color, const UnicodeString & Text);
  212. UnicodeString __fastcall RtfColorText(int Color, const UnicodeString & Text);
  213. UnicodeString __fastcall RtfKeyword(const UnicodeString & Text);
  214. UnicodeString __fastcall RtfParameter(const UnicodeString & Text);
  215. UnicodeString __fastcall RtfString(const UnicodeString & Text);
  216. UnicodeString __fastcall RtfLink(const UnicodeString & Link, const UnicodeString & RtfText);
  217. //---------------------------------------------------------------------------
  218. #include "Global.h"
  219. //---------------------------------------------------------------------------
  220. template<class T>
  221. class TValueRestorer
  222. {
  223. public:
  224. __fastcall TValueRestorer(T & Target, const T & Value) :
  225. FTarget(Target),
  226. FValue(Value),
  227. FArmed(true)
  228. {
  229. }
  230. __fastcall TValueRestorer(T & Target) :
  231. FTarget(Target),
  232. FValue(Target),
  233. FArmed(true)
  234. {
  235. }
  236. void Release()
  237. {
  238. if (FArmed)
  239. {
  240. FTarget = FValue;
  241. FArmed = false;
  242. }
  243. }
  244. __fastcall ~TValueRestorer()
  245. {
  246. Release();
  247. }
  248. protected:
  249. T & FTarget;
  250. T FValue;
  251. bool FArmed;
  252. };
  253. //---------------------------------------------------------------------------
  254. class TAutoNestingCounter : public TValueRestorer<int>
  255. {
  256. public:
  257. __fastcall TAutoNestingCounter(int & Target) :
  258. TValueRestorer<int>(Target)
  259. {
  260. DebugAssert(Target >= 0);
  261. ++Target;
  262. }
  263. __fastcall ~TAutoNestingCounter()
  264. {
  265. DebugAssert(!FArmed || (FTarget == (FValue + 1)));
  266. }
  267. };
  268. //---------------------------------------------------------------------------
  269. class TAutoFlag : public TValueRestorer<bool>
  270. {
  271. public:
  272. __fastcall TAutoFlag(bool & Target) :
  273. TValueRestorer<bool>(Target)
  274. {
  275. DebugAssert(!Target);
  276. Target = true;
  277. }
  278. __fastcall ~TAutoFlag()
  279. {
  280. DebugAssert(!FArmed || FTarget);
  281. }
  282. };
  283. //---------------------------------------------------------------------------
  284. #include <map>
  285. //---------------------------------------------------------------------------
  286. template<class T1, class T2>
  287. class BiDiMap
  288. {
  289. public:
  290. typedef std::map<T1, T2> TFirstToSecond;
  291. typedef TFirstToSecond::const_iterator const_iterator;
  292. void Add(const T1 & Value1, const T2 & Value2)
  293. {
  294. FFirstToSecond.insert(std::make_pair(Value1, Value2));
  295. FSecondToFirst.insert(std::make_pair(Value2, Value1));
  296. }
  297. T1 LookupFirst(const T2 & Value2) const
  298. {
  299. TSecondToFirst::const_iterator Iterator = FSecondToFirst.find(Value2);
  300. DebugAssert(Iterator != FSecondToFirst.end());
  301. return Iterator->second;
  302. }
  303. T2 LookupSecond(const T1 & Value1) const
  304. {
  305. const_iterator Iterator = FFirstToSecond.find(Value1);
  306. DebugAssert(Iterator != FFirstToSecond.end());
  307. return Iterator->second;
  308. }
  309. const_iterator begin()
  310. {
  311. return FFirstToSecond.begin();
  312. }
  313. const_iterator end()
  314. {
  315. return FFirstToSecond.end();
  316. }
  317. private:
  318. TFirstToSecond FFirstToSecond;
  319. typedef std::map<T2, T1> TSecondToFirst;
  320. TSecondToFirst FSecondToFirst;
  321. };
  322. //---------------------------------------------------------------------------
  323. #endif