controlpanel/src/logger/src/logoutputimpl.cpp
author hgs
Tue, 24 Aug 2010 10:30:25 +0800
changeset 52 58cebe0861a8
parent 34 8844afdb7529
permissions -rw-r--r--
201033

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0""
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  
*
*/
#include "logoutputimpl.h"
#include <QFile>
#include <QDir>
#include <QFileInfo>
#include <QTextStream>
#include <QSettings>
#include "logger.h"
#include "loglogger.h"
#include "logoutputfactory.h"

#ifdef Q_WS_WIN
    #include <Windows.h>
#endif

#ifdef Q_OS_SYMBIAN
    #include <e32debug.h>
#endif

//DebugLogOutput
REGISTER_OUTPUT_LOG(DEBUGOUTPUT_NAME,DebugLogOutput)

DebugLogOutput::DebugLogOutput() 
{
}

DebugLogOutput::~DebugLogOutput()
{
}

void DebugLogOutput::output(const QString &log)
{
#if defined(Q_WS_WIN)
    QT_WA({
        OutputDebugStringW(reinterpret_cast<const WCHAR*>(log.utf16()));
    }, {
        OutputDebugStringA(log.toLocal8Bit().data());
    });
#elif defined(Q_OS_SYMBIAN)
    RDebug::Printf(log.toLocal8Bit().data());
#else
    fprintf(stderr, log.toLocal8Bit().data());
    fflush(stderr);
#endif
}

bool DebugLogOutput::init()
{
    return true;
}


bool DebugLogOutput::doLoad(QSettings &settings)
{
    Q_UNUSED(settings);
    return true;
}


//ConsoleLogOutput

REGISTER_OUTPUT_LOG(CONSOLEOUTPUT_NAME,ConsoleLogOutput)

ConsoleLogOutput::ConsoleLogOutput() 
{
}

ConsoleLogOutput::~ConsoleLogOutput()
{
}

void ConsoleLogOutput::output(const QString &log)
{
    printf(log.toLocal8Bit().data());
}

bool ConsoleLogOutput::init()
{
    return true;
}


bool ConsoleLogOutput::doLoad(QSettings &settings)
{
    Q_UNUSED(settings);
    return true;
}

//FileLogOutput

REGISTER_OUTPUT_LOG(FILEOUTPUT_NAME,FileLogOutput)

FileLogOutput::FileLogOutput(const QString &logFilePath /*= QString()*/) : 
    mLogFile(0),mTextStream(0),mLogFilePath(logFilePath),mTruncateFile(false)
{
}

FileLogOutput::~FileLogOutput()
{
    delete mTextStream;
    delete mLogFile;
}

void FileLogOutput::output(const QString &log)
{
    *mTextStream << log;
    mTextStream->flush();
}

bool FileLogOutput::init()
{
    if (mTextStream) {
        delete mTextStream;
        mTextStream = 0;
    }

    if (mLogFile) {
        delete mLogFile;
        mLogFile = 0;
    }

    QFileInfo fileInfo(mLogFilePath);
    QDir parentDir = fileInfo.dir();
    if (!parentDir.exists())
    {
        QString path = parentDir.absolutePath();
        parentDir.cdUp();
        parentDir.mkpath(path);
    }

    mLogFile = new QFile(mLogFilePath);
    QFile::OpenMode mode = QIODevice::WriteOnly | QIODevice::Text;

    if (mTruncateFile) {
        mode |= QIODevice::Truncate;
    }
    else {
        mode |= QIODevice::Append;
    }

    if (!mLogFile->open(mode))
    {
        LOGGER_LOG(QString("FileLogOutput::init << Open open file failed: ") + mLogFilePath);
        return false;
    }
    mTextStream = new QTextStream(mLogFile);
    return true;
}

bool FileLogOutput::doLoad(QSettings &settings)
{
    if (!parentLogger()) {
        return false;
    }

    settings.beginGroup(parentLogger()->name());
    mLogFilePath = settings.value(
        FILEOUTPUT_NAME + SETTINGS_SECTION_SEPERATOR + FILEOUTPUT_LOGFILE).toString();
    mTruncateFile = settings.value(
        FILEOUTPUT_NAME + SETTINGS_SECTION_SEPERATOR + FILEOUTPUT_TRUNCATE,QVariant(false)).toBool();
    settings.endGroup();

    if (mLogFilePath.isEmpty()) {
        return false;
    } 

    return true;
}

bool FileLogOutput::truncate() const
{
    return mTruncateFile;
}

void FileLogOutput::setTruncate(bool truncate)
{
    mTruncateFile = truncate;
}

QString FileLogOutput::logFile() const
{
    return mLogFilePath;
}

void FileLogOutput::setLogFile(const QString &logFile)
{
    mLogFilePath = logFile;
}