/* * Copyright 2012 Evernote Corporation * All rights reserved. * * 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. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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. */ package com.evernote.client.conn.mobile; import com.evernote.edam.type.Data; import com.evernote.thrift.TException; import com.evernote.thrift.protocol.TField; import com.evernote.thrift.protocol.TProtocol; import com.evernote.thrift.protocol.TStruct; import com.evernote.thrift.protocol.TType; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.nio.ByteBuffer; /** * Implements a replacement for com.evernote.edam.type.Data that retrieves * the actual binary data to be sent from a File instead of a byte array. * This allows large Thrift messages to be assembled without the entire message * being stored in memory. * <p/> * To use this class, simply replace all uses of com.evernote.edam.type.Data with * com.evernote.android.edam.FileData when creating new Data objects to send to * Evernote. */ public class FileData extends Data { private static final TStruct STRUCT_DESC = new TStruct("Data"); private static final TField BODY_HASH_FIELD_DESC = new TField("bodyHash", TType.STRING, (short) 1); private static final TField SIZE_FIELD_DESC = new TField("size", TType.I32, (short) 2); private static final TField BODY_FIELD_DESC = new TField("body", TType.STRING, (short) 3); private static final long serialVersionUID = 1L; private File mBodyFile; /** * Create a new FileData. * * @param bodyHash An MD5 hash of the binary data contained in the file. * @param file The file containing the binary data. */ public FileData(byte[] bodyHash, File file) { mBodyFile = file; setBodyHash(bodyHash); setSize((int) file.length()); } @Override public void write(TProtocol oprot) throws TException { validate(); oprot.writeStructBegin(STRUCT_DESC); if (this.getBodyHash() != null) { if (isSetBodyHash()) { oprot.writeFieldBegin(BODY_HASH_FIELD_DESC); oprot.writeBinary(ByteBuffer.wrap(this.getBodyHash())); oprot.writeFieldEnd(); } } oprot.writeFieldBegin(SIZE_FIELD_DESC); oprot.writeI32(this.getSize()); oprot.writeFieldEnd(); if (this.mBodyFile != null && this.mBodyFile.isFile()) { oprot.writeFieldBegin(BODY_FIELD_DESC); InputStream s = null; try { s = new FileInputStream(mBodyFile); oprot.writeStream(s, this.mBodyFile.length()); } catch (FileNotFoundException e) { throw new TException("Failed to write binary body:" + mBodyFile, e); } finally { try { if (s != null) { s.close(); } } catch (Exception e) { } } oprot.writeFieldEnd(); } oprot.writeFieldStop(); oprot.writeStructEnd(); } }