/* Copyright (C) 2009 Red Hat, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "config.h" #include "vdcommon.h" #include "vdlog.h" #include #include #include #include #include #include #define LOG_ROLL_SIZE (1024 * 1024) VDLog* VDLog::_log = NULL; VDLog::VDLog(FILE* handle) : _handle(handle) { _log = this; } VDLog::~VDLog() { if (_log && _handle) { fclose(_handle); _log = NULL; } } VDLog* VDLog::get(TCHAR* path) { if (_log || !path) { return _log; } struct _stat64 buf; if (_wstat64(path, &buf) == 0 && buf.st_size > LOG_ROLL_SIZE) { TCHAR roll_path[MAX_PATH]; swprintf_s(roll_path, MAX_PATH, L"%s.1", path); if (!MoveFileEx(path, roll_path, MOVEFILE_REPLACE_EXISTING)) { return NULL; } } FILE* handle = _wfsopen(path, L"a+", _SH_DENYNO); if (!handle) { return NULL; } _log = new VDLog(handle); return _log; } void VDLog::printf(const char* format, ...) { FILE *fh = _log ? _log->_handle : stdout; va_list args; va_start(args, format); vfprintf(fh, format, args); va_end(args); fflush(fh); } void VDLog::logf(const char *type, const char *function, const char* format, ...) { FILE *fh = _log ? _log->_handle : stdout; va_list args; SYSTEMTIME st; GetLocalTime(&st); _lock_file(fh); fprintf(fh, "%lu::%s::%.4u-%.2u-%.2u %.2u:%.2u:%.2u,%.3u::%s::", GetCurrentThreadId(), type, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, function); va_start(args, format); vfprintf(fh, format, args); va_end(args); _unlock_file(fh); fflush(fh); } void log_version() { // print same version as resource one // RC_PRODUCTVERSION contains 4 numbers separated by commas (resource // version information source format). vd_printf("%u.%u.%u.%u", RC_PRODUCTVERSION); }