blob: ecd53d645198066b3fa3e0e0b89de35ebd189622 [file] [log] [blame]
// 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 <string>
#include <vector>
#include "base/basictypes.h"
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
#include "base/platform_file.h"
#include "net/url_request/url_fetcher_delegate.h"
namespace base {
class SharedMemory;
}
namespace net {
class URLFetcher;
class URLRequestContextGetter;
}
typedef struct z_stream_s z_stream;
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();
// Uploads log and decreases log count. May only be called if permission to
// to log has been granted by calling ApplyForStartLogging() and getting true
// in return. After UploadLog has been called, a new permission must be
// granted.
void UploadLog(net::URLRequestContextGetter* request_context,
scoped_ptr<base::SharedMemory> shared_memory,
uint32 length,
const std::string& app_session_id,
const std::string& app_url);
// 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::string& app_session_id,
const std::string& app_url);
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 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 std::string& report_id);
void SetUploadPathForTesting(const base::FilePath& path) {
upload_list_path_ = path;
}
int log_count_;
base::FilePath upload_list_path_;
// For testing purposes, see OverrideUploadWithBufferForTesting. Only accessed
// on the FILE thread.
std::string* post_data_;
DISALLOW_COPY_AND_ASSIGN(WebRtcLogUploader);
};
#endif // CHROME_BROWSER_MEDIA_WEBRTC_LOG_UPLOADER_H_