//============================================================================= // // File : KviFile.cpp // Creation date : Mon Dec 17 2001 00:04:12 by Szymon Stefanek // // This file is part of the KVIrc IRC client distribution // Copyright (C) 2001-2010 Szymon Stefanek (pragma at kvirc dot net) // Copyright (C) 2010 Elvio Basello (hell at hellvis69 dot netsons dot org) // // 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. // // This program is distributed in the HOPE that it will be USEFUL, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, write to the Free Software Foundation, // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // //============================================================================= #include "KviFile.h" #include "KviByteOrder.h" #include "KviCString.h" #include KviFile::KviFile() : QFile() { } KviFile::KviFile(const QString & szName) : QFile(szName) { } KviFile::~KviFile() = default; bool KviFile::save(kvi_u8_t t) { return (write((const char *)(&t), sizeof(kvi_u8_t)) == sizeof(kvi_u8_t)); } bool KviFile::save(kvi_u16_t t) { #ifndef LOCAL_CPU_LITTLE_ENDIAN t = KviByteOrder::localCpuToLittleEndian16(t); #endif return (write((const char *)(&t), sizeof(kvi_u16_t)) == sizeof(kvi_u16_t)); } bool KviFile::save(kvi_u32_t t) { #ifndef LOCAL_CPU_LITTLE_ENDIAN t = KviByteOrder::localCpuToLittleEndian32(t); #endif return (write((const char *)(&t), sizeof(kvi_u32_t)) == sizeof(kvi_u32_t)); } bool KviFile::save(kvi_u64_t t) { #ifndef LOCAL_CPU_LITTLE_ENDIAN t = KviByteOrder::localCpuToLittleEndian64(t); #endif return (write((const char *)(&t), sizeof(kvi_u64_t)) == sizeof(kvi_u64_t)); } bool KviFile::save(const QByteArray & data) { if(!save((kvi_u32_t)(data.size()))) return false; return (write(data.data(), data.size()) == ((unsigned int)(data.size()))); } bool KviFile::save(const QString & szData) { QByteArray c = szData.toUtf8(); if(!save((kvi_u32_t)(c.length()))) return false; return (write(c.data(), c.length()) == ((unsigned int)(c.length()))); } bool KviFile::save(const KviCString & szData) { if(!save((kvi_u32_t)(szData.len()))) return false; return (write(szData.ptr(), szData.len()) == (unsigned int)szData.len()); } bool KviFile::save(KviPointerList * pData) { if(!save((int)(pData->count()))) return false; for(KviCString * s = pData->first(); s; s = pData->next()) { if(!save(*s)) return false; } return true; } bool KviFile::load(kvi_u8_t & t) { return (read((char *)(&t), sizeof(kvi_u8_t)) == sizeof(kvi_u8_t)); } bool KviFile::load(kvi_u16_t & t) { if(!(read((char *)(&t), sizeof(kvi_u16_t)) == sizeof(kvi_u16_t))) return false; #ifndef LOCAL_CPU_LITTLE_ENDIAN t = KviByteOrder::littleEndianToLocalCpu16(t); #endif return true; } bool KviFile::load(kvi_u32_t & t) { if(!(read((char *)(&t), sizeof(kvi_u32_t)) == sizeof(kvi_u32_t))) return false; #ifndef LOCAL_CPU_LITTLE_ENDIAN t = KviByteOrder::littleEndianToLocalCpu32(t); #endif return true; } bool KviFile::load(kvi_u64_t & t) { if(!(read((char *)(&t), sizeof(kvi_u32_t)) == sizeof(kvi_u32_t))) return false; #ifndef LOCAL_CPU_LITTLE_ENDIAN t = KviByteOrder::littleEndianToLocalCpu32(t); #endif return true; } bool KviFile::load(QByteArray & data) { kvi_u32_t iLen; if(!load(iLen)) return false; data.resize(iLen); // it is automatically null terminated in Qt 4.x... BLEAH :D if(read((char *)(data.data()), iLen) != iLen) return false; return true; } bool KviFile::load(QString & szData) { kvi_u32_t iLen; if(!load(iLen)) return false; QByteArray tmp; tmp.resize(iLen + 1); if(read((char *)(tmp.data()), iLen) != iLen) return false; *(tmp.data() + iLen) = 0; szData = QString::fromUtf8(tmp.data()); return true; } bool KviFile::load(KviCString & szData) { kvi_u32_t iLen; if(!load(iLen)) return false; szData.setLen(iLen); return (read((char *)(szData.ptr()), iLen) == iLen); } bool KviFile::load(KviPointerList * pData) { pData->clear(); int iCount; if(!load(iCount)) return false; for(int i = 0; i < iCount; i++) { KviCString * s = new KviCString(); if(!load(*s)) { delete s; s = nullptr; return false; } pData->append(s); } return true; } bool KviFile::skipFirst(char t, unsigned int uMaxDist) { while(uMaxDist > 0) { char c; if(!getChar(&c)) return false; if(((char)c) == t) return true; uMaxDist--; } return false; } bool KviFile::skipFirst(const KviCString & szT, unsigned int uMaxDist) { char * pcPtr = szT.ptr(); while(uMaxDist > 0) { char c; if(!getChar(&c)) return false; if(c == *pcPtr) { pcPtr++; if(!*pcPtr) return true; } else { pcPtr = szT.ptr(); } uMaxDist--; } return false; }