//============================================================================= // // File : LogFile.cpp // Creation date : Thu Apr 14 2011 19:21:59 by Elvio Basello // // This file is part of the KVIrc IRC client distribution // Copyright (C) 2011 Elvio Basello (hellvis69 at gmail dot com) // // 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 "LogFile.h" #include "KviQString.h" #include "KviCString.h" #include "KviOptions.h" #include "KviFileUtils.h" #include #include #ifdef COMPILE_ZLIB_SUPPORT #include #endif LogFile::LogFile(const QString & szName) { m_szFilename = szName; QFileInfo fi(m_szFilename); QString szTmpName = fi.fileName(); m_bCompressed = (fi.suffix() == "gz"); if(m_bCompressed) { //removes trailing dot and extension szTmpName.chop(3); } QString szTypeToken = szTmpName.section('_', 0, 0); // Ignore non-logs files, this includes '.' and '..' if(KviQString::equalCI(szTypeToken, "channel") || KviQString::equalCI(szTypeToken, "deadchannel")) { m_szType = "channel"; m_eType = Channel; } else if(KviQString::equalCI(szTypeToken, "console")) { m_szType = "console"; m_eType = Console; } else if(KviQString::equalCI(szTypeToken, "query")) { m_szType = "query"; m_eType = Query; } else if(KviQString::equalCI(szTypeToken, "dccchat")) { m_szType = "dccchat"; m_eType = DccChat; } else { m_szType = ""; m_eType = Other; } KviCString szUndecoded = szTmpName.section('.', 0, 0); szUndecoded.cutToFirst('_'); m_szName = szUndecoded.hexDecode(szUndecoded.ptr()).ptr(); szUndecoded = szTmpName.section('.', 1).section('_', 0, -2); m_szNetwork = szUndecoded.hexDecode(szUndecoded.ptr()).ptr(); QString szDate = szTmpName.section('_', -1).section('.', 0, -2); switch(KVI_OPTION_UINT(KviOption_uintOutputDatetimeFormat)) { case 1: m_date = QDate::fromString(szDate, Qt::ISODate); break; case 2: m_date = QLocale().toDate(szDate, QLocale::ShortFormat); if(!m_date.isValid()) { // some locale date formats use '/' as a separator; we change them to '-' // when creating log files. Try to reverse that change here QString szUnescapedDate = szDate; szUnescapedDate.replace('-', KVI_PATH_SEPARATOR_CHAR); m_date = QLocale().toDate(szUnescapedDate, QLocale::ShortFormat); if(m_date.isValid()) { //qt4 defaults to 1900 for years. So "11" means "1911" instead of "2011".. what a pity if(m_date.year() < 1990) m_date = m_date.addYears(100); } } break; case 0: default: m_date = QDate::fromString(szDate, "yyyy.MM.dd"); break; } if(!m_date.isValid()) { // probably the log has been created when the OutputDatetimeFormat option // was set to a different value. Try to guess its format m_date = QDate::fromString(szDate, "yyyy.MM.dd"); if(!m_date.isValid()) { m_date = QDate::fromString(szDate, Qt::ISODate); if(!m_date.isValid()) { m_date = QLocale().toDate(szDate, QLocale::ShortFormat); if(!m_date.isValid()) { // some locale date formats use '/' as a separator; we change them to '-' // when creating log files. Try to reverse that change here QString szUnescapedDate = szDate; szUnescapedDate.replace('-', KVI_PATH_SEPARATOR_CHAR); m_date = QLocale().toDate(szUnescapedDate, QLocale::ShortFormat); if(m_date.isValid()) { //qt4 defaults to 1900 for years. So "11" means "1911" instead of "2011".. what a pity if(m_date.year() < 1990) m_date = m_date.addYears(100); } } // if the date is still not valid, we give up } } } } void LogFile::getText(QString & szText) { QString szLogName = fileName(); QFile logFile; #ifdef COMPILE_ZLIB_SUPPORT if(m_bCompressed) { gzFile file = gzopen(szLogName.toLocal8Bit().data(), "rb"); if(file) { char cBuff[1025]; int iLen; QByteArray data; //QCString data; iLen = gzread(file, cBuff, 1024); while(iLen > 0) { cBuff[iLen] = 0; data.append(cBuff); iLen = gzread(file, cBuff, 1024); } gzclose(file); szText = QString::fromUtf8(data); } else { qDebug("Can't open compressed file %s", szLogName.toLocal8Bit().data()); } } else { #endif logFile.setFileName(szLogName); if(!logFile.open(QIODevice::ReadOnly)) return; QByteArray bytes; bytes = logFile.readAll(); szText = QString::fromUtf8(bytes.data(), bytes.size()); logFile.close(); #ifdef COMPILE_ZLIB_SUPPORT } #endif }