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