Chromium Code Reviews| Index: net/base/filter.h |
| =================================================================== |
| --- net/base/filter.h (revision 11030) |
| +++ net/base/filter.h (working copy) |
| @@ -39,6 +39,40 @@ |
| #include "googleurl/src/gurl.h" |
| #include "testing/gtest/include/gtest/gtest_prod.h" |
| +//------------------------------------------------------------------------------ |
| +// Define an interface class that allows access to contextual information |
| +// supplied by the owner of this filter. |
|
huanr
2009/03/09 17:50:44
Can you also comment on filter chain? If the filte
jar (doing other things)
2009/03/09 19:00:41
Done.
|
| +class FilterContext { |
| + public: |
| + FilterContext() = 0; |
|
wtc
2009/03/09 17:24:09
We should not need to declare and define (with = 0
huanr
2009/03/09 17:50:44
+1
On 2009/03/09 17:24:09, wtc wrote:
jar (doing other things)
2009/03/09 19:00:41
The problem was apparently that my use of DISALLOW
|
| + virtual ~FilterContext() = 0; |
| + |
| + // What mime type was specified in the header for this data? |
| + virtual bool GetMimeType(std::string* mime_type) const = 0; |
| + |
| + // What URL was used to access this data? |
| + // Return false if gurl is not present. |
| + virtual bool GetURL(GURL* gurl) const = 0; |
| + |
| + // When was this data requested from a server? |
| + virtual base::Time GetRequestTime() const = 0; |
| + |
| + // Is data supplied from cache, or fresh across the net? |
| + virtual bool IsCachedContent() const = 0; |
| + |
| + // TODO(jar): We could use flags, defined by callers, rather than naming a |
| + // protocol here in the base class. |
| + // Was this data flagged as a response to a request with an SDCH dictionary? |
| + virtual bool IsSdchResponse() const = 0; |
| + |
| + // What is the desirable input buffer size for these filters? |
| + virtual int GetInputStreambufferSize() const = 0; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(FilterContext); |
| +}; |
| + |
| +//------------------------------------------------------------------------------ |
| class Filter { |
| public: |
| // Return values of function ReadFilteredData. |
| @@ -68,25 +102,25 @@ |
| FILTER_TYPE_UNSUPPORTED, |
| }; |
| - |
| virtual ~Filter(); |
| // Creates a Filter object. |
| - // Parameters: Filter_types specifies the type of filter created; Buffer_size |
| - // specifies the size (in number of chars) of the buffer the filter should |
| - // allocate to hold pre-filter data. |
| + // Parameters: Filter_types specifies the type of filter created; |
| + // filter_context allows filters to acquire additional details needed for |
| + // construction and operation, such as a specification of requisite input |
| + // buffer size. |
| // If success, the function returns the pointer to the Filter object created. |
| // If failed or a filter is not needed, the function returns NULL. |
| // |
| // Note: filter_types is an array of filter names (content encoding types as |
| - // provided in an HTTP header), which will be chained together serially do |
| + // provided in an HTTP header), which will be chained together serially to do |
| // successive filtering of data. The names in the vector are ordered based on |
| // encoding order, and the filters are chained to operate in the reverse |
| // (decoding) order. For example, types[0] = "sdch", types[1] = "gzip" will |
| // cause data to first be gunizip filtered, and the resulting output from that |
| // filter will be sdch decoded. |
| static Filter* Factory(const std::vector<FilterType>& filter_types, |
| - int buffer_size); |
| + const FilterContext& filter_context); |
| // External call to obtain data from this filter chain. If ther is no |
| // next_filter_, then it obtains data from this specific filter. |
| @@ -101,7 +135,7 @@ |
| // Returns the total number of chars remaining in stream_buffer_ to be |
| // filtered. |
| // |
| - // If the function returns 0 then all data have been filtered and the caller |
| + // If the function returns 0 then all data has been filtered, and the caller |
| // is safe to copy new data into stream_buffer_. |
| int stream_data_len() const { return stream_data_len_; } |
| @@ -109,8 +143,8 @@ |
| // stream_buffer_, the caller should call this function to notify Filter to |
| // start filtering. Then after this function is called, the caller can get |
| // post-filtered data using ReadFilteredData. The caller must not write to |
| - // stream_buffer_ and call this function again before stream_buffer_ is empty |
| - // out by ReadFilteredData. |
| + // stream_buffer_ and call this function again before stream_buffer_ is |
| + // emptied out by ReadFilteredData. |
| // |
| // The input stream_data_len is the length (in number of chars) of valid |
| // data in stream_buffer_. It can not be greater than stream_buffer_size_. |
| @@ -140,7 +174,7 @@ |
| const std::string& mime_type, |
| std::vector<FilterType>* encoding_types); |
| protected: |
| - Filter(); |
| + explicit Filter(const FilterContext& filter_context); |
| FRIEND_TEST(SdchFilterTest, ContentTypeId); |
| // Filters the data stored in stream_buffer_ and writes the output into the |
| @@ -159,16 +193,18 @@ |
| // Copy pre-filter data directly to destination buffer without decoding. |
| FilterStatus CopyOut(char* dest_buffer, int* dest_len); |
| - // Allocates and initializes stream_buffer_. |
| - // Buffer_size is the maximum size of stream_buffer_ in number of chars. |
| - bool InitBuffer(int buffer_size); |
| + // Allocates and initializes stream_buffer_ based on filter_context_. |
| + // Establishes a buffer large enough to handle the amount specified in |
| + // filter_context_.GetInputStreambufferSize(). |
| + bool InitBuffer(); |
| // A factory helper for creating filters for within a chain of potentially |
| // multiple encodings. If a chain of filters is created, then this may be |
| // called multiple times during the filter creation process. In most simple |
| // cases, this is only called once. Returns NULL and cleans up (deleting |
| // filter_list) if a new filter can't be constructed. |
| - static Filter* PrependNewFilter(FilterType type_id, int buffer_size, |
| + static Filter* PrependNewFilter(FilterType type_id, |
| + const FilterContext& filter_context, |
| Filter* filter_list); |
| FilterStatus last_status() const { return last_status_; } |
| @@ -177,7 +213,7 @@ |
| bool was_cached() const { return was_cached_; } |
| - // Buffer to hold the data to be filtered. |
| + // Buffer to hold the data to be filtered (the input queue). |
| scoped_refptr<net::IOBuffer> stream_buffer_; |
| // Maximum size of stream_buffer_ in number of chars. |
| @@ -189,6 +225,7 @@ |
| // Total number of remaining chars in stream_buffer_ to be filtered. |
| int stream_data_len_; |
| + private: // TODO(jar): Make more data private by moving this up higher. |
| // The URL that is currently being filtered. |
| // This is used by SDCH filters which need to restrict use of a dictionary to |
| // a specific URL or path. |
| @@ -200,7 +237,6 @@ |
| base::Time connect_time_; |
| bool was_cached_; |
| - private: // TODO(jar): Make more data private by moving this up higher. |
| // Helper function to empty our output into the next filter's input. |
| void PushDataIntoNextFilter(); |
| @@ -215,6 +251,11 @@ |
| // chained filters. |
| FilterStatus last_status_; |
| + // Context data from the owner of this filter. Some filters need additional |
| + // context information (mime type, etc.) to properly function, and they access |
| + // this data via this reference member. |
| + const FilterContext& filter_context_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(Filter); |
| }; |