1/////////////////////////////////////////////////////////////////////////// 2// 3// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas 4// Digital Ltd. LLC 5// 6// All rights reserved. 7// 8// Redistribution and use in source and binary forms, with or without 9// modification, are permitted provided that the following conditions are 10// met: 11// * Redistributions of source code must retain the above copyright 12// notice, this list of conditions and the following disclaimer. 13// * Redistributions in binary form must reproduce the above 14// copyright notice, this list of conditions and the following disclaimer 15// in the documentation and/or other materials provided with the 16// distribution. 17// * Neither the name of Industrial Light & Magic nor the names of 18// its contributors may be used to endorse or promote products derived 19// from this software without specific prior written permission. 20// 21// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32// 33/////////////////////////////////////////////////////////////////////////// 34 35 36 37//----------------------------------------------------------------------------- 38// 39// class OpaqueAttribute 40// 41//----------------------------------------------------------------------------- 42 43#include <ImfOpaqueAttribute.h> 44#include "Iex.h" 45#include <string.h> 46 47namespace Imf { 48 49 50OpaqueAttribute::OpaqueAttribute (const char typeName[]): 51 _typeName (strlen (typeName) + 1), 52 _dataSize (0) 53{ 54 strcpy (_typeName, typeName); 55} 56 57 58OpaqueAttribute::OpaqueAttribute (const OpaqueAttribute &other): 59 _typeName (strlen (other._typeName) + 1), 60 _dataSize (other._dataSize), 61 _data (other._dataSize) 62{ 63 strcpy (_typeName, other._typeName); 64 _data.resizeErase (other._dataSize); 65 memcpy ((char *) _data, (const char *) other._data, other._dataSize); 66} 67 68 69OpaqueAttribute::~OpaqueAttribute () 70{ 71 // empty 72} 73 74 75const char * 76OpaqueAttribute::typeName () const 77{ 78 return _typeName; 79} 80 81 82Attribute * 83OpaqueAttribute::copy () const 84{ 85 return new OpaqueAttribute (*this); 86} 87 88 89void 90OpaqueAttribute::writeValueTo (OStream &os, int version) const 91{ 92 Xdr::write <StreamIO> (os, _data, _dataSize); 93} 94 95 96void 97OpaqueAttribute::readValueFrom (IStream &is, int size, int version) 98{ 99 _data.resizeErase (size); 100 _dataSize = size; 101 Xdr::read <StreamIO> (is, _data, size); 102} 103 104 105void 106OpaqueAttribute::copyValueFrom (const Attribute &other) 107{ 108 const OpaqueAttribute *oa = dynamic_cast <const OpaqueAttribute *> (&other); 109 110 if (oa == 0 || strcmp (_typeName, oa->_typeName)) 111 { 112 THROW (Iex::TypeExc, "Cannot copy the value of an " 113 "image file attribute of type " 114 "\"" << other.typeName() << "\" " 115 "to an attribute of type " 116 "\"" << _typeName << "\"."); 117 } 118 119 _data.resizeErase (oa->_dataSize); 120 _dataSize = oa->_dataSize; 121 memcpy ((char *) _data, (const char *) oa->_data, oa->_dataSize); 122} 123 124 125} // namespace Imf 126