// Read API int clSocketBase::Read(wxMemoryBuffer& content, long timeout) throw(clSocketException) { content.Clear(); char buffer[4096]; timeout = (timeout * 1000); // convert to MS while(true && timeout) { int rc = SelectReadMS(10); timeout -= 10; if(rc == kSuccess) { memset(buffer, 0x0, sizeof(buffer)); int bytesRead = recv(m_socket, buffer, sizeof(buffer), 0); if(bytesRead < 0) { // Error throw clSocketException("Read failed: " + error()); } else if(bytesRead == 0) { // connection closed return kError; } else { content.AppendData(buffer, bytesRead); continue; } } else { if(content.IsEmpty()) continue; // keep waiting until time ends else return kSuccess; // we already read our content } } return kTimeout; }
void clSFTP::Read(const wxString& remotePath, wxMemoryBuffer& buffer) throw(clException) { if(!m_sftp) { throw clException("SFTP is not initialized"); } sftp_file file = sftp_open(m_sftp, remotePath.mb_str(wxConvUTF8).data(), O_RDONLY, 0); if(file == NULL) { throw clException(wxString() << _("Failed to open remote file: ") << remotePath << ". " << ssh_get_error(m_ssh->GetSession()), sftp_get_error(m_sftp)); } SFTPAttribute::Ptr_t fileAttr = Stat(remotePath); if(!fileAttr) { throw clException(wxString() << _("Could not stat file:") << remotePath << ". " << ssh_get_error(m_ssh->GetSession()), sftp_get_error(m_sftp)); } wxInt64 fileSize = fileAttr->GetSize(); if(fileSize == 0) return; // Allocate buffer for the file content char pBuffer[65536]; // buffer // Read the entire file content wxInt64 bytesLeft = fileSize; wxInt64 bytesRead = 0; while(bytesLeft > 0) { wxInt64 nbytes = sftp_read(file, pBuffer, sizeof(pBuffer)); bytesRead += nbytes; bytesLeft -= nbytes; buffer.AppendData(pBuffer, nbytes); } if(bytesRead != fileSize) { sftp_close(file); buffer.Clear(); throw clException(wxString() << _("Could not read file:") << remotePath << ". " << ssh_get_error(m_ssh->GetSession()), sftp_get_error(m_sftp)); } sftp_close(file); }