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 + -
显示快捷键?