Index: chrome/browser/media/webrtc_logging_handler_host.cc |
diff --git a/chrome/browser/media/webrtc_logging_handler_host.cc b/chrome/browser/media/webrtc_logging_handler_host.cc |
index 3696ff7be997318a37dc13e02339037a2b26d9b7..c1180173cd58657a8f409f7444e8892683db0e30 100644 |
--- a/chrome/browser/media/webrtc_logging_handler_host.cc |
+++ b/chrome/browser/media/webrtc_logging_handler_host.cc |
@@ -24,7 +24,6 @@ |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/chrome_version_info.h" |
#include "chrome/common/media/webrtc_logging_messages.h" |
-#include "chrome/common/partial_circular_buffer.h" |
#include "chromeos/settings/cros_settings_names.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/content_browser_client.h" |
@@ -51,12 +50,6 @@ using content::BrowserThread; |
namespace { |
-#if defined(OS_ANDROID) |
-const size_t kWebRtcLogSize = 1 * 1024 * 1024; // 1 MB |
-#else |
-const size_t kWebRtcLogSize = 6 * 1024 * 1024; // 6 MB |
-#endif |
- |
const char kLogNotStoppedOrNoLogOpen[] = |
"Logging not stopped or no log open."; |
@@ -108,8 +101,61 @@ void FormatMetaDataAsLogMessage( |
message->resize(message->size() - 1); |
} |
+void FireGenericDoneCallback( |
+ const WebRtcLoggingHandlerHost::GenericDoneCallback& callback, |
+ bool success, |
+ const std::string& error_message) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ DCHECK(!callback.is_null()); |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(callback, success, error_message)); |
+} |
+ |
+void FireAndResetGenericDoneCallback( |
+ WebRtcLoggingHandlerHost::GenericDoneCallback* callback, |
+ bool success, |
+ const std::string& error_message) { |
+ FireGenericDoneCallback(*callback, success, error_message); |
+ callback->Reset(); |
+} |
+ |
} // namespace |
+WebRtcLogBuffer::WebRtcLogBuffer() |
+ : buffer_(), |
+ circular_(&buffer_[0], sizeof(buffer_), sizeof(buffer_) / 2, false), |
+ read_only_(false) { |
+} |
+ |
+WebRtcLogBuffer::~WebRtcLogBuffer() { |
+ DCHECK(read_only_ || thread_checker_.CalledOnValidThread()); |
+} |
+ |
+void WebRtcLogBuffer::Log(const std::string& message) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(!read_only_); |
+ circular_.Write(message.c_str(), message.length()); |
+ const char eol = '\n'; |
+ circular_.Write(&eol, 1); |
+} |
+ |
+PartialCircularBuffer WebRtcLogBuffer::Read() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(read_only_); |
+ return PartialCircularBuffer(&buffer_[0], sizeof(buffer_)); |
+} |
+ |
+void WebRtcLogBuffer::SetComplete() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK(!read_only_) << "Already set? (programmer error)"; |
+ read_only_ = true; |
+ // Detach from the current thread so that we can check reads on a different |
+ // thread. This is to make sure that Read()s still happen on one thread only. |
+ thread_checker_.DetachFromThread(); |
+} |
+ |
WebRtcLoggingHandlerHost::WebRtcLoggingHandlerHost(Profile* profile) |
: BrowserMessageFilter(WebRtcLoggingMsgStart), |
profile_(profile), |
@@ -121,26 +167,30 @@ WebRtcLoggingHandlerHost::WebRtcLoggingHandlerHost(Profile* profile) |
WebRtcLoggingHandlerHost::~WebRtcLoggingHandlerHost() {} |
void WebRtcLoggingHandlerHost::SetMetaData( |
- const MetaDataMap& meta_data, |
+ scoped_ptr<MetaDataMap> meta_data, |
const GenericDoneCallback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
DCHECK(!callback.is_null()); |
std::string error_message; |
if (logging_state_ == CLOSED) { |
- meta_data_ = meta_data; |
+ if (!meta_data_.get()) |
+ meta_data_ = meta_data.Pass(); |
} else if (logging_state_ == STARTED) { |
- meta_data_ = meta_data; |
std::string meta_data_message; |
- FormatMetaDataAsLogMessage(meta_data_, &meta_data_message); |
+ FormatMetaDataAsLogMessage(*meta_data.get(), &meta_data_message); |
LogToCircularBuffer(meta_data_message); |
} else { |
error_message = "Meta data must be set before stop or upload."; |
} |
- bool success = error_message.empty(); |
- content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, |
- base::Bind(callback, success, |
- error_message)); |
+ |
+ if (error_message.empty() && meta_data.get()) { |
+ // Keep the meta data around for uploading separately from the log. |
+ for (const auto& it : *meta_data.get()) |
+ (*meta_data_.get())[it.first] = it.second; |
+ } |
+ |
+ FireGenericDoneCallback(callback, error_message.empty(), error_message); |
} |
void WebRtcLoggingHandlerHost::StartLogging( |
@@ -148,14 +198,14 @@ void WebRtcLoggingHandlerHost::StartLogging( |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
DCHECK(!callback.is_null()); |
- start_callback_ = callback; |
if (logging_state_ != CLOSED) { |
- FireGenericDoneCallback(&start_callback_, false, "A log is already open"); |
+ FireGenericDoneCallback(callback, false, "A log is already open"); |
return; |
} |
+ |
logging_state_ = STARTING; |
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( |
- &WebRtcLoggingHandlerHost::StartLoggingIfAllowed, this)); |
+ &WebRtcLoggingHandlerHost::StartLoggingIfAllowed, this, callback)); |
} |
void WebRtcLoggingHandlerHost::StopLogging( |
@@ -163,11 +213,12 @@ void WebRtcLoggingHandlerHost::StopLogging( |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
DCHECK(!callback.is_null()); |
- stop_callback_ = callback; |
if (logging_state_ != STARTED) { |
- FireGenericDoneCallback(&stop_callback_, false, "Logging not started"); |
+ FireGenericDoneCallback(callback, false, "Logging not started"); |
return; |
} |
+ |
+ stop_callback_ = callback; |
logging_state_ = STOPPING; |
Send(new WebRtcLoggingMsg_StopLogging()); |
} |
@@ -184,14 +235,38 @@ void WebRtcLoggingHandlerHost::UploadLog(const UploadDoneCallback& callback) { |
return; |
} |
- upload_callback_ = callback; |
- logging_state_ = UPLOADING; |
content::BrowserThread::PostTaskAndReplyWithResult( |
content::BrowserThread::FILE, |
FROM_HERE, |
base::Bind(&WebRtcLoggingHandlerHost::GetLogDirectoryAndEnsureExists, |
this), |
- base::Bind(&WebRtcLoggingHandlerHost::TriggerUpload, this)); |
+ base::Bind(&WebRtcLoggingHandlerHost::TriggerUpload, this, callback)); |
+} |
+ |
+void WebRtcLoggingHandlerHost::UploadStoredLog( |
+ const std::string& log_id, |
+ const UploadDoneCallback& callback) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ DCHECK(!callback.is_null()); |
+ |
+ content::BrowserThread::PostTask(content::BrowserThread::FILE, |
+ FROM_HERE, |
+ base::Bind(&WebRtcLoggingHandlerHost::UploadStoredLogOnFileThread, |
+ this, log_id, callback)); |
+} |
+ |
+void WebRtcLoggingHandlerHost::UploadStoredLogOnFileThread( |
+ const std::string& log_id, |
+ const UploadDoneCallback& callback) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
+ |
+ WebRtcLogUploadDoneData upload_data; |
+ upload_data.log_path = GetLogDirectoryAndEnsureExists(); |
+ upload_data.callback = callback; |
+ upload_data.host = this; |
+ upload_data.local_log_id = log_id; |
+ |
+ g_browser_process->webrtc_log_uploader()->UploadStoredLog(upload_data); |
} |
void WebRtcLoggingHandlerHost::UploadLogDone() { |
@@ -203,19 +278,62 @@ void WebRtcLoggingHandlerHost::DiscardLog(const GenericDoneCallback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
DCHECK(!callback.is_null()); |
- GenericDoneCallback discard_callback = callback; |
if (logging_state_ != STOPPED) { |
- FireGenericDoneCallback(&discard_callback, false, |
- kLogNotStoppedOrNoLogOpen); |
+ FireGenericDoneCallback(callback, false, kLogNotStoppedOrNoLogOpen); |
return; |
} |
g_browser_process->webrtc_log_uploader()->LoggingStoppedDontUpload(); |
- circular_buffer_.reset(); |
log_buffer_.reset(); |
+ meta_data_.reset(); |
logging_state_ = CLOSED; |
rtp_dump_handler_.reset(); |
stop_rtp_dump_callback_.Reset(); |
- FireGenericDoneCallback(&discard_callback, true, ""); |
+ FireGenericDoneCallback(callback, true, ""); |
+} |
+ |
+// Stores the log locally using a hash of log_id + security origin. |
+void WebRtcLoggingHandlerHost::StoreLog( |
+ const std::string& log_id, |
+ const GenericDoneCallback& callback) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ DCHECK(!callback.is_null()); |
+ |
+ if (logging_state_ != STOPPED) { |
+ FireGenericDoneCallback(callback, false, kLogNotStoppedOrNoLogOpen); |
+ return; |
+ } |
+ |
+ if (rtp_dump_handler_) { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(stop_rtp_dump_callback_, true, true)); |
+ |
+ rtp_dump_handler_->StopOngoingDumps( |
+ base::Bind(&WebRtcLoggingHandlerHost::StoreLogContinue, |
+ this, log_id, callback)); |
+ return; |
+ } |
+ |
+ StoreLogContinue(log_id, callback); |
+} |
+ |
+void WebRtcLoggingHandlerHost::StoreLogContinue( |
+ const std::string& log_id, |
+ const GenericDoneCallback& callback) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ DCHECK(!callback.is_null()); |
+ |
+ scoped_ptr<WebRtcLogPaths> log_paths(new WebRtcLogPaths()); |
+ ReleaseRtpDumps(log_paths.get()); |
+ |
+ content::BrowserThread::PostTaskAndReplyWithResult( |
+ content::BrowserThread::FILE, |
+ FROM_HERE, |
+ base::Bind(&WebRtcLoggingHandlerHost::GetLogDirectoryAndEnsureExists, |
+ this), |
+ base::Bind(&WebRtcLoggingHandlerHost::StoreLogInDirectory, this, log_id, |
+ Passed(&log_paths), callback)); |
} |
void WebRtcLoggingHandlerHost::LogMessage(const std::string& message) { |
@@ -252,8 +370,7 @@ void WebRtcLoggingHandlerHost::StartRtpDump( |
return; |
} |
- GenericDoneCallback start_callback = callback; |
- DoStartRtpDump(type, &start_callback); |
+ DoStartRtpDump(type, callback); |
} |
void WebRtcLoggingHandlerHost::StopRtpDump( |
@@ -263,9 +380,7 @@ void WebRtcLoggingHandlerHost::StopRtpDump( |
DCHECK(!callback.is_null()); |
if (!rtp_dump_handler_) { |
- GenericDoneCallback stop_callback = callback; |
- FireGenericDoneCallback( |
- &stop_callback, false, "RTP dump has not been started."); |
+ FireGenericDoneCallback(callback, false, "RTP dump has not been started."); |
return; |
} |
@@ -317,7 +432,6 @@ void WebRtcLoggingHandlerHost::OnChannelClosing() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
if (logging_state_ == STARTED || logging_state_ == STOPPED) { |
if (upload_log_on_render_close_) { |
- logging_state_ = UPLOADING; |
logging_started_time_ = base::Time(); |
content::BrowserThread::PostTaskAndReplyWithResult( |
@@ -325,7 +439,8 @@ void WebRtcLoggingHandlerHost::OnChannelClosing() { |
FROM_HERE, |
base::Bind(&WebRtcLoggingHandlerHost::GetLogDirectoryAndEnsureExists, |
this), |
- base::Bind(&WebRtcLoggingHandlerHost::TriggerUpload, this)); |
+ base::Bind(&WebRtcLoggingHandlerHost::TriggerUpload, this, |
+ UploadDoneCallback())); |
} else { |
g_browser_process->webrtc_log_uploader()->LoggingStoppedDontUpload(); |
} |
@@ -379,37 +494,46 @@ void WebRtcLoggingHandlerHost::OnLoggingStoppedInRenderer() { |
} |
logging_started_time_ = base::Time(); |
logging_state_ = STOPPED; |
- FireGenericDoneCallback(&stop_callback_, true, ""); |
+ FireAndResetGenericDoneCallback(&stop_callback_, true, ""); |
} |
-void WebRtcLoggingHandlerHost::StartLoggingIfAllowed() { |
+void WebRtcLoggingHandlerHost::StartLoggingIfAllowed( |
+ const GenericDoneCallback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!g_browser_process->webrtc_log_uploader()->ApplyForStartLogging()) { |
- logging_state_ = CLOSED; |
- FireGenericDoneCallback( |
- &start_callback_, false, "Cannot start, maybe the maximum number of " |
- "simultaneuos logs has been reached."); |
- return; |
- } |
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind( |
- &WebRtcLoggingHandlerHost::DoStartLogging, this)); |
+ &WebRtcLoggingHandlerHost::DoStartLogging, this, |
+ g_browser_process->webrtc_log_uploader()->ApplyForStartLogging(), |
+ callback)); |
} |
-void WebRtcLoggingHandlerHost::DoStartLogging() { |
+void WebRtcLoggingHandlerHost::DoStartLogging( |
+ bool permissions_granted, |
+ const GenericDoneCallback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ if (logging_state_ != STARTING) { |
+ FireGenericDoneCallback(callback, false, "Logging cancelled."); |
+ return; |
+ } |
+ |
+ if (!permissions_granted) { |
+ logging_state_ = CLOSED; |
+ FireGenericDoneCallback(callback, false, |
+ "Cannot start, maybe the maximum number of " |
+ "simultaneuos logs has been reached."); |
+ return; |
+ } |
- log_buffer_.reset(new unsigned char[kWebRtcLogSize]); |
- circular_buffer_.reset( |
- new PartialCircularBuffer(log_buffer_.get(), |
- kWebRtcLogSize, |
- kWebRtcLogSize / 2, |
- false)); |
+ DCHECK(!log_buffer_.get()); |
+ log_buffer_.reset(new WebRtcLogBuffer()); |
+ if (!meta_data_.get()) |
+ meta_data_.reset(new MetaDataMap()); |
BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, base::Bind( |
- &WebRtcLoggingHandlerHost::LogInitialInfoOnFileThread, this)); |
+ &WebRtcLoggingHandlerHost::LogInitialInfoOnFileThread, this, callback)); |
} |
-void WebRtcLoggingHandlerHost::LogInitialInfoOnFileThread() { |
+void WebRtcLoggingHandlerHost::LogInitialInfoOnFileThread( |
+ const GenericDoneCallback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
net::NetworkInterfaceList network_list; |
@@ -417,12 +541,18 @@ void WebRtcLoggingHandlerHost::LogInitialInfoOnFileThread() { |
net::EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES); |
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind( |
- &WebRtcLoggingHandlerHost::LogInitialInfoOnIOThread, this, network_list)); |
+ &WebRtcLoggingHandlerHost::LogInitialInfoOnIOThread, this, network_list, |
+ callback)); |
} |
void WebRtcLoggingHandlerHost::LogInitialInfoOnIOThread( |
- const net::NetworkInterfaceList& network_list) { |
+ const net::NetworkInterfaceList& network_list, |
+ const GenericDoneCallback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ if (logging_state_ != STARTING) { |
+ FireGenericDoneCallback(callback, false, "Logging cancelled."); |
+ return; |
+ } |
// Log start time (current time). We don't use base/i18n/time_formatting.h |
// here because we don't want the format of the current locale. |
@@ -433,9 +563,9 @@ void WebRtcLoggingHandlerHost::LogInitialInfoOnIOThread( |
now.day_of_month, now.hour, now.minute, now.second)); |
// Write metadata if received before logging started. |
- if (!meta_data_.empty()) { |
+ if (meta_data_.get() && !meta_data_->empty()) { |
std::string info; |
- FormatMetaDataAsLogMessage(meta_data_, &info); |
+ FormatMetaDataAsLogMessage(*meta_data_.get(), &info); |
LogToCircularBuffer(info); |
} |
@@ -502,23 +632,23 @@ void WebRtcLoggingHandlerHost::LogInitialInfoOnIOThread( |
net::NetworkChangeNotifier::ConnectionTypeToString(it->type)); |
} |
- NotifyLoggingStarted(); |
+ NotifyLoggingStarted(callback); |
} |
-void WebRtcLoggingHandlerHost::NotifyLoggingStarted() { |
+void WebRtcLoggingHandlerHost::NotifyLoggingStarted( |
+ const GenericDoneCallback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ DCHECK_EQ(logging_state_, STARTING); |
Send(new WebRtcLoggingMsg_StartLogging()); |
logging_started_time_ = base::Time::Now(); |
logging_state_ = STARTED; |
- FireGenericDoneCallback(&start_callback_, true, ""); |
+ FireGenericDoneCallback(callback, true, ""); |
} |
void WebRtcLoggingHandlerHost::LogToCircularBuffer(const std::string& message) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- DCHECK(circular_buffer_.get()); |
- circular_buffer_->Write(message.c_str(), message.length()); |
- const char eol = '\n'; |
- circular_buffer_->Write(&eol, 1); |
+ DCHECK_NE(logging_state_, CLOSED); |
+ log_buffer_->Log(message); |
} |
base::FilePath WebRtcLoggingHandlerHost::GetLogDirectoryAndEnsureExists() { |
@@ -534,9 +664,9 @@ base::FilePath WebRtcLoggingHandlerHost::GetLogDirectoryAndEnsureExists() { |
} |
void WebRtcLoggingHandlerHost::TriggerUpload( |
+ const UploadDoneCallback& callback, |
const base::FilePath& log_directory) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- DCHECK_EQ(logging_state_, UPLOADING); |
if (rtp_dump_handler_) { |
BrowserThread::PostTask( |
@@ -547,60 +677,57 @@ void WebRtcLoggingHandlerHost::TriggerUpload( |
rtp_dump_handler_->StopOngoingDumps( |
base::Bind(&WebRtcLoggingHandlerHost::DoUploadLogAndRtpDumps, |
this, |
- log_directory)); |
+ log_directory, |
+ callback)); |
return; |
} |
- DoUploadLogAndRtpDumps(log_directory); |
+ DoUploadLogAndRtpDumps(log_directory, callback); |
} |
-void WebRtcLoggingHandlerHost::DoUploadLogAndRtpDumps( |
- const base::FilePath& log_directory) { |
- WebRtcLogUploadDoneData upload_done_data; |
- upload_done_data.log_path = log_directory; |
+void WebRtcLoggingHandlerHost::StoreLogInDirectory( |
+ const std::string& log_id, |
+ scoped_ptr<WebRtcLogPaths> log_paths, |
+ const GenericDoneCallback& done_callback, |
+ const base::FilePath& directory) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ log_paths->log_path = directory; |
- if (rtp_dump_handler_) { |
- WebRtcRtpDumpHandler::ReleasedDumps rtp_dumps( |
- rtp_dump_handler_->ReleaseDumps()); |
- upload_done_data.incoming_rtp_dump = rtp_dumps.incoming_dump_path; |
- upload_done_data.outgoing_rtp_dump = rtp_dumps.outgoing_dump_path; |
+ log_buffer_->SetComplete(); |
+ BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
+ base::Bind(&WebRtcLogUploader::LoggingStoppedDoStore, |
+ base::Unretained(g_browser_process->webrtc_log_uploader()), |
+ *log_paths.get(), log_id, Passed(&log_buffer_), Passed(&meta_data_), |
+ done_callback)); |
- rtp_dump_handler_.reset(); |
- stop_rtp_dump_callback_.Reset(); |
- } |
+ logging_state_ = CLOSED; |
+} |
+ |
+void WebRtcLoggingHandlerHost::DoUploadLogAndRtpDumps( |
+ const base::FilePath& log_directory, |
+ const UploadDoneCallback& callback) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- upload_done_data.callback = upload_callback_; |
+ WebRtcLogUploadDoneData upload_done_data; |
+ upload_done_data.log_path = log_directory; |
+ upload_done_data.callback = callback; |
upload_done_data.host = this; |
- upload_callback_.Reset(); |
+ ReleaseRtpDumps(&upload_done_data); |
+ log_buffer_->SetComplete(); |
BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, base::Bind( |
&WebRtcLogUploader::LoggingStoppedDoUpload, |
base::Unretained(g_browser_process->webrtc_log_uploader()), |
Passed(&log_buffer_), |
- kWebRtcLogSize, |
- meta_data_, |
+ Passed(&meta_data_), |
upload_done_data)); |
- meta_data_.clear(); |
- circular_buffer_.reset(); |
-} |
- |
-void WebRtcLoggingHandlerHost::FireGenericDoneCallback( |
- GenericDoneCallback* callback, |
- bool success, |
- const std::string& error_message) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- DCHECK(!(*callback).is_null()); |
- content::BrowserThread::PostTask( |
- content::BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(*callback, success, error_message)); |
- (*callback).Reset(); |
+ logging_state_ = CLOSED; |
} |
void WebRtcLoggingHandlerHost::CreateRtpDumpHandlerAndStart( |
RtpDumpType type, |
- GenericDoneCallback callback, |
+ const GenericDoneCallback& callback, |
const base::FilePath& dump_dir) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
@@ -610,16 +737,33 @@ void WebRtcLoggingHandlerHost::CreateRtpDumpHandlerAndStart( |
if (!rtp_dump_handler_) |
rtp_dump_handler_.reset(new WebRtcRtpDumpHandler(dump_dir)); |
- DoStartRtpDump(type, &callback); |
+ DoStartRtpDump(type, callback); |
} |
-void WebRtcLoggingHandlerHost::DoStartRtpDump(RtpDumpType type, |
- GenericDoneCallback* callback) { |
+void WebRtcLoggingHandlerHost::DoStartRtpDump( |
+ RtpDumpType type, const GenericDoneCallback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
DCHECK(rtp_dump_handler_); |
std::string error; |
- |
bool result = rtp_dump_handler_->StartDump(type, &error); |
FireGenericDoneCallback(callback, result, error); |
} |
+ |
+bool WebRtcLoggingHandlerHost::ReleaseRtpDumps(WebRtcLogPaths* log_paths) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ DCHECK(log_paths); |
+ |
+ if (!rtp_dump_handler_) |
+ return false; |
+ |
+ WebRtcRtpDumpHandler::ReleasedDumps rtp_dumps( |
+ rtp_dump_handler_->ReleaseDumps()); |
+ log_paths->incoming_rtp_dump = rtp_dumps.incoming_dump_path; |
+ log_paths->outgoing_rtp_dump = rtp_dumps.outgoing_dump_path; |
+ |
+ rtp_dump_handler_.reset(); |
+ stop_rtp_dump_callback_.Reset(); |
+ |
+ return true; |
+} |