/*
 *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/system_wrappers/include/logcat_trace_context.h"

#include <android/log.h>
#include <assert.h>

#include "webrtc/base/logging.h"

namespace webrtc {

static android_LogPriority AndroidLogPriorityFromWebRtcLogLevel(
    TraceLevel webrtc_level) {
  // NOTE: this mapping is somewhat arbitrary.  StateInfo and Info are mapped
  // to DEBUG because they are highly verbose in webrtc code (which is
  // unfortunate).
  switch (webrtc_level) {
    case webrtc::kTraceStateInfo: return ANDROID_LOG_DEBUG;
    case webrtc::kTraceWarning: return ANDROID_LOG_WARN;
    case webrtc::kTraceError: return ANDROID_LOG_ERROR;
    case webrtc::kTraceCritical: return ANDROID_LOG_FATAL;
    case webrtc::kTraceApiCall: return ANDROID_LOG_VERBOSE;
    case webrtc::kTraceModuleCall: return ANDROID_LOG_VERBOSE;
    case webrtc::kTraceMemory: return ANDROID_LOG_VERBOSE;
    case webrtc::kTraceTimer: return ANDROID_LOG_VERBOSE;
    case webrtc::kTraceStream: return ANDROID_LOG_VERBOSE;
    case webrtc::kTraceDebug: return ANDROID_LOG_DEBUG;
    case webrtc::kTraceInfo: return ANDROID_LOG_DEBUG;
    case webrtc::kTraceTerseInfo: return ANDROID_LOG_INFO;
    default:
      LOG(LS_ERROR) << "Unexpected log level" << webrtc_level;
      return ANDROID_LOG_FATAL;
  }
}

LogcatTraceContext::LogcatTraceContext() {
  webrtc::Trace::CreateTrace();
  if (webrtc::Trace::SetTraceCallback(this) != 0)
    assert(false);
}

LogcatTraceContext::~LogcatTraceContext() {
  if (webrtc::Trace::SetTraceCallback(NULL) != 0)
    assert(false);
  webrtc::Trace::ReturnTrace();
}

void LogcatTraceContext::Print(TraceLevel level,
                               const char* message,
                               int length) {
  __android_log_print(AndroidLogPriorityFromWebRtcLogLevel(level),
                      "WEBRTC", "%.*s", length, message);
}

}  // namespace webrtc
