1// Copyright 2014 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 "components/feedback/feedback_util.h"
6
7#include <string>
8
9#include "base/bind.h"
10#include "base/file_util.h"
11#include "components/feedback/feedback_data.h"
12#include "components/feedback/feedback_uploader.h"
13#include "components/feedback/feedback_uploader_factory.h"
14#include "components/feedback/proto/common.pb.h"
15#include "components/feedback/proto/dom.pb.h"
16#include "components/feedback/proto/extension.pb.h"
17#include "components/feedback/proto/math.pb.h"
18#include "third_party/zlib/google/zip.h"
19
20using feedback::FeedbackData;
21
22namespace {
23
24#if defined(OS_CHROMEOS)
25const int kChromeOSProductId = 208;
26#else
27const int kChromeBrowserProductId = 237;
28#endif
29
30}  // namespace
31
32namespace feedback_util {
33
34void SendReport(scoped_refptr<FeedbackData> data) {
35  if (!data.get()) {
36    LOG(ERROR) << "SendReport called with NULL data!";
37    NOTREACHED();
38    return;
39  }
40
41  userfeedback::ExtensionSubmit feedback_data;
42  data->PrepareReport(&feedback_data);
43
44  // Set whether we're reporting from ChromeOS or Chrome on another platform.
45  userfeedback::ChromeData chrome_data;
46#if defined(OS_CHROMEOS)
47  chrome_data.set_chrome_platform(
48      userfeedback::ChromeData_ChromePlatform_CHROME_OS);
49  userfeedback::ChromeOsData chrome_os_data;
50  chrome_os_data.set_category(
51      userfeedback::ChromeOsData_ChromeOsCategory_OTHER);
52  *(chrome_data.mutable_chrome_os_data()) = chrome_os_data;
53  feedback_data.set_product_id(kChromeOSProductId);
54#else
55  chrome_data.set_chrome_platform(
56      userfeedback::ChromeData_ChromePlatform_CHROME_BROWSER);
57  userfeedback::ChromeBrowserData chrome_browser_data;
58  chrome_browser_data.set_category(
59      userfeedback::ChromeBrowserData_ChromeBrowserCategory_OTHER);
60  *(chrome_data.mutable_chrome_browser_data()) = chrome_browser_data;
61  feedback_data.set_product_id(kChromeBrowserProductId);
62#endif
63
64  *(feedback_data.mutable_chrome_data()) = chrome_data;
65
66  // This pointer will eventually get deleted by the PostCleanup class, after
67  // we've either managed to successfully upload the report or died trying.
68  std::string post_body;
69  feedback_data.SerializeToString(&post_body);
70
71  feedback::FeedbackUploader *uploader =
72      feedback::FeedbackUploaderFactory::GetForBrowserContext(data->context());
73  uploader->QueueReport(post_body);
74}
75
76bool ZipString(const base::FilePath& filename,
77               const std::string& data, std::string* compressed_logs) {
78  base::FilePath temp_path;
79  base::FilePath zip_file;
80
81  // Create a temporary directory, put the logs into a file in it. Create
82  // another temporary file to receive the zip file in.
83  if (!base::CreateNewTempDirectory(base::FilePath::StringType(), &temp_path))
84    return false;
85  if (base::WriteFile(temp_path.Append(filename), data.c_str(), data.size()) ==
86      -1)
87    return false;
88
89  bool succeed = base::CreateTemporaryFile(&zip_file) &&
90      zip::Zip(temp_path, zip_file, false) &&
91      base::ReadFileToString(zip_file, compressed_logs);
92
93  base::DeleteFile(temp_path, true);
94  base::DeleteFile(zip_file, false);
95
96  return succeed;
97}
98
99}  // namespace feedback_util
100