What's new? | Help | Directory | Sign in
Google
             
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Copyright 2008, Google Inc.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// 3. Neither the name of Google Inc. nor the names of its contributors may be
// used to endorse or promote products derived from this software without
// specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "gears/blob/blob_builder.h"

#include "gears/blob/blob_interface.h"
#include "gears/blob/join_blob.h"

namespace {
const int64 kMaxBufferSize = 1024 * 1024; // 1MB
}

BlobBuilder::BlobBuilder() : byte_store_(new ByteStore) {
}

BlobBuilder::~BlobBuilder() {
byte_store_->Finalize();
}

bool BlobBuilder::AddBlob(BlobInterface *blob) {
if (blob->Length() < 0) return false;
if (blob->Length() == 0) return true;
if (byte_store_->Length()) {
scoped_refptr<BlobInterface> byte_store_blob;
byte_store_->CreateBlob(&byte_store_blob);
blob_list_.push_back(byte_store_blob.get());
byte_store_->Finalize();
byte_store_.reset(new ByteStore);
}
blob_list_.push_back(blob);
return true;
}

bool BlobBuilder::AddData(const void *data, int64 length) {
return byte_store_->AddData(data, length);
}

bool BlobBuilder::AddString(const std::string16 &data) {
return byte_store_->AddString(data);
}

void BlobBuilder::CreateBlob(scoped_refptr<BlobInterface> *blob) {
bool pushed_unfinalized_data = false;
if (byte_store_->Length()) {
scoped_refptr<BlobInterface> byte_store_blob;
byte_store_->CreateBlob(&byte_store_blob);
blob_list_.push_back(byte_store_blob.get());
pushed_unfinalized_data = true;
}

if (blob_list_.empty()) {
*blob = new EmptyBlob;
} else if (blob_list_.size() == 1) {
*blob = blob_list_.back();
} else {
*blob = new JoinBlob(blob_list_);
}

if (pushed_unfinalized_data) {
blob_list_.pop_back();
}
}

int64 BlobBuilder::Length() const {
int64 length(byte_store_->Length());
for (unsigned i = 0; i < blob_list_.size(); ++i) {
length += blob_list_[i]->Length();
}
return length;
}

void BlobBuilder::Reset() {
byte_store_->Finalize();
byte_store_.reset(new ByteStore);
blob_list_.clear();
}
Show details Hide details

Change log

r2261 by gears.daemon on Jul 07, 2008   Diff
[Author: michaeln]

Add a method to peer into the constituent
DataElements that make up a Blob.

R=bgarcia
CC=gears-internal
DELTA=564  (444 added, 39 deleted, 81
changed)
OCL=7531921
SCL=7635522
Go to: 
Project members, sign in to write a code review

Older revisions

r1980 by gears.daemon on Jun 16, 2008   Diff
[Author: bgarcia]

Update BlobBuilder to use ByteStore.
Also change CreateBlob() to no longer
reset the BlobBuilder,
...
r1936 by gears.daemon on Jun 11, 2008   Diff
[Author: fry]

make blob support official!

PRESUBMIT=passed
...
r1911 by gears.daemon on Jun 07, 2008   Diff
[Author: bgarcia]

Update FileBlob to contain a File*
instead of a filename string.
Update BlobBuilder to create a
...
All revisions of this file

File info

Size: 3295 bytes, 98 lines