OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. | |
Zachary Kuznia
2014/06/25 00:05:53
nit: no (c)
zel
2014/06/27 19:31:00
Done.
| |
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/chromeos/system_logs/debug_log_writer.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/bind_helpers.h" | |
9 #include "base/file_util.h" | |
10 #include "base/files/file.h" | |
11 #include "chrome/common/logging_chrome.h" | |
12 #include "chromeos/dbus/dbus_thread_manager.h" | |
13 #include "chromeos/dbus/debug_daemon_client.h" | |
14 #include "content/public/browser/browser_thread.h" | |
15 | |
16 namespace chromeos { | |
17 | |
18 namespace { | |
19 | |
20 // Called upon completion of |WriteDebugLogToFile|. Closes file | |
21 // descriptor, deletes log file in the case of failure and calls | |
22 // |callback|. | |
23 void WriteDebugLogToFileCompleted( | |
24 const DebugLogWriter::StoreDebugLogsCallback& callback, | |
25 const base::FilePath& file_path, | |
26 bool succeeded) { | |
27 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
28 if (!succeeded) { | |
29 bool posted = content::BrowserThread::PostBlockingPoolTaskAndReply( | |
30 FROM_HERE, | |
31 base::Bind(base::IgnoreResult(&base::DeleteFile), file_path, false), | |
32 base::Bind(callback, file_path, false)); | |
33 DCHECK(posted); | |
34 return; | |
35 } | |
36 callback.Run(file_path, true); | |
37 } | |
38 | |
39 // Stores into |file_path| debug logs in the .tgz format. Calls | |
40 // |callback| upon completion. | |
41 void WriteDebugLogToFile( | |
42 const DebugLogWriter::StoreDebugLogsCallback& callback, | |
43 base::File* file, | |
44 const base::FilePath& file_path) { | |
45 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
46 if (!file->IsValid()) { | |
47 LOG(ERROR) << | |
Zachary Kuznia
2014/06/25 00:05:53
I think we currently prefer VLOG(1)
zel
2014/06/27 19:31:00
VLOG(1) gets recorded nowhere. This is really an e
| |
48 "Can't create debug log file: " << file_path.AsUTF8Unsafe() << ", " << | |
49 "error: " << file->error_details(); | |
50 return; | |
51 } | |
52 chromeos::DBusThreadManager::Get()->GetDebugDaemonClient()->GetDebugLogs( | |
53 file->Pass(), | |
54 base::Bind(&WriteDebugLogToFileCompleted, callback, file_path)); | |
55 } | |
56 | |
57 } // namespace | |
58 | |
59 // static. | |
60 void DebugLogWriter::StoreLogs( | |
61 const base::FilePath& fileshelf, | |
62 const StoreDebugLogsCallback& callback) { | |
63 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
64 DCHECK(!callback.is_null()); | |
65 | |
66 const base::FilePath::CharType kLogFileName[] = | |
67 FILE_PATH_LITERAL("debug-log.tgz"); | |
68 | |
69 base::FilePath file_path = fileshelf.Append(kLogFileName); | |
70 file_path = logging::GenerateTimestampedName(file_path, base::Time::Now()); | |
71 | |
72 int flags = base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE; | |
xiaowenx
2014/06/25 05:30:44
Two spaces here after "=", intentional?
zel
2014/06/27 19:31:00
Done.
| |
73 base::File* file = new base::File; | |
Zachary Kuznia
2014/06/25 00:05:53
Is there a reason not to make this a scoped_ptr?
| |
74 bool posted = content::BrowserThread::PostBlockingPoolTaskAndReply( | |
75 FROM_HERE, | |
76 base::Bind(&base::File::Initialize, | |
77 base::Unretained(file), file_path, flags), | |
78 base::Bind(&WriteDebugLogToFile, callback, base::Owned(file), file_path)); | |
79 DCHECK(posted); | |
80 } | |
81 | |
82 } // namespace chromeos | |
OLD | NEW |