CopyParam.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include "Common.h"
  5. #include "CopyParam.h"
  6. #include "HierarchicalStorage.h"
  7. #include "TextsCore.h"
  8. //---------------------------------------------------------------------------
  9. __fastcall TCopyParamType::TCopyParamType()
  10. {
  11. Default();
  12. }
  13. //---------------------------------------------------------------------------
  14. __fastcall TCopyParamType::TCopyParamType(const TCopyParamType & Source)
  15. {
  16. Assign(&Source);
  17. }
  18. //---------------------------------------------------------------------------
  19. __fastcall TCopyParamType::~TCopyParamType()
  20. {
  21. }
  22. //---------------------------------------------------------------------------
  23. void __fastcall TCopyParamType::Default()
  24. {
  25. // when changing defaults, make sure GetInfoStr() can handle it
  26. FileNameCase = ncNoChange;
  27. PreserveReadOnly = true;
  28. PreserveTime = true;
  29. Rights.Number = TRights::rfDefault;
  30. PreserveRights = false; // Was True until #106
  31. AsciiFileMask.Masks = "*.*html; *.htm; *.txt; *.php*; *.cgi; *.c; *.cpp; *.h; *.pas; "
  32. "*.bas; *.tex; *.pl; .htaccess; *.xtml; *.css; *.cfg; *.ini; *.sh; *.xml";
  33. TransferMode = tmAutomatic;
  34. AddXToDirectories = true;
  35. ResumeSupport = rsSmart;
  36. ResumeThreshold = 100 * 1024; // (100 kB)
  37. ReplaceInvalidChars = true;
  38. LocalInvalidChars = "/\\:*?\"<>|";
  39. CalculateSize = true;
  40. FileMask = "*.*";
  41. ExcludeFileMask.Masks = "";
  42. NegativeExclude = false;
  43. ClearArchive = false;
  44. }
  45. //---------------------------------------------------------------------------
  46. AnsiString __fastcall TCopyParamType::GetInfoStr(AnsiString Separator) const
  47. {
  48. TCopyParamType Defaults;
  49. AnsiString Result;
  50. #define ADD(STR) Result += (Result.IsEmpty() ? AnsiString() : Separator) + (STR)
  51. if ((TransferMode != Defaults.TransferMode) ||
  52. ((TransferMode == tmAutomatic) && !(AsciiFileMask == Defaults.AsciiFileMask)))
  53. {
  54. AnsiString S = FORMAT(LoadStrPart(COPY_INFO_TRANSFER_TYPE, 1),
  55. (LoadStrPart(COPY_INFO_TRANSFER_TYPE, TransferMode + 2)));
  56. if (TransferMode == tmAutomatic)
  57. {
  58. S = FORMAT(S, (AsciiFileMask.Masks));
  59. }
  60. ADD(S);
  61. }
  62. if (FileNameCase != Defaults.FileNameCase)
  63. {
  64. ADD(FORMAT(LoadStrPart(COPY_INFO_FILENAME, 1),
  65. (LoadStrPart(COPY_INFO_FILENAME, FileNameCase + 2))));
  66. }
  67. if (ReplaceInvalidChars != Defaults.ReplaceInvalidChars)
  68. {
  69. assert(!ReplaceInvalidChars);
  70. ADD(LoadStr(COPY_INFO_DONT_REPLACE_INV_CHARS));
  71. }
  72. if ((PreserveRights != Defaults.PreserveRights) ||
  73. (PreserveRights &&
  74. ((Rights != Defaults.Rights) || (AddXToDirectories != Defaults.AddXToDirectories))))
  75. {
  76. assert(PreserveRights);
  77. AnsiString RightsStr = Rights.Text;
  78. if (AddXToDirectories)
  79. {
  80. RightsStr += ", " + LoadStr(COPY_INFO_ADD_X_TO_DIRS);
  81. }
  82. ADD(FORMAT(LoadStr(COPY_INFO_PERMISSIONS), (RightsStr)));
  83. }
  84. if (PreserveReadOnly != Defaults.PreserveReadOnly)
  85. {
  86. assert(!PreserveReadOnly);
  87. ADD(LoadStr(COPY_INFO_DONT_PRESERVE_READONLY));
  88. }
  89. if (PreserveTime != Defaults.PreserveTime)
  90. {
  91. ADD(LoadStr(PreserveTime ? COPY_INFO_TIMESTAMP : COPY_INFO_DONT_PRESERVE_TIME));
  92. }
  93. if (CalculateSize != Defaults.CalculateSize)
  94. {
  95. assert(!CalculateSize);
  96. ADD(LoadStr(COPY_INFO_DONT_CALCULATE_SIZE));
  97. }
  98. if ((NegativeExclude != Defaults.NegativeExclude) ||
  99. !(ExcludeFileMask == Defaults.ExcludeFileMask))
  100. {
  101. ADD(FORMAT(LoadStr(NegativeExclude ? COPY_INFO_INCLUDE_MASK : COPY_INFO_EXCLUDE_MASK),
  102. (ExcludeFileMask.Masks)));
  103. }
  104. if (ClearArchive != Defaults.ClearArchive)
  105. {
  106. assert(ClearArchive);
  107. ADD(LoadStr(COPY_INFO_CLEAR_ARCHIVE));
  108. }
  109. #undef ADD
  110. if (Result.IsEmpty())
  111. {
  112. Result = LoadStr(COPY_INFO_DEFAULT);
  113. }
  114. return Result;
  115. }
  116. //---------------------------------------------------------------------------
  117. void __fastcall TCopyParamType::Assign(const TCopyParamType * Source)
  118. {
  119. assert(Source != NULL);
  120. #define COPY(Prop) Prop = Source->Prop
  121. COPY(FileNameCase);
  122. COPY(PreserveReadOnly);
  123. COPY(PreserveTime);
  124. COPY(Rights);
  125. COPY(AsciiFileMask);
  126. COPY(TransferMode);
  127. COPY(AddXToDirectories);
  128. COPY(PreserveRights);
  129. COPY(ResumeSupport);
  130. COPY(ResumeThreshold);
  131. COPY(ReplaceInvalidChars);
  132. COPY(LocalInvalidChars);
  133. COPY(CalculateSize);
  134. COPY(FileMask);
  135. COPY(ExcludeFileMask);
  136. COPY(NegativeExclude);
  137. COPY(ClearArchive);
  138. #undef COPY
  139. }
  140. //---------------------------------------------------------------------------
  141. TCopyParamType & __fastcall TCopyParamType::operator =(const TCopyParamType & rhp)
  142. {
  143. Assign(&rhp);
  144. return *this;
  145. }
  146. //---------------------------------------------------------------------------
  147. AnsiString __fastcall TCopyParamType::ValidLocalFileName(AnsiString FileName) const
  148. {
  149. char * InvalidChar;
  150. while ((InvalidChar = strpbrk(FileName.c_str(), LocalInvalidChars.c_str())) != NULL)
  151. {
  152. FileName[InvalidChar - FileName.c_str() + 1] = '_';
  153. }
  154. return FileName;
  155. }
  156. //---------------------------------------------------------------------------
  157. AnsiString __fastcall TCopyParamType::ChangeFileName(AnsiString FileName,
  158. TOperationSide Side, bool FirstLevel) const
  159. {
  160. if (FirstLevel)
  161. {
  162. FileName = MaskFileName(FileName, FileMask);
  163. }
  164. switch (FileNameCase) {
  165. case ncUpperCase: FileName = FileName.UpperCase(); break;
  166. case ncLowerCase: FileName = FileName.LowerCase(); break;
  167. case ncFirstUpperCase: FileName = FileName.SubString(1, 1).UpperCase() +
  168. FileName.SubString(2, FileName.Length()-1).LowerCase(); break;
  169. case ncLowerCaseShort:
  170. if ((FileName.Length() <= 12) && (FileName.Pos(".") <= 9) &&
  171. (FileName == FileName.UpperCase()))
  172. {
  173. FileName = FileName.LowerCase();
  174. }
  175. break;
  176. case ncNoChange:
  177. default:
  178. /*nothing*/
  179. break;
  180. }
  181. if (ReplaceInvalidChars && (Side == osRemote))
  182. {
  183. FileName = ValidLocalFileName(FileName);
  184. }
  185. return FileName;
  186. }
  187. //---------------------------------------------------------------------------
  188. bool __fastcall TCopyParamType::UseAsciiTransfer(AnsiString FileName,
  189. TOperationSide Side) const
  190. {
  191. switch (TransferMode) {
  192. case tmBinary: return false;
  193. case tmAscii: return true;
  194. case tmAutomatic: return AsciiFileMask.Matches(FileName, (Side == osLocal));
  195. default: assert(false); return false;
  196. }
  197. }
  198. //---------------------------------------------------------------------------
  199. TRights __fastcall TCopyParamType::RemoteFileRights(Integer Attrs) const
  200. {
  201. TRights R = Rights;
  202. /* if ((Attrs & faReadOnly) && PreserveReadOnly)
  203. R.ReadOnly = True;*/
  204. if ((Attrs & faDirectory) && AddXToDirectories)
  205. R.AddExecute();
  206. return R;
  207. }
  208. //---------------------------------------------------------------------------
  209. AnsiString __fastcall TCopyParamType::GetLogStr() const
  210. {
  211. char CaseC[] = "NULFS";
  212. char ModeC[] = "BAM";
  213. char ResumeC[] = "YSN";
  214. return FORMAT(
  215. " PrTime: %s; PrRO: %s; Rght: %s; PrR: %s; FnCs: %s; RIC: %s; "
  216. "Resume: %s (%d); CalcS: %s; Mask: %s\n"
  217. " TM: %s; ClAr: %s; ExclM(%s): %s\n"
  218. " AscM: %s\n",
  219. (BooleanToEngStr(PreserveTime),
  220. BooleanToEngStr(PreserveReadOnly),
  221. Rights.Text,
  222. BooleanToEngStr(PreserveRights),
  223. CaseC[FileNameCase],
  224. BooleanToEngStr(ReplaceInvalidChars),
  225. ResumeC[ResumeSupport],
  226. (int)ResumeThreshold,
  227. BooleanToEngStr(CalculateSize),
  228. FileMask,
  229. ModeC[TransferMode],
  230. BooleanToEngStr(ClearArchive),
  231. BooleanToEngStr(NegativeExclude),
  232. ExcludeFileMask.Masks,
  233. AsciiFileMask.Masks));
  234. }
  235. //---------------------------------------------------------------------------
  236. int __fastcall TCopyParamType::LocalFileAttrs(const TRights & Rights) const
  237. {
  238. int Result = 0;
  239. if (PreserveReadOnly && !Rights.Right[TRights::rrUserWrite])
  240. {
  241. Result |= faReadOnly;
  242. }
  243. return Result;
  244. }
  245. //---------------------------------------------------------------------------
  246. bool __fastcall TCopyParamType::AllowResume(__int64 Size) const
  247. {
  248. switch (ResumeSupport) {
  249. case rsOn: return true;
  250. case rsOff: return false;
  251. case rsSmart: return (Size >= ResumeThreshold);
  252. default: assert(false); return false;
  253. }
  254. }
  255. //---------------------------------------------------------------------------
  256. bool __fastcall TCopyParamType::AllowTransfer(AnsiString FileName,
  257. TOperationSide Side) const
  258. {
  259. bool Result = true;
  260. if (!ExcludeFileMask.Masks.IsEmpty())
  261. {
  262. Result = (ExcludeFileMask.Matches(FileName, (Side == osLocal)) == NegativeExclude);
  263. }
  264. return Result;
  265. }
  266. //---------------------------------------------------------------------------
  267. void __fastcall TCopyParamType::Load(THierarchicalStorage * Storage)
  268. {
  269. AddXToDirectories = Storage->ReadBool("AddXToDirectories", AddXToDirectories);
  270. AsciiFileMask.Masks = Storage->ReadString("Masks", AsciiFileMask.Masks);
  271. FileNameCase = (TFileNameCase)Storage->ReadInteger("FileNameCase", FileNameCase);
  272. PreserveReadOnly = Storage->ReadBool("PreserveReadOnly", PreserveReadOnly);
  273. PreserveTime = Storage->ReadBool("PreserveTime", PreserveTime);
  274. PreserveRights = Storage->ReadBool("PreserveRights", PreserveRights);
  275. Rights.Text = Storage->ReadString("Text", Rights.Text);
  276. TransferMode = (TTransferMode)Storage->ReadInteger("TransferMode", TransferMode);
  277. ResumeSupport = (TResumeSupport)Storage->ReadInteger("ResumeSupport", ResumeSupport);
  278. ResumeThreshold = Storage->ReadInt64("ResumeThreshold", ResumeThreshold);
  279. ReplaceInvalidChars = Storage->ReadBool("ReplaceInvalidChars", ReplaceInvalidChars);
  280. LocalInvalidChars = Storage->ReadString("LocalInvalidChars", LocalInvalidChars);
  281. CalculateSize = Storage->ReadBool("CalculateSize", CalculateSize);
  282. ExcludeFileMask.Masks = Storage->ReadString("ExcludeFileMask", ExcludeFileMask.Masks);
  283. ClearArchive = Storage->ReadBool("ClearArchive", ClearArchive);
  284. }
  285. //---------------------------------------------------------------------------
  286. void __fastcall TCopyParamType::Save(THierarchicalStorage * Storage) const
  287. {
  288. Storage->WriteBool("AddXToDirectories", AddXToDirectories);
  289. Storage->WriteString("Masks", AsciiFileMask.Masks);
  290. Storage->WriteInteger("FileNameCase", FileNameCase);
  291. Storage->WriteBool("PreserveReadOnly", PreserveReadOnly);
  292. Storage->WriteBool("PreserveTime", PreserveTime);
  293. Storage->WriteBool("PreserveRights", PreserveRights);
  294. Storage->WriteString("Text", Rights.Text);
  295. Storage->WriteInteger("TransferMode", TransferMode);
  296. Storage->WriteInteger("ResumeSupport", ResumeSupport);
  297. Storage->WriteInt64("ResumeThreshold", ResumeThreshold);
  298. Storage->WriteBool("ReplaceInvalidChars", ReplaceInvalidChars);
  299. Storage->WriteString("LocalInvalidChars", LocalInvalidChars);
  300. Storage->WriteBool("CalculateSize", CalculateSize);
  301. Storage->WriteString("ExcludeFileMask", ExcludeFileMask.Masks);
  302. Storage->WriteBool("ClearArchive", ClearArchive);
  303. }
  304. //---------------------------------------------------------------------------
  305. #define C(Property) (Property == rhp.Property)
  306. bool __fastcall TCopyParamType::operator==(const TCopyParamType & rhp) const
  307. {
  308. return
  309. C(AddXToDirectories) &&
  310. C(AsciiFileMask) &&
  311. C(FileNameCase) &&
  312. C(PreserveReadOnly) &&
  313. C(PreserveTime) &&
  314. C(PreserveRights) &&
  315. C(Rights) &&
  316. C(TransferMode) &&
  317. C(ResumeSupport) &&
  318. C(ResumeThreshold) &&
  319. C(ReplaceInvalidChars) &&
  320. C(LocalInvalidChars) &&
  321. C(CalculateSize) &&
  322. C(ExcludeFileMask) &&
  323. C(NegativeExclude) &&
  324. C(ClearArchive) &&
  325. true;
  326. }
  327. #undef C
  328. //---------------------------------------------------------------------------