summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--base/values.cc36
-rw-r--r--base/values.h26
-rw-r--r--base/values_unittest.cc30
-rw-r--r--chrome/browser/extensions/api/socket/socket_api.cc8
4 files changed, 40 insertions, 60 deletions
diff --git a/base/values.cc b/base/values.cc
index d561d68..648d0bc 100644
--- a/base/values.cc
+++ b/base/values.cc
@@ -298,33 +298,32 @@ bool StringValue::Equals(const Value* other) const {
///////////////////// BinaryValue ////////////////////
-BinaryValue::~BinaryValue() {
- DCHECK(buffer_);
- if (buffer_)
- delete[] buffer_;
+BinaryValue::BinaryValue()
+ : Value(TYPE_BINARY),
+ buffer_(NULL),
+ size_(0) {
}
-// static
-BinaryValue* BinaryValue::Create(char* buffer, size_t size) {
- if (!buffer)
- return NULL;
+BinaryValue::BinaryValue(scoped_ptr<char> buffer, size_t size)
+ : Value(TYPE_BINARY),
+ buffer_(buffer.release()),
+ size_(size) {
+}
- return new BinaryValue(buffer, size);
+BinaryValue::~BinaryValue() {
}
// static
BinaryValue* BinaryValue::CreateWithCopiedBuffer(const char* buffer,
size_t size) {
- if (!buffer)
- return NULL;
-
char* buffer_copy = new char[size];
memcpy(buffer_copy, buffer, size);
- return new BinaryValue(buffer_copy, size);
+ scoped_ptr<char> scoped_buffer_copy(buffer_copy);
+ return new BinaryValue(scoped_buffer_copy.Pass(), size);
}
BinaryValue* BinaryValue::DeepCopy() const {
- return CreateWithCopiedBuffer(buffer_, size_);
+ return CreateWithCopiedBuffer(buffer_.get(), size_);
}
bool BinaryValue::Equals(const Value* other) const {
@@ -333,14 +332,7 @@ bool BinaryValue::Equals(const Value* other) const {
const BinaryValue* other_binary = static_cast<const BinaryValue*>(other);
if (other_binary->size_ != size_)
return false;
- return !memcmp(buffer_, other_binary->buffer_, size_);
-}
-
-BinaryValue::BinaryValue(char* buffer, size_t size)
- : Value(TYPE_BINARY),
- buffer_(buffer),
- size_(size) {
- DCHECK(buffer_);
+ return !memcmp(GetBuffer(), other_binary->GetBuffer(), size_);
}
///////////////////// DictionaryValue ////////////////////
diff --git a/base/values.h b/base/values.h
index 1d35d63..adb795f 100644
--- a/base/values.h
+++ b/base/values.h
@@ -30,6 +30,7 @@
#include "base/base_export.h"
#include "base/basictypes.h"
#include "base/compiler_specific.h"
+#include "base/memory/scoped_ptr.h"
#include "base/string16.h"
// This file declares "using base::Value", etc. at the bottom, so that
@@ -177,33 +178,32 @@ class BASE_EXPORT StringValue : public Value {
class BASE_EXPORT BinaryValue: public Value {
public:
- virtual ~BinaryValue();
+ // Creates a BinaryValue with a null buffer and size of 0.
+ BinaryValue();
+
+ // Creates a BinaryValue, taking ownership of the bytes pointed to by
+ // |buffer|.
+ BinaryValue(scoped_ptr<char> buffer, size_t size);
- // Creates a Value to represent a binary buffer. The new object takes
- // ownership of the pointer passed in, if successful.
- // Returns NULL if buffer is NULL.
- static BinaryValue* Create(char* buffer, size_t size);
+ virtual ~BinaryValue();
// For situations where you want to keep ownership of your buffer, this
// factory method creates a new BinaryValue by copying the contents of the
// buffer that's passed in.
- // Returns NULL if buffer is NULL.
static BinaryValue* CreateWithCopiedBuffer(const char* buffer, size_t size);
size_t GetSize() const { return size_; }
- char* GetBuffer() { return buffer_; }
- const char* GetBuffer() const { return buffer_; }
+
+ // May return NULL.
+ char* GetBuffer() { return buffer_.get(); }
+ const char* GetBuffer() const { return buffer_.get(); }
// Overridden from Value:
virtual BinaryValue* DeepCopy() const OVERRIDE;
virtual bool Equals(const Value* other) const OVERRIDE;
private:
- // Constructor is private so that only objects with valid buffer pointers
- // and size values can be created.
- BinaryValue(char* buffer, size_t size);
-
- char* buffer_;
+ scoped_ptr<char> buffer_;
size_t size_;
DISALLOW_COPY_AND_ASSIGN(BinaryValue);
diff --git a/base/values_unittest.cc b/base/values_unittest.cc
index 9b92949..b0dd22e 100644
--- a/base/values_unittest.cc
+++ b/base/values_unittest.cc
@@ -105,23 +105,15 @@ TEST(ValuesTest, List) {
}
TEST(ValuesTest, BinaryValue) {
- char* buffer = NULL;
- // Passing a null buffer pointer doesn't yield a BinaryValue
- scoped_ptr<BinaryValue> binary(BinaryValue::Create(buffer, 0));
- ASSERT_FALSE(binary.get());
-
- // If you want to represent an empty binary value, use a zero-length buffer.
- buffer = new char[1];
- ASSERT_TRUE(buffer);
- binary.reset(BinaryValue::Create(buffer, 0));
+ // Default constructor creates a BinaryValue with a null buffer and size 0.
+ scoped_ptr<BinaryValue> binary(new BinaryValue());
ASSERT_TRUE(binary.get());
- ASSERT_TRUE(binary->GetBuffer());
- ASSERT_EQ(buffer, binary->GetBuffer());
+ ASSERT_EQ(NULL, binary->GetBuffer());
ASSERT_EQ(0U, binary->GetSize());
// Test the common case of a non-empty buffer
- buffer = new char[15];
- binary.reset(BinaryValue::Create(buffer, 15));
+ char* buffer = new char[15];
+ binary.reset(new BinaryValue(scoped_ptr<char>(buffer), 15));
ASSERT_TRUE(binary.get());
ASSERT_TRUE(binary->GetBuffer());
ASSERT_EQ(buffer, binary->GetBuffer());
@@ -350,9 +342,9 @@ TEST(ValuesTest, DeepCopy) {
Value::CreateStringValue(ASCIIToUTF16("hello16"));
original_dict.Set("string16", original_string16);
- char* original_buffer = new char[42];
- memset(original_buffer, '!', 42);
- BinaryValue* original_binary = BinaryValue::Create(original_buffer, 42);
+ scoped_ptr<char> original_buffer(new char[42]);
+ memset(original_buffer.get(), '!', 42);
+ BinaryValue* original_binary = new BinaryValue(original_buffer.Pass(), 42);
original_dict.Set("binary", original_binary);
ListValue* original_list = new ListValue();
@@ -558,9 +550,9 @@ TEST(ValuesTest, DeepCopyCovariantReturnTypes) {
Value::CreateStringValue(ASCIIToUTF16("hello16"));
original_dict.Set("string16", original_string16);
- char* original_buffer = new char[42];
- memset(original_buffer, '!', 42);
- BinaryValue* original_binary = BinaryValue::Create(original_buffer, 42);
+ scoped_ptr<char> original_buffer(new char[42]);
+ memset(original_buffer.get(), '!', 42);
+ BinaryValue* original_binary = new BinaryValue(original_buffer.Pass(), 42);
original_dict.Set("binary", original_binary);
ListValue* original_list = new ListValue();
diff --git a/chrome/browser/extensions/api/socket/socket_api.cc b/chrome/browser/extensions/api/socket/socket_api.cc
index 98fa6f2..122f2bc 100644
--- a/chrome/browser/extensions/api/socket/socket_api.cc
+++ b/chrome/browser/extensions/api/socket/socket_api.cc
@@ -173,9 +173,7 @@ void SocketReadFunction::OnCompleted(int bytes_read,
base::BinaryValue::CreateWithCopiedBuffer(io_buffer->data(),
bytes_read));
} else {
- // BinaryValue does not support NULL buffer. Workaround it with new char[1].
- // http://crbug.com/127630
- result->Set(kDataKey, base::BinaryValue::Create(new char[1], 0));
+ result->Set(kDataKey, new base::BinaryValue());
}
result_.reset(result);
@@ -256,9 +254,7 @@ void SocketRecvFromFunction::OnCompleted(int bytes_read,
base::BinaryValue::CreateWithCopiedBuffer(io_buffer->data(),
bytes_read));
} else {
- // BinaryValue does not support NULL buffer. Workaround it with new char[1].
- // http://crbug.com/127630
- result->Set(kDataKey, base::BinaryValue::Create(new char[1], 0));
+ result->Set(kDataKey, new base::BinaryValue());
}
result->SetString(kAddressKey, address);
result->SetInteger(kPortKey, port);