FileSystemInfo.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. //---------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include <Common.h>
  5. #include <Terminal.h>
  6. #include <VCLCommon.h>
  7. #include "WinInterface.h"
  8. #include "FileSystemInfo.h"
  9. #include "TextsWin.h"
  10. #include "GUITools.h"
  11. //---------------------------------------------------------------------
  12. #pragma link "XPThemes"
  13. #pragma link "HistoryComboBox"
  14. #pragma resource "*.dfm"
  15. //---------------------------------------------------------------------
  16. void __fastcall DoFileSystemInfoDialog(const TFileSystemInfo & FileSystemInfo,
  17. AnsiString SpaceAvailablePath, TGetSpaceAvailable OnGetSpaceAvailable)
  18. {
  19. TFileSystemInfoDialog * Dialog = new TFileSystemInfoDialog(Application,
  20. OnGetSpaceAvailable);
  21. try
  22. {
  23. Dialog->Execute(FileSystemInfo, SpaceAvailablePath);
  24. }
  25. __finally
  26. {
  27. delete Dialog;
  28. }
  29. }
  30. //---------------------------------------------------------------------
  31. __fastcall TFileSystemInfoDialog::TFileSystemInfoDialog(TComponent * AOwner,
  32. TGetSpaceAvailable OnGetSpaceAvailable)
  33. : TForm(AOwner)
  34. {
  35. UseSystemSettings(this);
  36. FOnGetSpaceAvailable = OnGetSpaceAvailable;
  37. FSpaceAvailableLoaded = false;
  38. FLastListItem = 0;
  39. InstallPathWordBreakProc(SpaceAvailablePathEdit);
  40. }
  41. //---------------------------------------------------------------------
  42. void __fastcall TFileSystemInfoDialog::Execute(const TFileSystemInfo & FileSystemInfo,
  43. AnsiString SpaceAvailablePath)
  44. {
  45. FFileSystemInfo = FileSystemInfo;
  46. SpaceAvailablePathEdit->Text = SpaceAvailablePath;
  47. UpdateControls();
  48. ShowModal();
  49. }
  50. //---------------------------------------------------------------------
  51. AnsiString __fastcall TFileSystemInfoDialog::CapabilityStr(TFSCapability Capability)
  52. {
  53. return BooleanToStr(FFileSystemInfo.IsCapable[Capability]);
  54. }
  55. //---------------------------------------------------------------------
  56. AnsiString __fastcall TFileSystemInfoDialog::CapabilityStr(TFSCapability Capability1,
  57. TFSCapability Capability2)
  58. {
  59. return FORMAT("%s/%s", (CapabilityStr(Capability1), CapabilityStr(Capability2)));
  60. }
  61. //---------------------------------------------------------------------
  62. AnsiString __fastcall TFileSystemInfoDialog::SpaceStr(__int64 Bytes)
  63. {
  64. AnsiString Result;
  65. if (Bytes == 0)
  66. {
  67. Result = LoadStr(FSINFO_BYTES_UNKNOWN);
  68. }
  69. else
  70. {
  71. Result = FormatBytes(Bytes);
  72. AnsiString SizeUnorderedStr = FormatBytes(Bytes, false);
  73. if (Result != SizeUnorderedStr)
  74. {
  75. Result = FORMAT("%s (%s)", (Result, SizeUnorderedStr));
  76. }
  77. }
  78. return Result;
  79. }
  80. //---------------------------------------------------------------------
  81. void __fastcall TFileSystemInfoDialog::Feed(TFeedFileSystemData AddItem)
  82. {
  83. AddItem(ServerView, FSINFO_SSH_VERSION, FORMAT("SSH-%d", (FFileSystemInfo.SshVersion)));
  84. AddItem(ServerView, FSINFO_SSH_IMPLEMENTATION, FFileSystemInfo.SshImplementation);
  85. AnsiString Str = CipherNames[FFileSystemInfo.CSCipher];
  86. if (FFileSystemInfo.CSCipher != FFileSystemInfo.SCCipher)
  87. {
  88. Str += FORMAT("/%s", (CipherNames[FFileSystemInfo.SCCipher]));
  89. }
  90. AddItem(ServerView, FSINFO_CIPHER, Str);
  91. Str = BooleanToStr(FFileSystemInfo.CSCompression != ctNone);
  92. if (FFileSystemInfo.CSCompression != FFileSystemInfo.SCCompression)
  93. {
  94. Str += FORMAT("/%s", (BooleanToStr(FFileSystemInfo.SCCompression != ctNone)));
  95. }
  96. AddItem(ServerView, FSINFO_COMPRESSION, Str);
  97. AddItem(ServerView, FSINFO_FS_PROTOCOL, FFileSystemInfo.ProtocolName);
  98. AddItem(HostKeyFingerprintEdit, 0, FFileSystemInfo.HostKeyFingerprint);
  99. AddItem(ProtocolView, FSINFO_MODE_CHANGING, CapabilityStr(fcModeChanging));
  100. AddItem(ProtocolView, FSINFO_OWNER_GROUP_CHANGING, CapabilityStr(fcGroupChanging));
  101. AddItem(ProtocolView, FSINFO_ANY_COMMAND, CapabilityStr(fcAnyCommand));
  102. AddItem(ProtocolView, FSINFO_SYMBOLIC_HARD_LINK, CapabilityStr(fcSymbolicLink, fcHardLink));
  103. AddItem(ProtocolView, FSINFO_USER_GROUP_LISTING, CapabilityStr(fcUserGroupListing));
  104. AddItem(ProtocolView, FSINFO_REMOTE_COPY, CapabilityStr(fcRemoteCopy));
  105. AddItem(ProtocolView, FSINFO_CHECKING_SPACE_AVAILABLE, CapabilityStr(fcCheckingSpaceAvailable));
  106. AddItem(ProtocolView, FSINFO_NATIVE_TEXT_MODE, CapabilityStr(fcNativeTextMode));
  107. AddItem(InfoMemo, 0, FFileSystemInfo.AdditionalInfo);
  108. AddItem(SpaceAvailableView, FSINFO_BYTES_ON_DEVICE, SpaceStr(FSpaceAvailable.BytesOnDevice));
  109. AddItem(SpaceAvailableView, FSINFO_UNUSED_BYTES_ON_DEVICE, SpaceStr(FSpaceAvailable.UnusedBytesOnDevice));
  110. AddItem(SpaceAvailableView, FSINFO_BYTES_AVAILABLE_TO_USER, SpaceStr(FSpaceAvailable.BytesAvailableToUser));
  111. AddItem(SpaceAvailableView, FSINFO_UNUSED_BYTES_AVAILABLE_TO_USER, SpaceStr(FSpaceAvailable.UnusedBytesAvailableToUser));
  112. AddItem(SpaceAvailableView, FSINFO_BYTES_PER_ALLOCATION_UNIT, SpaceStr(FSpaceAvailable.BytesPerAllocationUnit));
  113. }
  114. //---------------------------------------------------------------------
  115. void __fastcall TFileSystemInfoDialog::ControlsAddItem(TControl * Control,
  116. int Label, AnsiString Value)
  117. {
  118. if (FLastFeededControl != Control)
  119. {
  120. FLastFeededControl = Control;
  121. FLastListItem = 0;
  122. }
  123. if (Control == HostKeyFingerprintEdit)
  124. {
  125. HostKeyFingerprintEdit->Text = Value;
  126. }
  127. else if (Control == InfoMemo)
  128. {
  129. InfoMemo->Lines->Text = Value;
  130. }
  131. else
  132. {
  133. TListView * ListView = dynamic_cast<TListView *>(Control);
  134. assert(ListView != NULL);
  135. TListItem * Item;
  136. if (ListView->Items->Count > FLastListItem)
  137. {
  138. Item = ListView->Items->Item[FLastListItem];
  139. }
  140. else
  141. {
  142. Item = ListView->Items->Add();
  143. }
  144. FLastListItem++;
  145. Item->Caption = LoadStr(Label);
  146. if (Item->SubItems->Count > 0)
  147. {
  148. Item->SubItems->Strings[0] = Value;
  149. }
  150. else
  151. {
  152. Item->SubItems->Add(Value);
  153. }
  154. }
  155. }
  156. //---------------------------------------------------------------------
  157. void __fastcall TFileSystemInfoDialog::FeedControls()
  158. {
  159. FLastFeededControl = NULL;
  160. Feed(ControlsAddItem);
  161. }
  162. //---------------------------------------------------------------------
  163. void __fastcall TFileSystemInfoDialog::UpdateControls()
  164. {
  165. EnableControl(SpaceAvailableSheet, SpaceAvailableSupported());
  166. EnableControl(SpaceAvailableButton, SpaceAvailableSheet->Enabled &&
  167. !SpaceAvailablePathEdit->Text.IsEmpty());
  168. }
  169. //---------------------------------------------------------------------
  170. void __fastcall TFileSystemInfoDialog::HelpButtonClick(TObject * /*Sender*/)
  171. {
  172. FormHelp(this);
  173. }
  174. //---------------------------------------------------------------------
  175. void __fastcall TFileSystemInfoDialog::ClipboardAddItem(TControl * Control,
  176. int Label, AnsiString Value)
  177. {
  178. if (Control->Enabled)
  179. {
  180. if (FLastFeededControl != Control)
  181. {
  182. if (FLastFeededControl != NULL)
  183. {
  184. FClipboard += AnsiString::StringOfChar('-', 60) + "\r\n";
  185. }
  186. FLastFeededControl = Control;
  187. }
  188. if (dynamic_cast<TListView *>(Control) == NULL)
  189. {
  190. TXPGroupBox * Group = dynamic_cast<TXPGroupBox *>(Control->Parent);
  191. assert(Group != NULL);
  192. if ((Value.Length() >= 2) && (Value.SubString(Value.Length() - 1, 2) == "\r\n"))
  193. {
  194. Value.SetLength(Value.Length() - 2);
  195. }
  196. FClipboard += FORMAT("%s\r\n%s\r\n", (Group->Caption, Value));
  197. }
  198. else
  199. {
  200. assert(dynamic_cast<TListView *>(Control) != NULL);
  201. FClipboard += FORMAT("%s = %s\r\n", (LoadStr(Label), Value));
  202. }
  203. }
  204. }
  205. //---------------------------------------------------------------------------
  206. void __fastcall TFileSystemInfoDialog::ClipboardButtonClick(
  207. TObject * /*Sender*/)
  208. {
  209. NeedSpaceAvailable();
  210. FLastFeededControl = NULL;
  211. FClipboard = "";
  212. Feed(ClipboardAddItem);
  213. CopyToClipboard(FClipboard);
  214. }
  215. //---------------------------------------------------------------------------
  216. void __fastcall TFileSystemInfoDialog::CopyClick(TObject * /*Sender*/)
  217. {
  218. TListView * ListView = dynamic_cast<TListView *>(ListViewMenu->PopupComponent);
  219. assert(ListView != NULL);
  220. AnsiString Text;
  221. for (int Index = 0; Index < ListView->Items->Count; Index++)
  222. {
  223. TListItem * Item = ListView->Items->Item[Index];
  224. if (Item->Selected)
  225. {
  226. Text += FORMAT("%s = %s\r\n", (Item->Caption, Item->SubItems->Strings[0]));
  227. }
  228. }
  229. CopyToClipboard(Text);
  230. }
  231. //---------------------------------------------------------------------------
  232. void __fastcall TFileSystemInfoDialog::FormShow(TObject * /*Sender*/)
  233. {
  234. PageControl->ActivePage = SshSheet;
  235. FeedControls();
  236. }
  237. //---------------------------------------------------------------------------
  238. void __fastcall TFileSystemInfoDialog::SpaceAvailableButtonClick(
  239. TObject * /*Sender*/)
  240. {
  241. CheckSpaceAvailable();
  242. }
  243. //---------------------------------------------------------------------------
  244. void __fastcall TFileSystemInfoDialog::CheckSpaceAvailable()
  245. {
  246. assert(FOnGetSpaceAvailable != NULL);
  247. assert(!SpaceAvailablePathEdit->Text.IsEmpty());
  248. FSpaceAvailableLoaded = true;
  249. bool DoClose = false;
  250. try
  251. {
  252. FOnGetSpaceAvailable(SpaceAvailablePathEdit->Text, FSpaceAvailable, DoClose);
  253. }
  254. __finally
  255. {
  256. FeedControls();
  257. if (DoClose)
  258. {
  259. Close();
  260. }
  261. }
  262. }
  263. //---------------------------------------------------------------------------
  264. void __fastcall TFileSystemInfoDialog::NeedSpaceAvailable()
  265. {
  266. if (!FSpaceAvailableLoaded && SpaceAvailableSupported())
  267. {
  268. CheckSpaceAvailable();
  269. }
  270. }
  271. //---------------------------------------------------------------------------
  272. bool __fastcall TFileSystemInfoDialog::SpaceAvailableSupported()
  273. {
  274. return (FOnGetSpaceAvailable != NULL);
  275. }
  276. //---------------------------------------------------------------------------
  277. void __fastcall TFileSystemInfoDialog::PageControlChange(TObject * /*Sender*/)
  278. {
  279. if (PageControl->ActivePage == SpaceAvailableSheet)
  280. {
  281. NeedSpaceAvailable();
  282. }
  283. }
  284. //---------------------------------------------------------------------------
  285. void __fastcall TFileSystemInfoDialog::ControlChange(TObject * /*Sender*/)
  286. {
  287. UpdateControls();
  288. }
  289. //---------------------------------------------------------------------------