| /* ------------------------------------------------------------------ |
| * Copyright (C) 1998-2009 PacketVideo |
| * |
| * 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. |
| * ------------------------------------------------------------------- |
| */ |
| #ifndef PVLOGGER_STDERR_APPENDER_H_INCLUDED |
| #define PVLOGGER_STDERR_APPENDER_H_INCLUDED |
| |
| #ifndef PVLOGGERACCESSORIES_H_INCLUDED |
| #include "pvlogger_accessories.h" |
| #endif |
| |
| #ifndef OSCLCONFIG_UTIL_H_INCLUDED |
| #include "osclconfig_util.h" |
| #endif |
| #ifndef OSCL_MEM_H_INCLUDED |
| #include "oscl_mem.h" |
| #endif |
| |
| /** |
| * Class: StdErrAppender |
| * |
| */ |
| template < class Layout, int32 LayoutBufferSize, class Lock = OsclNullLock > |
| class StdErrAppender : public PVLoggerAppender |
| { |
| public: |
| typedef PVLoggerAppender::message_id_type message_id_type; |
| |
| StdErrAppender() |
| { |
| stringbuf = NULL; |
| wstringbuf = NULL; |
| } |
| virtual ~StdErrAppender() |
| { |
| if (stringbuf) |
| OSCL_DEFAULT_FREE(stringbuf); |
| if (wstringbuf) |
| OSCL_DEFAULT_FREE((OsclAny*)wstringbuf); |
| } |
| |
| void AppendString(message_id_type msgID, const char *fmt, va_list va) |
| { |
| _lock.Lock(); |
| |
| int32 size; |
| |
| if (!stringbuf) |
| { |
| stringbuf = (char*)OSCL_DEFAULT_MALLOC(LayoutBufferSize); |
| if (!stringbuf) |
| return;//allocation failed-- just exit gracefully. |
| } |
| |
| size = _layout.FormatString(stringbuf, LayoutBufferSize, msgID, fmt, va); |
| |
| { |
| fprintf(stderr, "%s", stringbuf); |
| fprintf(stderr, "\n"); |
| } |
| |
| _lock.Unlock(); |
| } |
| void AppendBuffers(message_id_type msgID, int32 numPairs, va_list va) |
| { |
| OSCL_UNUSED_ARG(msgID); |
| |
| for (int32 i = 0; i < numPairs; i++) |
| { |
| int32 length = va_arg(va, int32); |
| uint8* buffer = va_arg(va, uint8*); |
| |
| int32 jj; |
| for (jj = 10; jj < length; jj += 10) |
| { |
| AppendStringA(0, " %x %x %x %x %x %x %x %x %x %x", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], buffer[8], buffer[9]); |
| buffer += 10; |
| } |
| |
| uint8 remainderbuf[10]; |
| uint32 remainder = length - (jj - 10); |
| if (remainder > 0 && remainder <= 10) |
| { |
| oscl_memcpy(remainderbuf, buffer, remainder); |
| oscl_memset(remainderbuf + remainder, 0, 10 - remainder); |
| buffer = remainderbuf; |
| AppendStringA(0, " %x %x %x %x %x %x %x %x %x %x", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], buffer[8], buffer[9]); |
| } |
| } |
| va_end(va); |
| } |
| |
| private: |
| void AppendStringA(message_id_type msgID, const char *fmt, ...) |
| { |
| va_list arguments; |
| va_start(arguments, fmt); |
| AppendString(msgID, fmt, arguments); |
| va_end(arguments); |
| } |
| |
| Layout _layout; |
| Lock _lock; |
| char* stringbuf; |
| oscl_wchar* wstringbuf; |
| |
| }; |
| |
| #endif // PVLOGGER_STDERR_APPENDER_H_INCLUDED |
| |