Index: chrome/browser/media/webrtc_log_uploader.cc |
diff --git a/chrome/browser/media/webrtc_log_uploader.cc b/chrome/browser/media/webrtc_log_uploader.cc |
deleted file mode 100644 |
index f4dcdc06eb2b108309a33d738d8c1f2c58760645..0000000000000000000000000000000000000000 |
--- a/chrome/browser/media/webrtc_log_uploader.cc |
+++ /dev/null |
@@ -1,601 +0,0 @@ |
-// Copyright 2013 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 "chrome/browser/media/webrtc_log_uploader.h" |
- |
-#include <stddef.h> |
-#include <utility> |
- |
-#include "base/files/file_enumerator.h" |
-#include "base/files/file_path.h" |
-#include "base/files/file_util.h" |
-#include "base/logging.h" |
-#include "base/pickle.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/string_split.h" |
-#include "base/strings/stringprintf.h" |
-#include "base/time/time.h" |
-#include "build/build_config.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/media/media_url_constants.h" |
-#include "chrome/browser/media/webrtc_log_list.h" |
-#include "chrome/browser/media/webrtc_log_util.h" |
-#include "chrome/common/partial_circular_buffer.h" |
-#include "components/version_info/version_info.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "net/base/mime_util.h" |
-#include "net/url_request/url_fetcher.h" |
-#include "third_party/zlib/zlib.h" |
- |
-using content::BrowserThread; |
- |
-namespace { |
- |
-const int kLogCountLimit = 5; |
-const uint32_t kIntermediateCompressionBufferBytes = 256 * 1024; // 256 KB |
-const int kLogListLimitLines = 50; |
- |
-const char kUploadContentType[] = "multipart/form-data"; |
-const char kMultipartBoundary[] = |
- "----**--yradnuoBgoLtrapitluMklaTelgooG--**----"; |
- |
-const int kHttpResponseOk = 200; |
- |
-// Adds the header section for a gzip file to the multipart |post_data|. |
-void AddMultipartFileContentHeader(std::string* post_data, |
- const std::string& content_name) { |
- post_data->append("--"); |
- post_data->append(kMultipartBoundary); |
- post_data->append("\r\nContent-Disposition: form-data; name=\""); |
- post_data->append(content_name); |
- post_data->append("\"; filename=\""); |
- post_data->append(content_name + ".gz"); |
- post_data->append("\"\r\nContent-Type: application/gzip\r\n\r\n"); |
-} |
- |
-// Adds |compressed_log| to |post_data|. |
-void AddLogData(std::string* post_data, |
- const std::string& compressed_log) { |
- AddMultipartFileContentHeader(post_data, "webrtc_log"); |
- post_data->append(compressed_log); |
- post_data->append("\r\n"); |
-} |
- |
-// Adds the RTP dump data to |post_data|. |
-void AddRtpDumpData(std::string* post_data, |
- const std::string& name, |
- const std::string& dump_data) { |
- AddMultipartFileContentHeader(post_data, name); |
- post_data->append(dump_data.data(), dump_data.size()); |
- post_data->append("\r\n"); |
-} |
- |
-} // namespace |
- |
-WebRtcLogUploadDoneData::WebRtcLogUploadDoneData() {} |
- |
-WebRtcLogUploadDoneData::WebRtcLogUploadDoneData( |
- const WebRtcLogUploadDoneData& other) = default; |
- |
-WebRtcLogUploadDoneData::~WebRtcLogUploadDoneData() {} |
- |
-WebRtcLogUploader::WebRtcLogUploader() |
- : log_count_(0), |
- post_data_(NULL), |
- shutting_down_(false) { |
- file_thread_checker_.DetachFromThread(); |
-} |
- |
-WebRtcLogUploader::~WebRtcLogUploader() { |
- DCHECK(create_thread_checker_.CalledOnValidThread()); |
- DCHECK(upload_done_data_.empty()); |
- DCHECK(shutting_down_); |
-} |
- |
-bool WebRtcLogUploader::ApplyForStartLogging() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- if (log_count_ < kLogCountLimit && !shutting_down_) { |
- ++log_count_; |
- return true; |
- } |
- return false; |
-} |
- |
-void WebRtcLogUploader::LoggingStoppedDontUpload() { |
- DecreaseLogCount(); |
-} |
- |
-void WebRtcLogUploader::LoggingStoppedDoUpload( |
- std::unique_ptr<WebRtcLogBuffer> log_buffer, |
- std::unique_ptr<MetaDataMap> meta_data, |
- const WebRtcLogUploadDoneData& upload_done_data) { |
- DCHECK(file_thread_checker_.CalledOnValidThread()); |
- DCHECK(log_buffer.get()); |
- DCHECK(meta_data.get()); |
- DCHECK(!upload_done_data.log_path.empty()); |
- |
- std::string compressed_log; |
- CompressLog(&compressed_log, log_buffer.get()); |
- |
- std::string local_log_id; |
- |
- if (base::PathExists(upload_done_data.log_path)) { |
- WebRtcLogUtil::DeleteOldWebRtcLogFiles(upload_done_data.log_path); |
- |
- local_log_id = base::DoubleToString(base::Time::Now().ToDoubleT()); |
- base::FilePath log_file_path = |
- upload_done_data.log_path.AppendASCII(local_log_id) |
- .AddExtension(FILE_PATH_LITERAL(".gz")); |
- WriteCompressedLogToFile(compressed_log, log_file_path); |
- |
- base::FilePath log_list_path = |
- WebRtcLogList::GetWebRtcLogListFileForDirectory( |
- upload_done_data.log_path); |
- AddLocallyStoredLogInfoToUploadListFile(log_list_path, local_log_id); |
- } |
- |
- WebRtcLogUploadDoneData upload_done_data_with_log_id = upload_done_data; |
- upload_done_data_with_log_id.local_log_id = local_log_id; |
- PrepareMultipartPostData(compressed_log, std::move(meta_data), |
- upload_done_data_with_log_id); |
-} |
- |
-void WebRtcLogUploader::PrepareMultipartPostData( |
- const std::string& compressed_log, |
- std::unique_ptr<MetaDataMap> meta_data, |
- const WebRtcLogUploadDoneData& upload_done_data) { |
- DCHECK(file_thread_checker_.CalledOnValidThread()); |
- DCHECK(!compressed_log.empty()); |
- DCHECK(meta_data.get()); |
- |
- std::unique_ptr<std::string> post_data(new std::string()); |
- SetupMultipart(post_data.get(), |
- compressed_log, |
- upload_done_data.incoming_rtp_dump, |
- upload_done_data.outgoing_rtp_dump, |
- *meta_data.get()); |
- |
- // If a test has set the test string pointer, write to it and skip uploading. |
- // Still fire the upload callback so that we can run an extension API test |
- // using the test framework for that without hanging. |
- // TODO(grunell): Remove this when the api test for this feature is fully |
- // implemented according to the test plan. http://crbug.com/257329. |
- if (post_data_) { |
- *post_data_ = *post_data; |
- NotifyUploadDone(kHttpResponseOk, "", upload_done_data); |
- return; |
- } |
- |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&WebRtcLogUploader::UploadCompressedLog, |
- base::Unretained(this), upload_done_data, |
- base::Passed(&post_data))); |
-} |
- |
-void WebRtcLogUploader::UploadStoredLog( |
- const WebRtcLogUploadDoneData& upload_data) { |
- DCHECK(file_thread_checker_.CalledOnValidThread()); |
- DCHECK(!upload_data.local_log_id.empty()); |
- DCHECK(!upload_data.log_path.empty()); |
- |
- base::FilePath native_log_path = |
- upload_data.log_path.AppendASCII(upload_data.local_log_id) |
- .AddExtension(FILE_PATH_LITERAL(".gz")); |
- |
- std::string compressed_log; |
- if (!base::ReadFileToString(native_log_path, &compressed_log)) { |
- DPLOG(WARNING) << "Could not read WebRTC log file."; |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(upload_data.callback, false, "", "Log doesn't exist.")); |
- return; |
- } |
- |
- WebRtcLogUploadDoneData upload_data_with_rtp = upload_data; |
- |
- // Optimistically set the rtp paths to what they should be if they exist. |
- upload_data_with_rtp.incoming_rtp_dump = |
- upload_data.log_path.AppendASCII(upload_data.local_log_id) |
- .AddExtension(FILE_PATH_LITERAL(".rtp_in")); |
- |
- upload_data_with_rtp.outgoing_rtp_dump = |
- upload_data.log_path.AppendASCII(upload_data.local_log_id) |
- .AddExtension(FILE_PATH_LITERAL(".rtp_out")); |
- |
- std::unique_ptr<MetaDataMap> meta_data(new MetaDataMap()); |
- { |
- std::string meta_data_contents; |
- base::FilePath meta_path = |
- upload_data.log_path.AppendASCII(upload_data.local_log_id) |
- .AddExtension(FILE_PATH_LITERAL(".meta")); |
- if (base::ReadFileToString(meta_path, &meta_data_contents) && |
- !meta_data_contents.empty()) { |
- base::Pickle pickle(&meta_data_contents[0], meta_data_contents.size()); |
- base::PickleIterator it(pickle); |
- std::string key, value; |
- while (it.ReadString(&key) && it.ReadString(&value)) |
- (*meta_data.get())[key] = value; |
- } |
- } |
- |
- PrepareMultipartPostData(compressed_log, std::move(meta_data), |
- upload_data_with_rtp); |
-} |
- |
-void WebRtcLogUploader::LoggingStoppedDoStore( |
- const WebRtcLogPaths& log_paths, |
- const std::string& log_id, |
- std::unique_ptr<WebRtcLogBuffer> log_buffer, |
- std::unique_ptr<MetaDataMap> meta_data, |
- const WebRtcLoggingHandlerHost::GenericDoneCallback& done_callback) { |
- DCHECK(file_thread_checker_.CalledOnValidThread()); |
- DCHECK(!log_id.empty()); |
- DCHECK(log_buffer.get()); |
- DCHECK(!log_paths.log_path.empty()); |
- |
- WebRtcLogUtil::DeleteOldWebRtcLogFiles(log_paths.log_path); |
- |
- base::FilePath log_list_path = |
- WebRtcLogList::GetWebRtcLogListFileForDirectory(log_paths.log_path); |
- |
- // Store the native log with a ".gz" extension. |
- std::string compressed_log; |
- CompressLog(&compressed_log, log_buffer.get()); |
- base::FilePath native_log_path = log_paths.log_path.AppendASCII(log_id) |
- .AddExtension(FILE_PATH_LITERAL(".gz")); |
- WriteCompressedLogToFile(compressed_log, native_log_path); |
- AddLocallyStoredLogInfoToUploadListFile(log_list_path, log_id); |
- |
- // Move the rtp dump files to the log directory with a name of |
- // <log id>.rtp_[in|out]. |
- if (!log_paths.incoming_rtp_dump.empty()) { |
- base::FilePath rtp_path = log_paths.log_path.AppendASCII(log_id) |
- .AddExtension(FILE_PATH_LITERAL(".rtp_in")); |
- base::Move(log_paths.incoming_rtp_dump, rtp_path); |
- } |
- |
- if (!log_paths.outgoing_rtp_dump.empty()) { |
- base::FilePath rtp_path = log_paths.log_path.AppendASCII(log_id) |
- .AddExtension(FILE_PATH_LITERAL(".rtp_out")); |
- base::Move(log_paths.outgoing_rtp_dump, rtp_path); |
- } |
- |
- if (meta_data.get() && !meta_data->empty()) { |
- base::Pickle pickle; |
- for (const auto& it : *meta_data.get()) { |
- pickle.WriteString(it.first); |
- pickle.WriteString(it.second); |
- } |
- base::FilePath meta_path = log_paths.log_path.AppendASCII(log_id) |
- .AddExtension(FILE_PATH_LITERAL(".meta")); |
- base::WriteFile(meta_path, static_cast<const char*>(pickle.data()), |
- pickle.size()); |
- } |
- |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
- base::Bind(done_callback, true, "")); |
- |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&WebRtcLogUploader::DecreaseLogCount, base::Unretained(this))); |
-} |
- |
-void WebRtcLogUploader::StartShutdown() { |
- DCHECK(create_thread_checker_.CalledOnValidThread()); |
- |
- BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
- base::Bind(&WebRtcLogUploader::ShutdownOnIOThread, |
- base::Unretained(this))); |
-} |
- |
-void WebRtcLogUploader::OnURLFetchComplete( |
- const net::URLFetcher* source) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- DCHECK(upload_done_data_.find(source) != upload_done_data_.end()); |
- DCHECK(!shutting_down_); |
- int response_code = source->GetResponseCode(); |
- UploadDoneDataMap::iterator it = upload_done_data_.find(source); |
- if (it != upload_done_data_.end()) { |
- // The log path can be empty here if we failed getting it before. We still |
- // upload the log if that's the case. |
- std::string report_id; |
- if (response_code == kHttpResponseOk && |
- source->GetResponseAsString(&report_id) && |
- !it->second.log_path.empty()) { |
- // TODO(jiayl): Add the RTP dump records to chrome://webrtc-logs. |
- base::FilePath log_list_path = |
- WebRtcLogList::GetWebRtcLogListFileForDirectory(it->second.log_path); |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- base::Bind(&WebRtcLogUploader::AddUploadedLogInfoToUploadListFile, |
- base::Unretained(this), log_list_path, |
- it->second.local_log_id, report_id)); |
- } |
- NotifyUploadDone(response_code, report_id, it->second); |
- upload_done_data_.erase(it); |
- } |
- |
- delete source; |
-} |
- |
-void WebRtcLogUploader::OnURLFetchUploadProgress(const net::URLFetcher* source, |
- int64_t current, |
- int64_t total) {} |
- |
-void WebRtcLogUploader::SetupMultipart( |
- std::string* post_data, |
- const std::string& compressed_log, |
- const base::FilePath& incoming_rtp_dump, |
- const base::FilePath& outgoing_rtp_dump, |
- const std::map<std::string, std::string>& meta_data) { |
-#if defined(OS_WIN) |
- const char product[] = "Chrome"; |
-#elif defined(OS_MACOSX) |
- const char product[] = "Chrome_Mac"; |
-#elif defined(OS_LINUX) |
-#if !defined(ADDRESS_SANITIZER) |
- const char product[] = "Chrome_Linux"; |
-#else |
- const char product[] = "Chrome_Linux_ASan"; |
-#endif |
-#elif defined(OS_ANDROID) |
- const char product[] = "Chrome_Android"; |
-#elif defined(OS_CHROMEOS) |
- const char product[] = "Chrome_ChromeOS"; |
-#else |
-#error Platform not supported. |
-#endif |
- net::AddMultipartValueForUpload("prod", product, kMultipartBoundary, |
- "", post_data); |
- net::AddMultipartValueForUpload("ver", |
- version_info::GetVersionNumber() + "-webrtc", |
- kMultipartBoundary, "", post_data); |
- net::AddMultipartValueForUpload("guid", "0", kMultipartBoundary, |
- "", post_data); |
- net::AddMultipartValueForUpload("type", "webrtc_log", kMultipartBoundary, |
- "", post_data); |
- |
- // Add custom meta data. |
- for (const auto& it : meta_data) { |
- net::AddMultipartValueForUpload(it.first, it.second, kMultipartBoundary, "", |
- post_data); |
- } |
- |
- AddLogData(post_data, compressed_log); |
- |
- // Add the rtp dumps if they exist. |
- base::FilePath rtp_dumps[2] = {incoming_rtp_dump, outgoing_rtp_dump}; |
- static const char* kRtpDumpNames[2] = {"rtpdump_recv", "rtpdump_send"}; |
- |
- for (size_t i = 0; i < 2; ++i) { |
- if (!rtp_dumps[i].empty() && base::PathExists(rtp_dumps[i])) { |
- std::string dump_data; |
- if (base::ReadFileToString(rtp_dumps[i], &dump_data)) |
- AddRtpDumpData(post_data, kRtpDumpNames[i], dump_data); |
- } |
- } |
- |
- net::AddMultipartFinalDelimiterForUpload(kMultipartBoundary, post_data); |
-} |
- |
-void WebRtcLogUploader::CompressLog(std::string* compressed_log, |
- WebRtcLogBuffer* buffer) { |
- z_stream stream = {0}; |
- int result = deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, |
- // windowBits = 15 is default, 16 is added to |
- // produce a gzip header + trailer. |
- 15 + 16, |
- 8, // memLevel = 8 is default. |
- Z_DEFAULT_STRATEGY); |
- DCHECK_EQ(Z_OK, result); |
- |
- uint8_t intermediate_buffer[kIntermediateCompressionBufferBytes] = {0}; |
- ResizeForNextOutput(compressed_log, &stream); |
- uint32_t read = 0; |
- |
- PartialCircularBuffer read_buffer(buffer->Read()); |
- do { |
- if (stream.avail_in == 0) { |
- read = read_buffer.Read(&intermediate_buffer[0], |
- sizeof(intermediate_buffer)); |
- stream.next_in = &intermediate_buffer[0]; |
- stream.avail_in = read; |
- if (read != kIntermediateCompressionBufferBytes) |
- break; |
- } |
- result = deflate(&stream, Z_SYNC_FLUSH); |
- DCHECK_EQ(Z_OK, result); |
- if (stream.avail_out == 0) |
- ResizeForNextOutput(compressed_log, &stream); |
- } while (true); |
- |
- // Ensure we have enough room in the output buffer. Easier to always just do a |
- // resize than looping around and resize if needed. |
- if (stream.avail_out < kIntermediateCompressionBufferBytes) |
- ResizeForNextOutput(compressed_log, &stream); |
- |
- result = deflate(&stream, Z_FINISH); |
- DCHECK_EQ(Z_STREAM_END, result); |
- result = deflateEnd(&stream); |
- DCHECK_EQ(Z_OK, result); |
- |
- compressed_log->resize(compressed_log->size() - stream.avail_out); |
-} |
- |
-void WebRtcLogUploader::ResizeForNextOutput(std::string* compressed_log, |
- z_stream* stream) { |
- size_t old_size = compressed_log->size() - stream->avail_out; |
- compressed_log->resize(old_size + kIntermediateCompressionBufferBytes); |
- stream->next_out = reinterpret_cast<unsigned char*>( |
- &(*compressed_log)[old_size]); |
- stream->avail_out = kIntermediateCompressionBufferBytes; |
-} |
- |
-void WebRtcLogUploader::UploadCompressedLog( |
- const WebRtcLogUploadDoneData& upload_done_data, |
- std::unique_ptr<std::string> post_data) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- |
- DecreaseLogCount(); |
- |
- if (shutting_down_) |
- return; |
- |
- std::string content_type = kUploadContentType; |
- content_type.append("; boundary="); |
- content_type.append(kMultipartBoundary); |
- |
- std::unique_ptr<net::URLFetcher> url_fetcher(net::URLFetcher::Create( |
- GURL(chrome::kUploadURL), net::URLFetcher::POST, this)); |
- url_fetcher->SetUploadData(content_type, *post_data); |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
- base::Bind(&WebRtcLogUploader::SetRequestContextOnUIThread, |
- base::Unretained(this), base::Unretained(url_fetcher.release()), |
- upload_done_data)); |
-} |
- |
-void WebRtcLogUploader::SetRequestContextOnUIThread( |
- net::URLFetcher* url_fetcher, const WebRtcLogUploadDoneData& data) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- url_fetcher->SetRequestContext(g_browser_process->system_request_context()); |
- BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
- base::Bind(&WebRtcLogUploader::StartAndTrackRequestContext, |
- base::Unretained(this), base::Unretained(url_fetcher), data)); |
-} |
- |
-void WebRtcLogUploader::StartAndTrackRequestContext( |
- net::URLFetcher* url_fetcher, const WebRtcLogUploadDoneData& data) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- url_fetcher->Start(); |
- upload_done_data_[url_fetcher] = data; |
-} |
- |
-void WebRtcLogUploader::DecreaseLogCount() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- --log_count_; |
-} |
- |
-void WebRtcLogUploader::ShutdownOnIOThread() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- DCHECK(!shutting_down_); |
- |
- // Delete all URLFetchers first and clear the upload done map. |
- for (const auto& it : upload_done_data_) |
- delete it.first; |
- |
- upload_done_data_.clear(); |
- shutting_down_ = true; |
-} |
- |
-void WebRtcLogUploader::WriteCompressedLogToFile( |
- const std::string& compressed_log, |
- const base::FilePath& log_file_path) { |
- DCHECK(file_thread_checker_.CalledOnValidThread()); |
- DCHECK(!compressed_log.empty()); |
- base::WriteFile(log_file_path, &compressed_log[0], compressed_log.size()); |
-} |
- |
-void WebRtcLogUploader::AddLocallyStoredLogInfoToUploadListFile( |
- const base::FilePath& upload_list_path, |
- const std::string& local_log_id) { |
- DCHECK(file_thread_checker_.CalledOnValidThread()); |
- DCHECK(!upload_list_path.empty()); |
- DCHECK(!local_log_id.empty()); |
- |
- std::string contents; |
- |
- if (base::PathExists(upload_list_path)) { |
- if (!base::ReadFileToString(upload_list_path, &contents)) { |
- DPLOG(WARNING) << "Could not read WebRTC log list file."; |
- return; |
- } |
- |
- // Limit the number of log entries to |kLogListLimitLines| - 1, to make room |
- // for the new entry. Each line including the last ends with a '\n', so hit |
- // n will be before line n-1 (from the back). |
- int lf_count = 0; |
- int i = contents.size() - 1; |
- for (; i >= 0 && lf_count < kLogListLimitLines; --i) { |
- if (contents[i] == '\n') |
- ++lf_count; |
- } |
- if (lf_count >= kLogListLimitLines) { |
- // + 1 to compensate for the for loop decrease before the conditional |
- // check and + 1 to get the length. |
- contents.erase(0, i + 2); |
- } |
- } |
- |
- // Write the capture time and log ID to the log list file. Leave the upload |
- // time and report ID empty. |
- contents += ",," + local_log_id + |
- "," + base::DoubleToString(base::Time::Now().ToDoubleT()) + '\n'; |
- |
- int written = |
- base::WriteFile(upload_list_path, &contents[0], contents.size()); |
- if (written != static_cast<int>(contents.size())) { |
- DPLOG(WARNING) << "Could not write all data to WebRTC log list file: " |
- << written; |
- } |
-} |
- |
-void WebRtcLogUploader::AddUploadedLogInfoToUploadListFile( |
- const base::FilePath& upload_list_path, |
- const std::string& local_log_id, |
- const std::string& report_id) { |
- DCHECK(file_thread_checker_.CalledOnValidThread()); |
- DCHECK(!upload_list_path.empty()); |
- DCHECK(!local_log_id.empty()); |
- DCHECK(!report_id.empty()); |
- |
- std::string contents; |
- |
- if (base::PathExists(upload_list_path)) { |
- if (!base::ReadFileToString(upload_list_path, &contents)) { |
- DPLOG(WARNING) << "Could not read WebRTC log list file."; |
- return; |
- } |
- } |
- |
- // Write the Unix time and report ID to the log list file. We should be able |
- // to find the local log ID, in that case insert the data into the existing |
- // line. Otherwise add it in the end. |
- base::Time time_now = base::Time::Now(); |
- std::string time_now_str = base::DoubleToString(time_now.ToDoubleT()); |
- size_t pos = contents.find(",," + local_log_id); |
- if (pos != std::string::npos) { |
- contents.insert(pos, time_now_str); |
- contents.insert(pos + time_now_str.length() + 1, report_id); |
- } else { |
- contents += time_now_str + "," + report_id + ",," + time_now_str + "\n"; |
- } |
- |
- int written = |
- base::WriteFile(upload_list_path, &contents[0], contents.size()); |
- if (written != static_cast<int>(contents.size())) { |
- DPLOG(WARNING) << "Could not write all data to WebRTC log list file: " |
- << written; |
- } |
-} |
- |
-void WebRtcLogUploader::NotifyUploadDone( |
- int response_code, |
- const std::string& report_id, |
- const WebRtcLogUploadDoneData& upload_done_data) { |
- BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
- base::Bind(&WebRtcLoggingHandlerHost::UploadLogDone, |
- upload_done_data.host)); |
- if (!upload_done_data.callback.is_null()) { |
- bool success = response_code == kHttpResponseOk; |
- std::string error_message; |
- if (!success) { |
- error_message = "Uploading failed, response code: " + |
- base::IntToString(response_code); |
- } |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
- base::Bind(upload_done_data.callback, success, |
- report_id, error_message)); |
- } |
-} |