- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / log_private / log_private_api_chromeos.cc
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/extensions/api/log_private/log_private_api.h"
6
7 #include <string>
8 #include <vector>
9
10 #include "base/json/json_writer.h"
11 #include "base/logging.h"
12 #include "base/memory/linked_ptr.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "chrome/browser/chromeos/system_logs/about_system_logs_fetcher.h"
15 #include "chrome/browser/chromeos/system_logs/scrubbed_system_logs_fetcher.h"
16 #include "chrome/browser/extensions/api/log_private/filter_handler.h"
17 #include "chrome/browser/extensions/api/log_private/log_parser.h"
18 #include "chrome/browser/extensions/api/log_private/syslog_parser.h"
19 #include "chrome/browser/extensions/extension_function.h"
20 #include "chrome/common/extensions/api/log_private.h"
21
22 namespace extensions {
23 namespace {
24
25 scoped_ptr<LogParser> CreateLogParser(const std::string& log_type) {
26   if (log_type == "syslog")
27     return scoped_ptr<LogParser>(new SyslogParser());
28   // TODO(shinfan): Add more parser here
29
30   NOTREACHED() << "Invalid log type: " << log_type;
31   return  scoped_ptr<LogParser>();
32 }
33
34 void CollectLogInfo(
35     FilterHandler* filter_handler,
36     chromeos::SystemLogsResponse* logs,
37     std::vector<linked_ptr<api::log_private::LogEntry> >* output) {
38   for (chromeos::SystemLogsResponse::const_iterator request_it = logs->begin();
39        request_it != logs->end();
40        ++request_it) {
41     if (!filter_handler->IsValidSource(request_it->first)) {
42       continue;
43     }
44     scoped_ptr<LogParser> parser(CreateLogParser(request_it->first));
45     if (parser) {
46       parser->Parse(request_it->second, output, filter_handler);
47     }
48   }
49 }
50
51 }  // namespace
52
53 LogPrivateGetHistoricalFunction::LogPrivateGetHistoricalFunction() {
54 }
55
56 LogPrivateGetHistoricalFunction::~LogPrivateGetHistoricalFunction() {
57 }
58
59 bool LogPrivateGetHistoricalFunction::RunImpl() {
60   // Get parameters
61   scoped_ptr<api::log_private::GetHistorical::Params> params(
62       api::log_private::GetHistorical::Params::Create(*args_));
63   EXTENSION_FUNCTION_VALIDATE(params.get());
64   filter_handler_.reset(new FilterHandler(params->filter));
65
66   chromeos::SystemLogsFetcherBase* fetcher;
67   if ((params->filter).scrub) {
68     fetcher = new chromeos::ScrubbedSystemLogsFetcher();
69   } else {
70     fetcher = new chromeos::AboutSystemLogsFetcher();
71   }
72   fetcher->Fetch(
73       base::Bind(&LogPrivateGetHistoricalFunction::OnSystemLogsLoaded, this));
74
75   return true;
76 }
77
78 void LogPrivateGetHistoricalFunction::OnSystemLogsLoaded(
79     scoped_ptr<chromeos::SystemLogsResponse> sys_info) {
80   std::vector<linked_ptr<api::log_private::LogEntry> > data;
81
82   CollectLogInfo(filter_handler_.get(), sys_info.get(), &data);
83
84   // Prepare result
85   api::log_private::Result result;
86   result.data = data;
87   api::log_private::Filter::Populate(
88       *((filter_handler_->GetFilter())->ToValue()), &result.filter);
89   SetResult(result.ToValue().release());
90   SendResponse(true);
91 }
92
93 }  // namespace extensions