123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- /******************************************************************************
- *
- * package: Log4Qt
- * file: writerappender.cpp
- * created: September 2007
- * author: Martin Heinrich
- *
- *
- * Copyright 2007 Martin Heinrich
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************/
- /******************************************************************************
- * Dependencies
- ******************************************************************************/
- #include "log4qt/writerappender.h"
- #include <QtCore/QDebug>
- #include <QtCore/QTextCodec>
- #include "log4qt/layout.h"
- #include "log4qt/loggingevent.h"
- namespace Log4Qt
- {
-
-
- /**************************************************************************
- * Declarations
- **************************************************************************/
-
-
-
- /**************************************************************************
- * C helper functions
- **************************************************************************/
-
-
-
- /**************************************************************************
- * Class implementation: WriterAppender
- **************************************************************************/
-
-
- WriterAppender::WriterAppender(QObject *pParent) :
- AppenderSkeleton(false, pParent),
- mpEncoding(0),
- mpWriter(0),
- mImmediateFlush(true)
- {
- }
-
-
- WriterAppender::WriterAppender(Layout *pLayout,
- QObject *pParent) :
- AppenderSkeleton(false, pParent),
- mpEncoding(0),
- mpWriter(0),
- mImmediateFlush(true)
- {
- setLayout(pLayout);
- }
-
-
- WriterAppender::WriterAppender(Layout *pLayout,
- QTextStream *pTextStream,
- QObject *pParent) :
- AppenderSkeleton(false, pParent),
- mpEncoding(0),
- mpWriter(pTextStream),
- mImmediateFlush(true)
- {
- setLayout(pLayout);
- }
-
-
- WriterAppender::~WriterAppender()
- {
- close();
- }
-
-
- void WriterAppender::setEncoding(QTextCodec *pEncoding)
- {
- QMutexLocker locker(&mObjectGuard);
-
- if (mpEncoding == pEncoding)
- return;
-
- mpEncoding = pEncoding;
- if (mpWriter)
- {
- if (mpEncoding)
- mpWriter->setCodec(mpEncoding);
- else
- mpWriter->setCodec(QTextCodec::codecForLocale());
- }
- }
-
-
- void WriterAppender::setWriter(QTextStream *pTextStream)
- {
- QMutexLocker locker(&mObjectGuard);
-
- closeWriter();
-
- mpWriter = pTextStream;
- if (mpEncoding && mpWriter)
- mpWriter->setCodec(mpEncoding);
- writeHeader();
- }
-
-
- void WriterAppender::activateOptions()
- {
- QMutexLocker locker(&mObjectGuard);
-
- if (!writer())
- {
- LogError e = LOG4QT_QCLASS_ERROR(QT_TR_NOOP("Activation of Appender '%1' that requires writer and has no writer set"),
- APPENDER_ACTIVATE_MISSING_WRITER_ERROR);
- e << name();
- logger()->error(e);
- return;
- }
-
- AppenderSkeleton::activateOptions();
- }
-
-
- void WriterAppender::close()
- {
- QMutexLocker locker(&mObjectGuard);
-
- if (isClosed())
- return;
-
- AppenderSkeleton::close();
- closeWriter();
- }
-
-
- bool WriterAppender::requiresLayout() const
- {
- return true;
- }
-
-
- void WriterAppender::append(const LoggingEvent &rEvent)
- {
- // Q_ASSERT_X(, "WriterAppender::append()", "Lock must be held by caller");
- Q_ASSERT_X(layout(), "WriterAppender::append()", "Layout must not be null");
-
- QString message(layout()->format(rEvent));
-
- *mpWriter << message;
- if (handleIoErrors())
- return;
-
- if (immediateFlush())
- {
- mpWriter->flush();
- if (handleIoErrors())
- return;
- }
- }
-
-
- bool WriterAppender::checkEntryConditions() const
- {
- // Q_ASSERT_X(, "WriterAppender::checkEntryConditions()", "Lock must be held by caller")
-
- if (!writer())
- {
- LogError e = LOG4QT_QCLASS_ERROR(QT_TR_NOOP("Use of appender '%1' without a writer set"),
- APPENDER_USE_MISSING_WRITER_ERROR);
- e << name();
- logger()->error(e);
- return false;
- }
-
- return AppenderSkeleton::checkEntryConditions();
- }
-
-
- void WriterAppender::closeWriter()
- {
- // Q_ASSERT_X(, "WriterAppender::closeWriter()", "Lock must be held by caller")
-
- if (!mpWriter)
- return;
-
- writeFooter();
- mpWriter = 0;
- }
-
-
- #ifndef QT_NO_DEBUG_STREAM
- QDebug WriterAppender::debug(QDebug &rDebug) const
- {
- QString layout_name;
- if (layout())
- layout_name = layout()->name();
- QString codec_name;
- if (encoding())
- codec_name = QLatin1String(encoding()->name());
-
- rDebug.nospace() << "WriterAppender("
- << "name:" << name() << " "
- << "encoding:" << codec_name << " "
- << "filter:" << firstFilter()
- << "immediateFlush:" << immediateFlush()
- << "isactive:" << isActive()
- << "isclosed:" << isClosed()
- << "layout:" << layout_name
- << "referencecount:" << referenceCount() << " "
- << "threshold:" << threshold().toString()
- << "writer:" << writer()
- << ")";
- return rDebug.space();
- }
- #endif // QT_NO_DEBUG_STREAM
-
-
- bool WriterAppender::handleIoErrors() const
- {
- return false;
- }
-
-
- void WriterAppender::writeFooter() const
- {
- // Q_ASSERT_X(, "WriterAppender::writeFooter()", "Lock must be held by caller")
-
- if (!layout() || !mpWriter)
- return;
-
- QString footer = layout()->footer();
- if (footer.isEmpty())
- return;
-
- *mpWriter << footer << Layout::endOfLine();
- if (handleIoErrors())
- return;
- }
-
-
- void WriterAppender::writeHeader() const
- {
- // Q_ASSERT_X(, "WriterAppender::writeHeader()", "Lock must be held by caller")
-
- if (!layout() || !mpWriter)
- return;
-
- QString header = layout()->header();
- if (header.isEmpty())
- return;
-
- *mpWriter << header << Layout::endOfLine();
- if (handleIoErrors())
- return;
- }
-
-
-
- /******************************************************************************
- * Implementation: Operators, Helper
- ******************************************************************************/
-
-
- } // namespace Log4Qt
|