Index: services/log/log_impl.cc |
diff --git a/services/log/log_impl.cc b/services/log/log_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6c2a113609fa83e8dc1080ab17964bc7e6c22f84 |
--- /dev/null |
+++ b/services/log/log_impl.cc |
@@ -0,0 +1,96 @@ |
+// Copyright 2015 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. |
+ |
+#include "services/log/log_impl.h" |
+ |
+#include <stdio.h> |
+ |
+#include <utility> |
+ |
+#include "base/logging.h" |
+#include "base/strings/stringprintf.h" |
+#include "mojo/public/cpp/application/application_connection.h" |
+#include "mojo/public/cpp/system/functions.h" |
+#include "mojo/services/log/interfaces/entry.mojom.h" |
+ |
+namespace mojo { |
+namespace log { |
+namespace { |
+ |
+std::string LogLevelToString(int32_t log_level) { |
+ if (log_level <= kLogLevelVerbose - 3) |
+ return "VERBOSE4+"; |
+ switch (log_level) { |
+ case kLogLevelVerbose - 2: |
+ return "VERBOSE3"; |
+ case kLogLevelVerbose - 1: |
+ return "VERBOSE2"; |
+ case kLogLevelVerbose: |
+ return "VERBOSE1"; |
+ case kLogLevelInfo: |
+ return "INFO"; |
+ case kLogLevelWarning: |
+ return "WARNING"; |
+ case kLogLevelError: |
+ return "ERROR"; |
+ } |
+ return "FATAL"; |
+} |
+ |
+} // namespace |
+ |
+LogImpl::LogImpl(const std::string& remote_url, |
+ InterfaceRequest<Log> request, |
+ FILE* out_file) |
+ : remote_url_(remote_url), |
+ binding_(this, std::move(request)), |
+ out_file_(out_file) {} |
+ |
+LogImpl::~LogImpl() {} |
+ |
+// static |
+void LogImpl::Create(ApplicationConnection* connection, |
+ InterfaceRequest<Log> request, |
+ FILE* out_file) { |
+ DCHECK(connection); |
+ DCHECK(out_file); |
+ |
+ const std::string& remote_url = connection->GetRemoteApplicationURL(); |
+ if (remote_url.empty()) { |
+ LOG(ERROR) << "No remote URL."; |
+ return; |
+ } |
+ |
+ new LogImpl(remote_url, std::move(request), out_file); |
+} |
+ |
+void LogImpl::AddEntry(EntryPtr entry) { |
+ DCHECK(entry); |
+ |
+ // In order to keep LogImpl thread-safe (for the future), we should only print |
+ // one thing here (otherwise, it could interleave with other prints). |
+ fprintf(out_file_, "%s\n", FormatEntry(entry).c_str()); |
+} |
+ |
+// This should return: |
+// <REMOTE_URL> [LOG_LEVEL] SOURCE_FILE:SOURCE_LINE MESSAGE |
+std::string LogImpl::FormatEntry(const EntryPtr& entry) { |
+ std::string source; |
+ if (entry->source_file) { |
+ source += entry->source_file.To<std::string>(); |
+ if (entry->source_line) { |
+ base::StringAppendF(&source, ":%u", entry->source_line); |
+ } |
+ source += ": "; |
+ } |
+ |
+ return base::StringPrintf( |
+ "<%s> [%s] %s%s", remote_url_.c_str(), |
+ LogLevelToString(entry->log_level).c_str(), source.c_str(), |
+ entry->message ? entry->message.To<std::string>().c_str() |
+ : "<no message>"); |
+} |
+ |
+} // namespace log |
+} // namespace mojo |