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 |
index cb2e1386e97b6d699d0fce2bab836f91370ea5c7..ce20a0478f4af47aa881984507e611e2c474b28a 100644 |
--- a/chrome/browser/media/webrtc_log_uploader.cc |
+++ b/chrome/browser/media/webrtc_log_uploader.cc |
@@ -8,6 +8,7 @@ |
#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" |
@@ -49,10 +50,9 @@ void AddMultipartFileContentHeader(std::string* post_data, |
// Adds |compressed_log| to |post_data|. |
void AddLogData(std::string* post_data, |
- const std::vector<uint8>& compressed_log) { |
+ const std::string& compressed_log) { |
AddMultipartFileContentHeader(post_data, "webrtc_log"); |
- post_data->append(reinterpret_cast<const char*>(&compressed_log[0]), |
- compressed_log.size()); |
+ post_data->append(compressed_log); |
post_data->append("\r\n"); |
} |
@@ -136,17 +136,16 @@ void WebRtcLogUploader::LoggingStoppedDontUpload() { |
} |
void WebRtcLogUploader::LoggingStoppedDoUpload( |
- scoped_ptr<unsigned char[]> log_buffer, |
- uint32 length, |
- const std::map<std::string, std::string>& meta_data, |
+ scoped_ptr<WebRtcLogBuffer> log_buffer, |
+ scoped_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::vector<uint8> compressed_log; |
- CompressLog( |
- &compressed_log, reinterpret_cast<uint8*>(&log_buffer[0]), length); |
+ std::string compressed_log; |
+ CompressLog(&compressed_log, log_buffer.get()); |
std::string local_log_id; |
@@ -167,13 +166,24 @@ void WebRtcLogUploader::LoggingStoppedDoUpload( |
WebRtcLogUploadDoneData upload_done_data_with_log_id = upload_done_data; |
upload_done_data_with_log_id.local_log_id = local_log_id; |
+ UploadCompressedLog(compressed_log, meta_data.Pass(), |
+ upload_done_data_with_log_id); |
+} |
+ |
+void WebRtcLogUploader::UploadCompressedLog( |
+ const std::string& compressed_log, |
+ scoped_ptr<MetaDataMap> meta_data, |
+ const WebRtcLogUploadDoneData& upload_done_data) { |
+ DCHECK(file_thread_checker_.CalledOnValidThread()); |
+ DCHECK(!compressed_log.empty()); |
+ DCHECK(meta_data.get()); |
scoped_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); |
+ *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 |
@@ -182,7 +192,7 @@ void WebRtcLogUploader::LoggingStoppedDoUpload( |
// implemented according to the test plan. http://crbug.com/257329. |
if (post_data_) { |
*post_data_ = *post_data; |
- NotifyUploadDone(kHttpResponseOk, "", upload_done_data_with_log_id); |
+ NotifyUploadDone(kHttpResponseOk, "", upload_done_data); |
return; |
} |
@@ -191,13 +201,117 @@ void WebRtcLogUploader::LoggingStoppedDoUpload( |
FROM_HERE, |
base::Bind(&WebRtcLogUploader::CreateAndStartURLFetcher, |
base::Unretained(this), |
- upload_done_data_with_log_id, |
+ upload_done_data, |
Passed(&post_data))); |
content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, |
base::Bind(&WebRtcLogUploader::DecreaseLogCount, base::Unretained(this))); |
} |
+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."; |
+ content::BrowserThread::PostTask( |
+ content::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")); |
+ |
+ scoped_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()) { |
+ Pickle pickle(&meta_data_contents[0], meta_data_contents.size()); |
+ PickleIterator it(pickle); |
+ std::string key, value; |
+ while (it.ReadString(&key) && it.ReadString(&value)) |
+ (*meta_data.get())[key] = value; |
+ } |
+ } |
+ |
+ UploadCompressedLog(compressed_log, meta_data.Pass(), upload_data_with_rtp); |
+} |
+ |
+void WebRtcLogUploader::LoggingStoppedDoStore( |
+ const WebRtcLogPaths& log_paths, |
+ const std::string& log_id, |
+ scoped_ptr<WebRtcLogBuffer> log_buffer, |
+ scoped_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()) { |
+ 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()); |
+ } |
+ |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::UI, FROM_HERE, |
+ base::Bind(done_callback, true, "")); |
+} |
+ |
void WebRtcLogUploader::StartShutdown() { |
DCHECK(create_thread_checker_.CalledOnValidThread()); |
DCHECK(!shutting_down_); |
@@ -214,7 +328,7 @@ void WebRtcLogUploader::StartShutdown() { |
void WebRtcLogUploader::SetupMultipart( |
std::string* post_data, |
- const std::vector<uint8>& compressed_log, |
+ 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) { |
@@ -269,11 +383,8 @@ void WebRtcLogUploader::SetupMultipart( |
net::AddMultipartFinalDelimiterForUpload(kMultipartBoundary, post_data); |
} |
-void WebRtcLogUploader::CompressLog(std::vector<uint8>* compressed_log, |
- uint8* input, |
- uint32 input_size) { |
- PartialCircularBuffer read_pcb(input, input_size); |
- |
+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 |
@@ -287,10 +398,11 @@ void WebRtcLogUploader::CompressLog(std::vector<uint8>* compressed_log, |
ResizeForNextOutput(compressed_log, &stream); |
uint32 read = 0; |
+ PartialCircularBuffer read_buffer(buffer->Read()); |
do { |
if (stream.avail_in == 0) { |
- read = read_pcb.Read(&intermediate_buffer[0], |
- kIntermediateCompressionBufferBytes); |
+ read = read_buffer.Read(&intermediate_buffer[0], |
+ sizeof(intermediate_buffer)); |
stream.next_in = &intermediate_buffer[0]; |
stream.avail_in = read; |
if (read != kIntermediateCompressionBufferBytes) |
@@ -315,11 +427,12 @@ void WebRtcLogUploader::CompressLog(std::vector<uint8>* compressed_log, |
compressed_log->resize(compressed_log->size() - stream.avail_out); |
} |
-void WebRtcLogUploader::ResizeForNextOutput(std::vector<uint8>* compressed_log, |
+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 = &(*compressed_log)[old_size]; |
+ stream->next_out = reinterpret_cast<unsigned char*>( |
+ &(*compressed_log)[old_size]); |
stream->avail_out = kIntermediateCompressionBufferBytes; |
} |
@@ -349,13 +462,11 @@ void WebRtcLogUploader::DecreaseLogCount() { |
} |
void WebRtcLogUploader::WriteCompressedLogToFile( |
- const std::vector<uint8>& compressed_log, |
+ 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, |
- reinterpret_cast<const char*>(&compressed_log[0]), |
- compressed_log.size()); |
+ base::WriteFile(log_file_path, &compressed_log[0], compressed_log.size()); |
} |
void WebRtcLogUploader::AddLocallyStoredLogInfoToUploadListFile( |