/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * 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.
 */
#include <stdio.h>
#include <stdarg.h>

#include "StringUtil.h"
#include "Log.h"

Log* Log::mInstance = NULL;

#define ASSERT_PLAIN(cond) if(!(cond)) { fprintf(stderr, \
        "assertion failed %s %d", __FILE__, __LINE__); \
    *(char*)0 = 0; /* this will crash */};

Log* Log::Instance(const char* dirName)
{
    if (!mInstance) {
        mInstance = new Log();
        ASSERT_PLAIN(mInstance->init(dirName));
    }
    return mInstance;
}
void Log::Finalize()
{
    delete mInstance;
    mInstance = NULL;
}
void Log::printf(LogLevel level, const char* fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    FileUtil::doVprintf(level < mLogLevel, level, fmt, ap);
    va_end(ap);
}

void Log::setLogLevel(LogLevel level)
{
    mLogLevel = level;
}

Log::Log()
    : mLogLevel(ELogV)
{
    ::fprintf(stderr, "Log level %d\n", mLogLevel);
}

Log::~Log()
{

}

bool Log::init(const char* dirName)
{
    if (dirName == NULL) {
        return true;
    }
    android::String8 logFile;
    if (logFile.appendFormat("%s/log.txt", dirName) != 0) {
        return false;
    }
    return FileUtil::init(logFile.string());
}