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)