mainform.cpp
来自「著名的SecureBlackBox控件完整源码」· C++ 代码 · 共 733 行 · 第 1/2 页
CPP
733 行
{
Form2->Gauge1->Progress = 100 * CurrentFileOffset % CurrentFileSize;
WriteNextBlockToFile();
}
else if (State == STATE_CLOSE_HANDLE)
{
// CloseFile(CurrentFile);
delete CurrentFile;
CurrentFile = NULL;
BuildFileList(CurrentDir);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::HandleSftpDirectoryListing(TObject* Sender, TList* Listing)
{
if (State == STATE_READ_DIRECTORY_SENT)
{
for (int i = 0; i< Listing->Count; i++)
{
TElSftpFileInfo* FileInfo = new TElSftpFileInfo;
TElSftpFileInfo* p = ((TElSftpFileInfo*)(Listing->Items[i]));
p->CopyTo(FileInfo);
CurrentFileList->Add(FileInfo);
}
SftpClient->ReadDirectory(CurrentHandle);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::HandleSftpData(TObject* Sender, void* Buffer, int Size)
{
if (State == STATE_DOWNLOAD_RECEIVE)
{
// BlockWrite(CurrentFile, Buffer, Size);
CurrentFile->Write(Buffer, Size);
CurrentFileOffset+=Size;
if (CurrentFileOffset >= CurrentFileSize)
{
Form2->Close();
Log("File received");
// CloseFile(CurrentFile);
delete CurrentFile;
CurrentFile = NULL;
CloseCurrentHandle();
}
else
{
SftpClient->Read(CurrentHandle, CurrentFileOffset, FILE_BLOCK_SIZE);
Form2->Gauge1->Progress = 100 * CurrentFileOffset % CurrentFileSize;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::HandleSftpAbsolutePath(TObject* Sender, const AnsiString Path)
{
CurrentDir = Path;
BuildFileList(CurrentDir);
EditPath->Text = Path;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::HandleSftpFileAttributes(TObject* Sender, TElSftpFileAttributes* Attributes)
{
TElSftpFileInfo* Info = ((TElSftpFileInfo*)(CurrentFileList->Items[StringGrid1->Row - 1]));
if (Attributes->IncludedAttributes.Contains(saSize))
Info->Attributes->Size = Attributes->Size;
if (Attributes->IncludedAttributes.Contains(saUID))
Info->Attributes->UID = Attributes->UID;
if (Attributes->IncludedAttributes.Contains(saGID))
Info->Attributes->GID = Attributes->GID;
if (Attributes->IncludedAttributes.Contains(saATime))
Info->Attributes->ATime = Attributes->ATime;
if (Attributes->IncludedAttributes.Contains(saMTime))
Info->Attributes->MTime = Attributes->MTime;
Info->Attributes->Directory = Attributes->Directory;
if (Attributes->IncludedAttributes.Contains(saPermissions))
{
Info->Attributes->UserRead = Attributes->UserRead;
Info->Attributes->UserWrite = Attributes->UserWrite;
Info->Attributes->UserExecute = Attributes->UserExecute;
Info->Attributes->GroupRead = Attributes->GroupRead;
Info->Attributes->GroupWrite = Attributes->GroupWrite;
Info->Attributes->GroupExecute = Attributes->GroupExecute;
Info->Attributes->OtherRead = Attributes->OtherRead;
Info->Attributes->OtherWrite = Attributes->OtherWrite;
Info->Attributes->OtherExecute = Attributes->OtherExecute;
}
SetCellInfo(StringGrid1->Row - 1, Info);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClearFileList(void)
{
for (int i = 0; i< CurrentFileList->Count; i++)
delete ((TElSftpFileInfo*)(CurrentFileList->Items[i]));
CurrentFileList->Clear();
}
//---------------------------------------------------------------------------
void TForm1::Log(AnsiString S)
{
Memo1->Lines->Add((AnsiString)Now() + " " + S);
}
//---------------------------------------------------------------------------
void TForm1::ChangeDir(AnsiString Dir)
{
Log((AnsiString)"Trying to change directory to \"" + Dir + "\"");
RelDir = Dir;
SftpClient->OpenDirectory(CurrentDir + "/" + Dir);
State = STATE_CHANGE_DIR;
}
//---------------------------------------------------------------------------
void TForm1::MakeDir(AnsiString Dir)
{
if (!scktClient->Active)
{
Log("Error: not connected");
return;
}
Log((AnsiString)"Creating directory \"" + Dir + "\"");
TElSftpFileAttributes* Attrs = new TElSftpFileAttributes;
Attrs->IncludedAttributes = TSBSftpAttributes();
SftpClient->MakeDirectory(CurrentDir + "/" + Dir, Attrs);
State = STATE_MAKE_DIR;
delete Attrs;
}
//---------------------------------------------------------------------------
void TForm1::DeleteDir(AnsiString Name)
{
if (!scktClient->Active)
{
Log("Error: not connected");
return;
}
Log((AnsiString)"Removing directory \"" + Name + "\"");
SftpClient->SftpRemoveDirectory(CurrentDir + "/" + Name);
State = STATE_REMOVE;
}
//---------------------------------------------------------------------------
void TForm1::DownloadFile(TElSftpFileInfo* Info, AnsiString LocalName)
{
if (!scktClient->Active)
{
Log("Error: not connected");
return;
}
Log((AnsiString)"Starting file download, \"" + Info->Name + "\"");
// AssignFile(CurrentFile, LocalName);
// Rewrite(CurrentFile, 1);
CurrentFile = new TFileStream(LocalName, Classes::fmCreate | fmOpenWrite);
CurrentFileOffset = 0;
CurrentFileSize = Info->Attributes->Size;
SftpClient->OpenFile(CurrentDir + "/" + Info->Name, TSBSftpFileOpenModes()<<fmRead, NULL);
State = STATE_DOWNLOAD_OPEN;
}
//---------------------------------------------------------------------------
void TForm1::UploadFile(AnsiString LocalFile)
{
if (!scktClient->Active)
{
Log("Error: not connected");
return;
}
Log((AnsiString)"Starting file upload, \"" + LocalFile + "\"");
AnsiString FName = Sbutils::ExtractFileName(LocalFile);
// AssignFile(CurrentFile, LocalFile);
// Reset(CurrentFile, 1);
CurrentFile = new TFileStream(LocalFile, Classes::fmCreate);
CurrentFileOffset = 0;
// CurrentFileSize = FileSize(CurrentFile);
CurrentFileSize = CurrentFile->Size;
SftpClient->SftpCreateFile(CurrentDir + "/" + FName);
State = STATE_UPLOAD_OPEN;
}
//---------------------------------------------------------------------------
void TForm1::BuildFileList(AnsiString Path)
{
if (!scktClient->Active)
{
Log("Error: not connected");
return;
}
ClearFileList();
Log((AnsiString)"Opening directory " + Path);
SftpClient->OpenDirectory(Path);
State = STATE_OPEN_DIRECTORY_SENT;
}
//---------------------------------------------------------------------------
void TForm1::WriteNextBlockToFile(void)
{
char Buf[FILE_BLOCK_SIZE];
int Transferred;
if (!scktClient->Active)
{
Log("Error: not connected");
return;
}
if (CurrentFileOffset >= CurrentFileSize)
{
State = STATE_CLOSE_HANDLE;
Form2->Close();
CloseCurrentHandle();
return;
}
// BlockRead(CurrentFile, &Buf, FILE_BLOCK_SIZE, Transferred);
Transferred = CurrentFile->Write(Buf, FILE_BLOCK_SIZE);
SftpClient->Write(CurrentHandle, CurrentFileOffset, &Buf, Transferred);
CurrentFileOffset += Transferred;
}
//---------------------------------------------------------------------------
void TForm1::CloseCurrentHandle(void)
{
if (!scktClient->Active)
{
Log("Error: not connected");
return;
}
Log("Closing active handle");
SftpClient->CloseHandle(CurrentHandle);
}
//---------------------------------------------------------------------------
void TForm1::OutputFileList(void)
{
StringGrid1->Cells[0][0] = "Name";
StringGrid1->Cells[1][0] = "Size";
StringGrid1->Cells[2][0] = "Permissions";
StringGrid1->RowCount = CurrentFileList->Count + 1;
for (int i = 0; i<CurrentFileList->Count; i++)
{
StringGrid1->Cells[0][i + 1] = ((TElSftpFileInfo*)(CurrentFileList->Items[i]))->Name;
StringGrid1->Cells[1][i + 1] = IntToStr(((TElSftpFileInfo*)(CurrentFileList->Items[i]))->Attributes->Size);
StringGrid1->Cells[2][i + 1] = WritePermissions(((TElSftpFileInfo*)(CurrentFileList->Items[i]))->Attributes);
}
}
//---------------------------------------------------------------------------
void TForm1::RequestAbsolutePath(AnsiString Path)
{
SftpClient->RequestAbsolutePath(Path);
}
//---------------------------------------------------------------------------
AnsiString TForm1::WritePermissions(TElSftpFileAttributes* Attributes)
{
AnsiString Result = "";
if (Attributes->Directory)
Result = Result + "d";
if (Attributes->UserRead)
Result = Result + "r";
else
Result = Result + "-";
if (Attributes->UserWrite)
Result = Result + "w";
else
Result = Result + "-";
if (Attributes->UserExecute)
Result = Result + "x";
else
Result = Result + "-";
if (Attributes->GroupRead)
Result = Result + "r";
else
Result = Result + "-";
if (Attributes->GroupWrite)
Result = Result + "w";
else
Result = Result + "-";
if (Attributes->GroupExecute)
Result = Result + "x";
else
Result = Result + "-";
if (Attributes->OtherRead)
Result = Result + "r";
else
Result = Result + "-";
if (Attributes->OtherWrite)
Result = Result + "w";
else
Result = Result + "-";
if (Attributes->OtherExecute)
Result = Result + "x";
else
Result = Result + "-";
return Result;
}
//---------------------------------------------------------------------------
void TForm1::RenameFile(AnsiString OldName, AnsiString NewName)
{
if (!scktClient->Active)
{
Log("Error: not connected");
return;
}
Log((AnsiString)"Renaming \"" + OldName + "\" to \"" + NewName + "\"");
SftpClient->RenameFile(CurrentDir + "/" + OldName, CurrentDir + "/" + NewName);
State = STATE_RENAME;
}
//---------------------------------------------------------------------------
void TForm1::DeleteFile(AnsiString Name)
{
if (!scktClient->Active)
{
Log("Error: not connected");
return;
}
Log((AnsiString)"Removing file \"" + Name + "\"");
SftpClient->RemoveFile(CurrentDir + "/" + Name);
State = STATE_REMOVE;
}
//---------------------------------------------------------------------------
AnsiString TForm1::FormatPath(AnsiString Path)
{
TStringList* Lst = new TStringList;
int Ind = Path.Pos("/");
while (Ind > 0)
{
Lst->Add(Path.SubString(1 ,Ind - 1));
Path = Path.SubString(Ind + 1, Path.Length());
Ind = Path.Pos("/");
}
Lst->Add(Path);
if (Lst->Count > 2)
{
if ((Lst->Strings[Lst->Count - 1] == "..") && (Lst->Strings[Lst->Count - 2] != ".."))
{
Lst->Delete(Lst->Count - 1);
Lst->Delete(Lst->Count - 1);
}
}
AnsiString Result = "";
for (int i = 0; i<Lst->Count; i++)
Result = Result + Lst->Strings[i] + "//";
if (Result.Length() > 1)
Result = Result.SubString(1, Result.Length() - 1);
delete Lst;
return Result;
}
//---------------------------------------------------------------------------
void TForm1::SetCellInfo(int Index, TElSftpFileInfo* Info)
{
StringGrid1->Cells[0][Index + 1] = Info->Name;
StringGrid1->Cells[1][Index + 1] = IntToStr(Info->Attributes->Size);
StringGrid1->Cells[2][Index + 1] = WritePermissions(Info->Attributes);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::HandleSSHClientKeyValidate(TObject* Sender, TElSSHKey* ServerKey, bool &Validate)
{
AnsiString AlgLine;
if (ServerKey->Algorithm == ALGORITHM_RSA)
AlgLine = "RSA";
else if (ServerKey->Algorithm == ALGORITHM_DSS)
AlgLine = "DSS";
else
AlgLine = "unknown";
AnsiString s;
s = s.sprintf("Server key received (%s). Fingerprint is %s",AlgLine, BeautifyBinaryString(DigestToStr(ServerKey->FingerprintMD5, false), ':'));
Log(s);
Validate = true;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?