// 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. #ifndef CHROME_BROWSER_MEDIA_WEBRTC_LOG_UPLOADER_H_ #define CHROME_BROWSER_MEDIA_WEBRTC_LOG_UPLOADER_H_ #include <map> #include <string> #include "base/basictypes.h" #include "base/gtest_prod_util.h" #include "base/memory/ref_counted.h" #include "base/platform_file.h" #include "base/threading/thread_checker.h" #include "chrome/browser/media/webrtc_logging_handler_host.h" #include "net/url_request/url_fetcher_delegate.h" class Profile; namespace base { class SharedMemory; } namespace net { class URLFetcher; class URLRequestContextGetter; } typedef struct z_stream_s z_stream; // Used when uploading is done to perform post-upload actions. typedef struct { base::FilePath upload_list_path; WebRtcLoggingHandlerHost::UploadDoneCallback callback; scoped_refptr<WebRtcLoggingHandlerHost> host; } WebRtcLogUploadDoneData; class WebRtcLogURLRequestContextGetter; // WebRtcLogUploader uploads WebRTC logs, keeps count of how many logs have // been started and denies further logs if a limit is reached. It also adds // the timestamp and report ID of the uploded log to a text file. There must // only be one object of this type. class WebRtcLogUploader : public net::URLFetcherDelegate { public: WebRtcLogUploader(); virtual ~WebRtcLogUploader(); // net::URLFetcherDelegate implementation. virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; virtual void OnURLFetchUploadProgress(const net::URLFetcher* source, int64 current, int64 total) OVERRIDE; // Returns true is number of logs limit is not reached yet. Increases log // count if true is returned. Must be called before UploadLog(). bool ApplyForStartLogging(); // Notifies that logging has stopped and that the log should not be uploaded. // Decreases log count. May only be called if permission to log has been // granted by calling ApplyForStartLogging() and getting true in return. // After this function has been called, a new permission must be granted. // Call either this function or LoggingStoppedDoUpload(). void LoggingStoppedDontUpload(); // Notifies that that logging has stopped and that the log should be uploaded. // Decreases log count. May only be called if permission to log has been // granted by calling ApplyForStartLogging() and getting true in return. After // this function has been called, a new permission must be granted. Call // either this function or LoggingStoppedDontUpload(). void LoggingStoppedDoUpload( net::URLRequestContextGetter* request_context, scoped_ptr<unsigned char[]> log_buffer, uint32 length, const std::map<std::string, std::string>& meta_data, const WebRtcLogUploadDoneData& upload_done_data); // For testing purposes. If called, the multipart will not be uploaded, but // written to |post_data_| instead. void OverrideUploadWithBufferForTesting(std::string* post_data) { post_data_ = post_data; } private: FRIEND_TEST_ALL_PREFIXES(WebRtcLogUploaderTest, AddUploadedLogInfoToUploadListFile); // Sets up a multipart body to be uploaded. The body is produced according // to RFC 2046. void SetupMultipart(std::string* post_data, uint8* log_buffer, uint32 log_buffer_length, const std::map<std::string, std::string>& meta_data); void AddLogData(std::string* post_data, uint8* log_buffer, uint32 log_buffer_length); void CompressLog(std::string* post_data, uint8* input, uint32 input_size); void ResizeForNextOutput(std::string* post_data, z_stream* stream); void CreateAndStartURLFetcher( scoped_refptr<net::URLRequestContextGetter> request_context, const WebRtcLogUploadDoneData& upload_done_data, scoped_ptr<std::string> post_data); void DecreaseLogCount(); // Append information (time and report ID) about this uploaded log to a log // list file, limited to |kLogListLimitLines| entries. This list is used for // viewing the uploaded logs under chrome://webrtc-logs, see // WebRtcLogUploadList. The list has the format // time,id // time,id // etc. // where each line represents an uploaded log and "time" is Unix time. void AddUploadedLogInfoToUploadListFile( const base::FilePath& upload_list_path, const std::string& report_id); void NotifyUploadDone(int response_code, const std::string& report_id, const WebRtcLogUploadDoneData& upload_done_data); // This is the UI thread for Chromium. Some other thread for tests. base::ThreadChecker create_thread_checker_; // This is the FILE thread for Chromium. Some other thread for tests. base::ThreadChecker file_thread_checker_; int log_count_; // For testing purposes, see OverrideUploadWithBufferForTesting. Only accessed // on the FILE thread. std::string* post_data_; typedef std::map<const net::URLFetcher*, WebRtcLogUploadDoneData> UploadDoneDataMap; // Only accessed on the UI thread. UploadDoneDataMap upload_done_data_; DISALLOW_COPY_AND_ASSIGN(WebRtcLogUploader); }; #endif // CHROME_BROWSER_MEDIA_WEBRTC_LOG_UPLOADER_H_