auto import from //depot/cupcake/@135843
diff --git a/android/android_log_appender.h b/android/android_log_appender.h
new file mode 100644
index 0000000..b3dc1ce
--- /dev/null
+++ b/android/android_log_appender.h
@@ -0,0 +1,118 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 2008 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 ANDROID_LOG_APPENDER_H_INCLUDED
+#define ANDROID_LOG_APPENDER_H_INCLUDED
+
+#ifndef PVLOGGERACCESSORIES_H_INCLUDED
+#include "pvlogger_accessories.h"
+#endif
+
+#ifndef OSCLCONFIG_UTIL_H_INCLUDED
+#include "osclconfig_util.h"
+#endif
+
+#include <utils/Log.h>
+#undef LOG_TAG
+#define LOG_TAG "PV"
+
+/**
+ * Class: AndroidLogAppender
+ *
+ */
+template<class Layout, int32 LayoutBufferSize, class Lock = OsclNullLock>
+class AndroidLogAppender : public PVLoggerAppender {
+public:
+ typedef PVLoggerAppender::message_id_type message_id_type;
+
+ AndroidLogAppender()
+ {
+ stringbuf=NULL;
+ wstringbuf=NULL;
+ }
+ virtual ~AndroidLogAppender()
+ {
+ 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 );
+
+ LOGE(stringbuf);
+
+ _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 // ANDROID_LOG_APPENDER_H_INCLUDED
+