15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_BROWSER_SPEECH_CHUNKED_BYTE_BUFFER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_SPEECH_CHUNKED_BYTE_BUFFER_H_ 790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <string> 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <vector> 1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/basictypes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Models a chunk-oriented byte buffer. The term chunk is herein defined as an 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// arbitrary sequence of bytes that is preceeded by N header bytes, indicating 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its size. Data may be appended to the buffer with no particular respect of 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// chunks boundaries. However, chunks can be extracted (FIFO) only when their 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content (according to their header) is fully available in the buffer. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The current implementation support only 4 byte Big Endian headers. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Empty chunks (i.e. the sequence 00 00 00 00) are NOT allowed. 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// E.g. 00 00 00 04 xx xx xx xx 00 00 00 02 yy yy 00 00 00 04 zz zz zz zz 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// [----- CHUNK 1 -------] [--- CHUNK 2 ---] [------ CHUNK 3 ------] 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT ChunkedByteBuffer { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChunkedByteBuffer(); 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~ChunkedByteBuffer(); 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appends |length| bytes starting from |start| to the buffer. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Append(const uint8* start, size_t length); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appends bytes contained in the |string| to the buffer. 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Append(const std::string& string); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks whether one or more complete chunks are available in the buffer. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasChunks() const; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If enough data is available, reads and removes the first complete chunk 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the buffer. Returns a NULL pointer if no complete chunk is available. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr< std::vector<uint8> > PopChunk(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clears all the content of the buffer. 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Clear(); 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the number of raw bytes (including headers) present. 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t GetTotalLength() const { return total_bytes_stored_; } 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct Chunk { 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Chunk(); 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ~Chunk(); 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<uint8> header; 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr< std::vector<uint8> > content; 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t ExpectedContentLength() const; 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Chunk); 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<Chunk> chunks_; 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<Chunk> partial_chunk_; 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t total_bytes_stored_; 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChunkedByteBuffer); 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace content 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // CONTENT_BROWSER_SPEECH_CHUNKED_BYTE_BUFFER_H_ 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)