Chromium Code Reviews| Index: chrome/installer/tools/validate_installation_main.cc |
| =================================================================== |
| --- chrome/installer/tools/validate_installation_main.cc (revision 0) |
| +++ chrome/installer/tools/validate_installation_main.cc (revision 0) |
| @@ -0,0 +1,189 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +// A command-line tool that inspects the current system, displaying information |
| +// about installed products. Violations are dumped to stderr. The process |
| +// exit code is 0 if there are no violations, or 1 otherwise. |
| + |
| +#include <cstdio> |
|
tommi (sloooow) - chröme
2011/02/12 00:11:17
I have a sneaky suspicion that chromium has an ios
grt (UTC plus 2)
2011/02/14 04:05:20
I used iostreams initially, but either cpplint or
|
| +#include <cstdlib> |
| + |
| +#include "base/at_exit.h" |
| +#include "base/command_line.h" |
| +#include "base/file_util.h" |
| +#include "base/logging.h" |
| +#include "base/path_service.h" |
| +#include "chrome/installer/util/installation_validator.h" |
| + |
| +using installer::InstallationValidator; |
| + |
| +namespace { |
| + |
| +// A helper class that initializes logging and installs a log message handler to |
| +// direct ERROR messages to stderr. Only one instance of this class may be live |
| +// at a time. |
| +class ConsoleLogHelper { |
| + public: |
| + ConsoleLogHelper(); |
| + ~ConsoleLogHelper(); |
| + |
| + private: |
| + static FilePath GetLogFilePath(); |
| + static bool DumpLogMessage(int severity, |
| + const char* file, |
| + int line, |
| + size_t message_start, |
| + const std::string& str); |
| + |
| + static const wchar_t kLogFileName_[]; |
| + static FILE* const kOutputStream_; |
| + static const logging::LogSeverity kViolationSeverity_; |
| + static logging::LogMessageHandlerFunction old_message_handler_; |
| + FilePath log_file_path_; |
| +}; |
| + |
| +// static |
| +const wchar_t ConsoleLogHelper::kLogFileName_[] = L"validate_installation.log"; |
| + |
| +// Dump violations to stderr. |
| +// static |
| +FILE* const ConsoleLogHelper::kOutputStream_ = stderr; |
| + |
| +// InstallationValidator logs all violations at ERROR level. |
| +// static |
| +const logging::LogSeverity |
| + ConsoleLogHelper::kViolationSeverity_ = logging::LOG_ERROR; |
| + |
| +// static |
| +logging::LogMessageHandlerFunction |
| + ConsoleLogHelper::old_message_handler_ = NULL; |
| + |
| +ConsoleLogHelper::ConsoleLogHelper() : log_file_path_(GetLogFilePath()) { |
| + LOG_ASSERT(old_message_handler_ == NULL); |
| + logging::InitLogging( |
| + log_file_path_.value().c_str(), |
| + logging::LOG_ONLY_TO_FILE, |
| + logging::DONT_LOCK_LOG_FILE, |
| + logging::DELETE_OLD_LOG_FILE, |
| + logging::DISABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS); |
| + |
| + old_message_handler_ = logging::GetLogMessageHandler(); |
| + logging::SetLogMessageHandler(&DumpLogMessage); |
| +} |
| + |
| +ConsoleLogHelper::~ConsoleLogHelper() { |
| + logging::SetLogMessageHandler(old_message_handler_); |
| + old_message_handler_ = NULL; |
| + |
| + logging::CloseLogFile(); |
| + |
| + // Delete the log file if it wasn't written to (this is expected). |
| + int64 file_size = 0; |
| + if (file_util::GetFileSize(log_file_path_, &file_size) && file_size == 0) |
| + file_util::Delete(log_file_path_, false); |
| +} |
| + |
| +// Returns the path to the log file to create. The file should be empty at |
| +// process exit since we redirect log messages to stderr. |
| +// static |
| +FilePath ConsoleLogHelper::GetLogFilePath() { |
| + FilePath log_path; |
| + |
| + if (PathService::Get(base::DIR_TEMP, &log_path)) |
| + return log_path.Append(kLogFileName_); |
| + else |
| + return FilePath(kLogFileName_); |
| +} |
| + |
| +// A logging::LogMessageHandlerFunction that sends the body of messages logged |
| +// at the severity of validation violations to stderr. All other messages are |
| +// sent through the default logging pipeline. |
| +// static |
| +bool ConsoleLogHelper::DumpLogMessage(int severity, |
| + const char* file, |
| + int line, |
| + size_t message_start, |
| + const std::string& str) { |
| + if (severity == kViolationSeverity_) { |
| + fprintf(kOutputStream_, "%s", str.c_str() + message_start); |
| + return true; |
| + } |
| + |
| + if (old_message_handler_ != NULL) |
| + return (old_message_handler_)(severity, file, line, message_start, str); |
| + |
| + return false; |
| +} |
| + |
| +const char* LevelToString(bool system_level) { |
| + return system_level ? "System-level" : "User-level"; |
| +} |
| + |
| +std::string InstallationTypeToString( |
| + InstallationValidator::InstallationType type) { |
| + std::string result; |
| + |
| + static const struct ProductData { |
| + int bit; |
| + const char* name; |
| + } kProdBitToName[] = { |
| + { |
| + InstallationValidator::ProductBits::CHROME_SINGLE, |
| + "Chrome" |
| + }, { |
| + InstallationValidator::ProductBits::CHROME_MULTI, |
| + "Chrome (multi)" |
| + }, { |
| + InstallationValidator::ProductBits::CHROME_FRAME_SINGLE, |
| + "Chrome Frame" |
| + }, { |
| + InstallationValidator::ProductBits::CHROME_FRAME_MULTI, |
| + "Chrome Frame (multi)" |
| + }, { |
| + InstallationValidator::ProductBits::CHROME_FRAME_READY_MODE, |
| + "Ready-mode Chrome Frame" |
| + }, |
| + }; |
| + |
| + for (size_t i = 0; i < arraysize(kProdBitToName); ++i) { |
| + const ProductData& product_data = kProdBitToName[i]; |
| + if ((type & product_data.bit) != 0) { |
| + if (!result.empty()) |
| + result.append(", "); |
| + result.append(product_data.name); |
| + } |
| + } |
| + |
| + return result; |
| +} |
| + |
| +} // namespace |
| + |
| +// The main program. |
| +int wmain(int argc, wchar_t *argv[]) { |
| + int result = EXIT_SUCCESS; |
| + base::AtExitManager exit_manager; |
| + |
| + CommandLine::Init(0, NULL); |
| + ConsoleLogHelper log_helper; |
| + |
| + // Check user-level and system-level for products. |
| + for (int i = 0; i < 2; ++i) { |
| + const bool system_level = (i != 0); |
| + InstallationValidator::InstallationType type = |
| + InstallationValidator::NO_PRODUCTS; |
| + bool is_valid = |
| + InstallationValidator::ValidateInstallationType(system_level, &type); |
| + if (type != InstallationValidator::NO_PRODUCTS) { |
| + FILE* stream = is_valid ? stdout : stderr; |
| + fprintf(stream, "%s installations%s: %s\n", LevelToString(system_level), |
| + (is_valid ? "" : " (with errors)"), |
| + InstallationTypeToString(type).c_str()); |
| + } |
| + if (!is_valid) |
| + result = EXIT_FAILURE; |
| + } |
| + |
| + return result; |
| +} |
| Property changes on: chrome\installer\tools\validate_installation_main.cc |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |