blob: d0247b1ee574cc9f9ac6333a4c220af152123fd0 [file] [log] [blame]
// Copyright (c) 2012 The WebM project authors. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the LICENSE file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
#ifndef WEBMLIVE_ENCODER_HTTP_UPLOADER_H_
#define WEBMLIVE_ENCODER_HTTP_UPLOADER_H_
#include <map>
#include <memory>
#include <queue>
#include <string>
#include "encoder/basictypes.h"
#include "encoder/data_sink.h"
#include "encoder/encoder_base.h"
namespace webmlive {
enum UploadMode {
HTTP_POST = 0,
HTTP_FORM_POST = 1,
};
struct HttpUploaderSettings {
// Form variables and HTTP headers are stored within
// map<std::string,std::string>.
typedef std::map<std::string, std::string> StringMap;
// |local_file| is what the HTTP server sees as the local file name.
// Assigning a path to a local file and passing the settings struct to
// |HttpUploader::Init| will not upload an existing file.
std::string local_file;
// User form variables.
StringMap form_variables;
// User HTTP headers.
StringMap headers;
// Post mode.
UploadMode post_mode;
// Target URL.
std::string target_url;
};
struct HttpUploaderStats {
// Upload average bytes per second.
double bytes_per_second;
// Bytes sent for current upload.
int64 bytes_sent_current;
// Total number of bytes uploaded.
int64 total_bytes_uploaded;
};
class HttpUploaderImpl;
// Pimpl idiom based HTTP uploader that hides the gory details of libcurl from
// users of the uploader.
//
// Notes:
// - |Init| must be called before any other method.
// - |EnqueueTargetUrl| must be used to control target for HTTP requests. URLs
// enqueued are used in sequence, and only removed from the queue after
// successful uploads.
class HttpUploader : public DataSinkInterface {
public:
HttpUploader();
virtual ~HttpUploader();
// Tests for upload completion. Returns true when the uploader is ready to
// start an upload. Always returns true when no uploads have been attempted.
bool UploadComplete() const;
// Constructs |HttpUploaderImpl|, which copies |settings|. Returns |kSuccess|
// upon success.
bool Init(const HttpUploaderSettings& settings);
// Returns the current upload stats. Note, obtains lock before copying stats
// to |ptr_stats|.
bool GetStats(HttpUploaderStats* ptr_stats);
// Runs the uploader thread.
bool Run();
// Stops the uploader thread.
bool Stop();
// Sends a buffer to the uploader thread.
bool UploadBuffer(const std::string& id,
const uint8* ptr_buffer, int length);
// DataSinkInterface methods.
bool WriteData(DataSinkInterface::SharedDataSinkBuffer buffer) override {
return UploadBuffer(buffer->id, &buffer->data[0], buffer->data.size());
}
std::string Name() const override { return "HttpUploader"; }
private:
// Pointer to uploader implementation.
std::unique_ptr<HttpUploaderImpl> ptr_uploader_;
WEBMLIVE_DISALLOW_COPY_AND_ASSIGN(HttpUploader);
};
} // namespace webmlive
#endif // WEBMLIVE_ENCODER_HTTP_UPLOADER_H_