1/*****************************************************************************/ 2// Copyright 2006-2007 Adobe Systems Incorporated 3// All Rights Reserved. 4// 5// NOTICE: Adobe permits you to use, modify, and distribute this file in 6// accordance with the terms of the Adobe license agreement accompanying it. 7/*****************************************************************************/ 8 9/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_file_stream.cpp#2 $ */ 10/* $DateTime: 2012/06/01 07:28:57 $ */ 11/* $Change: 832715 $ */ 12/* $Author: tknoll $ */ 13 14/*****************************************************************************/ 15 16#include "dng_file_stream.h" 17 18#include "dng_exceptions.h" 19 20/*****************************************************************************/ 21 22dng_file_stream::dng_file_stream (const char *filename, 23 bool output, 24 uint32 bufferSize) 25 26 : dng_stream ((dng_abort_sniffer *) NULL, 27 bufferSize, 28 0) 29 30 , fFile (NULL) 31 32 { 33 34 fFile = fopen (filename, output ? "wb" : "rb"); 35 36 if (!fFile) 37 { 38 39 #if qDNGValidate 40 41 ReportError ("Unable to open file", 42 filename); 43 44 ThrowSilentError (); 45 46 #else 47 48 ThrowOpenFile (); 49 50 #endif 51 52 } 53 54 } 55 56/*****************************************************************************/ 57 58dng_file_stream::~dng_file_stream () 59 { 60 61 if (fFile) 62 { 63 fclose (fFile); 64 fFile = NULL; 65 } 66 67 } 68 69/*****************************************************************************/ 70 71uint64 dng_file_stream::DoGetLength () 72 { 73 74 if (fseek (fFile, 0, SEEK_END) != 0) 75 { 76 77 ThrowReadFile (); 78 79 } 80 81 return (uint64) ftell (fFile); 82 83 } 84 85/*****************************************************************************/ 86 87void dng_file_stream::DoRead (void *data, 88 uint32 count, 89 uint64 offset) 90 { 91 92 if (fseek (fFile, (long) offset, SEEK_SET) != 0) 93 { 94 95 ThrowReadFile (); 96 97 } 98 99 uint32 bytesRead = (uint32) fread (data, 1, count, fFile); 100 101 if (bytesRead != count) 102 { 103 104 ThrowReadFile (); 105 106 } 107 108 } 109 110/*****************************************************************************/ 111 112void dng_file_stream::DoWrite (const void *data, 113 uint32 count, 114 uint64 offset) 115 { 116 117 if (fseek (fFile, (uint32) offset, SEEK_SET) != 0) 118 { 119 120 ThrowWriteFile (); 121 122 } 123 124 uint32 bytesWritten = (uint32) fwrite (data, 1, count, fFile); 125 126 if (bytesWritten != count) 127 { 128 129 ThrowWriteFile (); 130 131 } 132 133 } 134 135/*****************************************************************************/ 136