Fixed [JACKSON-376], problems writing Smile binary data as object property

diff --git a/release-notes/CREDITS b/release-notes/CREDITS
index 4ed9c41..4ae05ab 100644
--- a/release-notes/CREDITS
+++ b/release-notes/CREDITS
@@ -173,6 +173,8 @@
 Shay Banon:
   * Suggested [JACKSON-168] Make JsonLocation serializable (and deserializable)
    [1.3.0]
+  * Reported [JACKSON-376] writing binary data as object field value with Smile fails
+   [1.6.1]
 
 Brian McCallister:
   * Suggested [JACKSON-173]: Add "JsonParser.Feature.ALLOW_SINGLE_QUOTES"
@@ -398,4 +400,6 @@
    * Suggested [JACKSON-308] Configurable date formatting support for XMLGregorianCalendar,
     XMLGregorianCalendar now uses same Date/Calendar serialization as other date types.
    [1.6.0]
+  
+  
   
\ No newline at end of file
diff --git a/release-notes/VERSION b/release-notes/VERSION
index a3ae114..d263ff1 100644
--- a/release-notes/VERSION
+++ b/release-notes/VERSION
@@ -9,6 +9,8 @@
  Fixes:
 
    * [JACKSON-372] handle missing primitive type values for @JsonCreator gracefully (with defaults)
+   * [JACKSON-376] writing binary data as object field value with Smile failed
+     (report by Shay B)
    * all fixes from 1.5.x up to 1.5.7
 
 ------------------------------------------------------------------------
diff --git a/src/smile/java/org/codehaus/jackson/smile/SmileGenerator.java b/src/smile/java/org/codehaus/jackson/smile/SmileGenerator.java
index 58312bb..e99053c 100644
--- a/src/smile/java/org/codehaus/jackson/smile/SmileGenerator.java
+++ b/src/smile/java/org/codehaus/jackson/smile/SmileGenerator.java
@@ -722,13 +722,11 @@
     @Override
     public void writeBinary(Base64Variant b64variant, byte[] data, int offset, int len) throws IOException, JsonGenerationException
     {
-        _verifyValueWrite("write Binary value");
         if (data == null) {
             writeNull();
             return;
         }
         _verifyValueWrite("write Binary value");
-        
         if (this.isEnabled(Feature.ENCODE_BINARY_AS_7BIT)) {
             _writeByte((byte) TOKEN_MISC_BINARY_7BIT);
             _write7BitBinaryWithLength(data, offset, len);
diff --git a/src/test/org/codehaus/jackson/smile/TestSmileParserBinary.java b/src/test/org/codehaus/jackson/smile/TestSmileParserBinary.java
index 2ca22c3..821918a 100644
--- a/src/test/org/codehaus/jackson/smile/TestSmileParserBinary.java
+++ b/src/test/org/codehaus/jackson/smile/TestSmileParserBinary.java
@@ -16,23 +16,35 @@
         139000
     };
     
-    public void testRaw() throws IOException
+    public void testRawAsArray() throws IOException
     {
-        _testBinary(true);
+        _testBinaryAsArray(true);
     }
 
-    public void test7Bit() throws IOException
+    public void test7BitAsArray() throws IOException
     {
-        _testBinary(false);
+        _testBinaryAsArray(false);
     }
 
+    // Added based on [JACKSON-376]
+    public void testRawAsObject() throws IOException
+    {
+        _testBinaryAsObject(true);
+    }
+
+    // Added based on [JACKSON-376]
+    public void test7BitAsObject() throws IOException
+    {
+        _testBinaryAsObject(false);
+    }
+    
     /*
     /**********************************************************
     /* Helper methods
     /**********************************************************
      */
 
-    private void _testBinary(boolean raw) throws IOException
+    private void _testBinaryAsArray(boolean raw) throws IOException
     {
         SmileFactory f = new SmileFactory();
         f.configure(SmileGenerator.Feature.ENCODE_BINARY_AS_7BIT, !raw);
@@ -70,6 +82,45 @@
         }
     }
 
+    private void _testBinaryAsObject(boolean raw) throws IOException
+    {
+        SmileFactory f = new SmileFactory();
+        f.configure(SmileGenerator.Feature.ENCODE_BINARY_AS_7BIT, !raw);
+        for (int size : SIZES) {
+            byte[] data = _generateData(size);
+            ByteArrayOutputStream bo = new ByteArrayOutputStream(size+10);            
+            SmileGenerator g = f.createJsonGenerator(bo);
+            g.writeStartObject();
+            g.writeFieldName("binary");
+            g.writeBinary(data);
+            g.writeEndObject();
+            g.close();
+            byte[] smile = bo.toByteArray();            
+            
+            // and verify
+            SmileParser p = f.createJsonParser(smile);
+            assertToken(JsonToken.START_OBJECT, p.nextToken());
+
+            assertToken(JsonToken.FIELD_NAME, p.nextToken());
+            assertEquals("binary", p.getCurrentName());
+            assertToken(JsonToken.VALUE_EMBEDDED_OBJECT, p.nextToken());
+            byte[] result = p.getBinaryValue();
+            assertArrayEquals(data, result);
+            assertToken(JsonToken.END_OBJECT, p.nextToken());
+            assertNull(p.nextToken());
+            p.close();
+
+            // and second time around, skipping
+            p = f.createJsonParser(smile);
+            assertToken(JsonToken.START_OBJECT, p.nextToken());
+            assertToken(JsonToken.FIELD_NAME, p.nextToken());
+            assertToken(JsonToken.VALUE_EMBEDDED_OBJECT, p.nextToken());
+            assertToken(JsonToken.END_OBJECT, p.nextToken());
+            assertNull(p.nextToken());
+            p.close();
+        }
+    }
+    
     private byte[] _generateData(int size)
     {
         byte[] result = new byte[size];