blob: 644e16c681b3bcec40bca00a97a40309cfdf12da [file] [log] [blame]
// Copyright (c) 2012 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 CONTENT_CHILD_NPAPI_PLUGIN_STREAM_H_
#define CONTENT_CHILD_NPAPI_PLUGIN_STREAM_H_
#include <string>
#include <vector>
#include "base/files/file_path.h"
#include "base/memory/ref_counted.h"
#include "build/build_config.h"
#include "third_party/npapi/bindings/npapi.h"
namespace content {
class PluginInstance;
class WebPluginResourceClient;
// Base class for a NPAPI stream. Tracks basic elements
// of a stream for NPAPI notifications and stream position.
class PluginStream : public base::RefCounted<PluginStream> {
public:
// Create a new PluginStream object. If needNotify is true, then the
// plugin will be notified when the stream has been fully sent.
PluginStream(PluginInstance* instance,
const char* url,
bool need_notify,
void* notify_data);
// Opens the stream to the Plugin.
// If the mime-type is not specified, we'll try to find one based on the
// mime-types table and the extension (if any) in the URL.
// If the size of the stream is known, use length to set the size. If
// not known, set length to 0.
// The request_is_seekable parameter indicates whether byte range requests
// can be issued on the stream.
bool Open(const std::string &mime_type,
const std::string &headers,
uint32 length,
uint32 last_modified,
bool request_is_seekable);
// Writes to the stream.
int Write(const char* buf, const int len, int data_offset);
// Write the result as a file.
void WriteAsFile();
// Notify the plugin that a stream is complete.
void Notify(NPReason reason);
// Close the stream.
virtual bool Close(NPReason reason);
virtual WebPluginResourceClient* AsResourceClient();
// Cancels any HTTP requests initiated by the stream.
virtual void CancelRequest() {}
NPStream* stream() { return &stream_; }
PluginInstance* instance() { return instance_.get(); }
// setter/getter for the seekable attribute on the stream.
bool seekable() const { return seekable_stream_; }
void set_seekable(bool seekable) { seekable_stream_ = seekable; }
// getters for reading the notification related attributes on the stream.
bool notify_needed() const { return notify_needed_; }
void* notify_data() const { return notify_data_; }
protected:
friend class base::RefCounted<PluginStream>;
virtual ~PluginStream();
// Check if the stream is open.
bool open() { return opened_; }
private:
// Per platform method to reset the temporary file handle.
void ResetTempFileHandle();
// Per platform method to reset the temporary file name.
void ResetTempFileName();
// Open a temporary file for this stream.
// If successful, will set temp_file_name_, temp_file_handle_, and
// return true.
bool OpenTempFile();
// Closes the temporary file if it is open.
void CloseTempFile();
// Sends the data to the file. Called From WriteToFile.
size_t WriteBytes(const char* buf, size_t length);
// Sends the data to the file if it's open.
bool WriteToFile(const char* buf, size_t length);
// Sends the data to the plugin. If it's not ready, handles buffering it
// and retrying later.
bool WriteToPlugin(const char* buf, const int length, const int data_offset);
// Send the data to the plugin, returning how many bytes it accepted, or -1
// if an error occurred.
int TryWriteToPlugin(const char* buf, const int length,
const int data_offset);
// The callback which calls TryWriteToPlugin.
void OnDelayDelivery();
// Returns true if the temp file is valid and open for writing.
bool TempFileIsValid() const;
// Returns true if |requested_plugin_mode_| is NP_ASFILE or NP_ASFILEONLY.
bool RequestedPluginModeIsAsFile() const;
private:
NPStream stream_;
std::string headers_;
scoped_refptr<PluginInstance> instance_;
bool notify_needed_;
void* notify_data_;
bool close_on_write_data_;
uint16 requested_plugin_mode_;
bool opened_;
#if defined(OS_WIN)
char temp_file_name_[MAX_PATH];
HANDLE temp_file_handle_;
#elif defined(OS_POSIX)
FILE* temp_file_;
base::FilePath temp_file_path_;
#endif
std::vector<char> delivery_data_;
int data_offset_;
bool seekable_stream_;
std::string mime_type_;
DISALLOW_COPY_AND_ASSIGN(PluginStream);
};
} // namespace content
#endif // CONTENT_CHILD_NPAPI_PLUGIN_STREAM_H_