Brief description of class still missing. More...
#include <Tar.h>
Public Member Functions | |
| bool | addFile (QString fileName, const QByteArray &data) |
| void | close () |
| bool | file (const QString fileName, QByteArray &data) |
| QString | fileName () const |
| bool | nextFile (QString &fileName, QByteArray &data, bool cache=false) |
| bool | open (QString file, QIODevice::OpenMode m) |
| bool | rewind () |
| Tar () | |
| ~Tar () | |
Brief description of class still missing.
Full description of class still missing
| bool QGpCoreTools::Tar::addFile | ( | QString | fileName, |
| const QByteArray & | data | ||
| ) |
Add data with fileName in tar archive
References QGpCoreTools::endl(), QGpCoreTools::App::stream(), QGpCoreTools::tr(), and TRACE.
Referenced by QGpCoreTools::XMLTarStream::addFile(), and QGpCoreTools::XMLTarStream::addXmlFile().
{
TRACE;
int nameLen=fileName.count();
if(nameLen>100) {
App::stream() << tr("File names greater than 99 charaters are currently not supported") << endl;
return false;
}
if(nameLen<100) nameLen++;
TarHeader fh;
memset((char *) &fh, 0, 512); // initialize a blank header block
memcpy(fh.name, fileName.toAscii().data(), nameLen);
memcpy(fh.mode,"0000644", 8);// default permissions -rw-r--r--
memcpy(fh.uid,"0001750", 8); // default user uid 1000
memcpy(fh.gid,"0000144", 8); // default group gid 100
// Maximum size of a QByteArray is less than maximum size of file in tar file 777 7777 7777 in octal > 0x7FFFFFFF
memcpy(fh.size, int2octal(data.size()), 12);
// Modification time
memcpy(fh.mtime, int2octal(QDateTime::currentDateTime().toTime_t()), 12);
memcpy(fh.chksum," ", 8); // blank checksum
fh.typeflag='0'; // regular file
// ignore link name
memcpy(fh.magic,"ustar ",8); // magic tag
memcpy(fh.uname,"username",9);
memcpy(fh.gname,"users",6);
// Computing checksum
checksum(fh);
// max checksum is 0x1FFFF, hence 377777 in octal
memcpy(fh.chksum, int2octal(checksum(fh))+5, 7);
// header block is ready to send to stream
if(!writeBlock((char *) &fh)) return false;
const char * dataPtr=data.data();
const char * endDataPtr=dataPtr+data.size()-512;
while(dataPtr<endDataPtr) {
if(!writeBlock(dataPtr)) return false;
dataPtr+=512;
}
endDataPtr+=512;
static char buffer[512];
memset(buffer, 0, 512); // initialize a blank block
memcpy(buffer, dataPtr, endDataPtr-dataPtr);
if(!writeBlock(buffer)) return false;
return true;
}
| void QGpCoreTools::Tar::close | ( | ) |
Description of destructor still missing
References TRACE.
Referenced by ~Tar().
{
TRACE;
if(_f) {
// Terminate the tar file with two blank blocks
if(_mode==QIODevice::WriteOnly) {
char buffer[512];
memset(buffer, 0, 512); // initialize a blank block
writeBlock(buffer);
writeBlock(buffer);
}
gzclose(_f);
_f=0;
}
}
| bool QGpCoreTools::Tar::file | ( | const QString | fileName, |
| QByteArray & | data | ||
| ) |
Random access to file in an efficient way with cache to avoid useless and expensive unzip operations
References nextFile(), and TRACE.
Referenced by QGpCoreTools::XMLTarStream::file(), and open().
{
TRACE;
// Check if file available in cache
if(_cachedFiles.contains(fileName)) {
data= *_cachedFiles.object(fileName);
return true;
}
QString readFileName;
if(_fileOffsets.contains(fileName)) { /* file already read but removed from cache
go directly to right position
this might happen only for very big archives
*/
gzseek(_f, _fileOffsets.value(fileName), SEEK_SET);
if(nextFile(readFileName, data, true)) {
return (readFileName==fileName);
} else {
return false;
}
}
// search for correct header block, matching fileName
while(fileName!= readFileName) {
if(!nextFile(readFileName, data, true)) return false;
}
return true;
}
| QString QGpCoreTools::Tar::fileName | ( | ) | const [inline] |
{return _fileName;}
| bool QGpCoreTools::Tar::nextFile | ( | QString & | fileName, |
| QByteArray & | data, | ||
| bool | cache = false |
||
| ) |
Extract data with fileName in tar archive. Files are read sequentially without using cache if cache is false
References QGpCoreTools::TarHeader::name, and TRACE.
Referenced by file().
{
TRACE;
z_off_t offset=gztell (_f);
// read header block
TarHeader fh;
if( !readBlock((char *) &fh)) return false;
fileName=fh.name;
if(fileName.isEmpty()) { // probably end of tar archive
return false;
}
// Read blocks of data
if(readFile (fh, data)) {
if(cache) {
_cachedFiles.insert(fileName, new QByteArray(data), data.size());
_fileOffsets.insert(fileName, offset);
}
return true;
} else return false;
}
| bool QGpCoreTools::Tar::open | ( | QString | file, |
| QIODevice::OpenMode | m | ||
| ) |
Open a compressed gz file or uncompressed (automatically detected by zlib)
Accepted modes are QIODevice::ReadOnly and QIODevice::WriteOnly. When creating the file, it is always compressed, but on reading, it may be compressed or not.
References QGpCoreTools::endl(), file(), QGpCoreTools::App::stream(), QGpCoreTools::tr(), and TRACE.
Referenced by QGpCoreTools::XMLTarStream::open().
| bool QGpCoreTools::Tar::rewind | ( | ) |