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 
dng_file_stream(const char * filename,bool output,uint32 bufferSize)22 dng_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 
~dng_file_stream()58 dng_file_stream::~dng_file_stream ()
59 	{
60 
61 	if (fFile)
62 		{
63 		fclose (fFile);
64 		fFile = NULL;
65 		}
66 
67 	}
68 
69 /*****************************************************************************/
70 
DoGetLength()71 uint64 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 
DoRead(void * data,uint32 count,uint64 offset)87 void 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 
DoWrite(const void * data,uint32 count,uint64 offset)112 void 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