⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 splitter.cpp

📁 LINUX 下, 以 QT/KDE 写的档案管理员
💻 CPP
字号:
/***************************************************************************                          splitter.cpp  -  description                             -------------------    copyright            : (C) 2003 by Csaba Karai    e-mail               : krusader@users.sourceforge.net    web site             : http://krusader.sourceforge.net ---------------------------------------------------------------------------  Description ***************************************************************************  A     db   dD d8888b. db    db .d8888.  .d8b.  d8888b. d88888b d8888b.     88 ,8P' 88  `8D 88    88 88'  YP d8' `8b 88  `8D 88'     88  `8D     88,8P   88oobY' 88    88 `8bo.   88ooo88 88   88 88ooooo 88oobY'     88`8b   88`8b   88    88   `Y8b. 88~~~88 88   88 88~~~~~ 88`8b     88 `88. 88 `88. 88b  d88 db   8D 88   88 88  .8D 88.     88 `88.     YP   YD 88   YD ~Y8888P' `8888Y' YP   YP Y8888D' Y88888P 88   YD                                                     S o u r c e    F i l e *************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#include "splitter.h"#include "../VFS/vfs.h"#include <qlayout.h>#include <klocale.h>#include <kmessagebox.h>#include <kio/job.h>#include <kfileitem.h>#include <qfileinfo.h>    Splitter::Splitter( QWidget* parent,  KURL fileNameIn, KURL destinationDirIn ) :  QProgressDialog( parent, "Krusader::Splitter", true, 0 ), splitSize( 0 ){  fileName = fileNameIn;  destinationDir = destinationDirIn;  crcContext = new CRC32();    setTotalSteps( 100 );  setAutoClose( false );  /* don't close or reset the dialog automatically */  setAutoReset( false );}Splitter::~Splitter(){  splitAbortJobs();  delete crcContext;}void Splitter::split( KIO::filesize_t splitSizeIn ){  KFileItem file(KFileItem::Unknown, KFileItem::Unknown, fileName );  file.refresh();  permissions = file.permissions() | QFileInfo::WriteUser;    splitSize = splitSizeIn;  setCaption( i18n("Krusader::Splitting...") );  setLabelText( i18n("Splitting the file %1...").arg( vfs::pathOrURL( fileName ) ) );  if( file.isDir() )  {    KMessageBox::error(0, i18n("Can't split a directory!"));    return;  }    fileSize = 0;  fileNumber = 0;  splitReadJob = KIO::get( fileName, false, false );      connect(splitReadJob, SIGNAL(data(KIO::Job *, const QByteArray &)),                        this, SLOT(splitDataReceived(KIO::Job *, const QByteArray &)));  connect(splitReadJob, SIGNAL(result(KIO::Job*)),                        this, SLOT(splitReceiveFinished(KIO::Job *)));  connect(splitReadJob, SIGNAL(percent (KIO::Job *, unsigned long)),                        this, SLOT(splitReceivePercent(KIO::Job *, unsigned long)));  splitWriteJob = 0;  noValidWriteJob = true;  exec();}void Splitter::splitDataReceived(KIO::Job *, const QByteArray &byteArray){  if( byteArray.size() == 0 )    return;  crcContext->update( (unsigned char *)byteArray.data(), byteArray.size() );    fileSize += byteArray.size();  if( noValidWriteJob )    splitCreateWriteJob();  transferArray = byteArray.copy();  if(splitWriteJob)  {    splitReadJob->suspend();    /* start writing */    splitWriteJob->resume();  }}void Splitter::splitReceiveFinished(KIO::Job *job){  splitReadJob = 0;   /* KIO automatically deletes the object after Finished signal */    if( splitWriteJob )        /* write out the end of the file */    splitWriteJob->resume();  if( job->error() )    /* any error occurred? */  {    splitAbortJobs();    KMessageBox::error(0, i18n("Error reading file %1!").arg( vfs::pathOrURL( fileName ) ) );    emit reject();    return;  }  QString crcResult = QString( "%1" ).arg( crcContext->result(), 0, 16 ).upper().stripWhiteSpace()                                     .rightJustify(8, '0');  splitFile = QString( "filename=%1\n" ).arg( fileName.fileName()     )+              QString( "size=%1\n" )    .arg( KIO::number( fileSize ) )+              QString( "crc32=%1\n" )   .arg( crcResult );}void Splitter::splitReceivePercent (KIO::Job *, unsigned long percent){  setProgress( percent );}void Splitter::splitCreateWriteJob(){  QString index( "%1" );                   /* making the splitted filename */  index = index.arg(++fileNumber).rightJustify( 3, '0' );  QString outFileName = fileName.fileName() + "." + index;    writeURL = destinationDir;  writeURL.addPath( outFileName );      /* creating a write job */  splitWriteJob = KIO::put( writeURL, permissions, true, false, false );  outputFileSize = 0;  connect(splitWriteJob, SIGNAL(dataReq(KIO::Job *, QByteArray &)),                         this, SLOT(splitDataSend(KIO::Job *, QByteArray &)));  connect(splitWriteJob, SIGNAL(result(KIO::Job*)),                         this, SLOT(splitSendFinished(KIO::Job *)));  noValidWriteJob = false;}void Splitter::splitDataSend(KIO::Job *, QByteArray &byteArray){  int bufferLen = transferArray.size();  if( noValidWriteJob )      /* splitted file should be closed ? */  {    byteArray = QByteArray();  /* giving empty buffer which indicates closing */  }  else if( outputFileSize + bufferLen > splitSize ) /* maximum length reached? */  {    int shortLen = splitSize - outputFileSize;        byteArray.duplicate( transferArray.data(), shortLen );    transferArray.duplicate( transferArray.data() + shortLen, bufferLen - shortLen );        noValidWriteJob = true;   /* close the current segment */  }  else  {    outputFileSize += bufferLen;  /* write the whole buffer out to the split file */    byteArray = transferArray;    transferArray = QByteArray();      if(splitReadJob)    {      splitReadJob->resume();    /* start reading */      splitWriteJob->suspend();    }  }}void Splitter::splitSendFinished(KIO::Job *job){  splitWriteJob = 0;  /* KIO automatically deletes the object after Finished signal */  if( job->error() )    /* any error occurred? */  {    splitAbortJobs();    KMessageBox::error(0, i18n("Error writing file %1!").arg( vfs::pathOrURL( writeURL ) ) );    emit reject();    return;  }    if( transferArray.size() ) /* any data remained in the transfer buffer? */    splitCreateWriteJob();      /* create a new write job */  else  {      /* writing the split information file out */    writeURL      = destinationDir;    writeURL.addPath( fileName.fileName() + ".crc" );    splitWriteJob = KIO::put( writeURL, permissions, true, false, false );    connect(splitWriteJob, SIGNAL(dataReq(KIO::Job *, QByteArray &)),                           this, SLOT(splitFileSend(KIO::Job *, QByteArray &)));    connect(splitWriteJob, SIGNAL(result(KIO::Job*)),                           this, SLOT(splitFileFinished(KIO::Job *)));  }}void Splitter::splitAbortJobs(){  if( splitReadJob )    splitReadJob->kill();  if( splitWriteJob )    splitWriteJob->kill();  splitReadJob = splitWriteJob = 0;}void Splitter::splitFileSend(KIO::Job *, QByteArray &byteArray){  const char *content = splitFile.ascii();  byteArray.duplicate( content, strlen ( content ) );  splitFile = "";}void Splitter::splitFileFinished(KIO::Job *job){  splitWriteJob = 0;  /* KIO automatically deletes the object after Finished signal */  if( job->error() )    /* any error occurred? */  {    KMessageBox::error(0, i18n("Error at writing file %1!").arg( vfs::pathOrURL( writeURL ) ) );    emit reject();    return;  }  emit accept();}#include "splitter.moc"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -