Statistics
| Revision:

svn-gvsig-desktop / tags / v2_0_Build_1216 / libraries / libjni-readecw-linux / include / NCSJPCFileIOStream.h @ 44116

History | View | Annotate | Download (7.53 KB)

1
/********************************************************
2
** Copyright 2002 Earth Resource Mapping Ltd.
3
** This document contains proprietary source code of
4
** Earth Resource Mapping Ltd, and can only be used under
5
** one of the three licenses as described in the 
6
** license.txt file supplied with this distribution. 
7
** See separate license.txt file for license details 
8
** and conditions.
9
**
10
** This software is covered by US patent #6,442,298,
11
** #6,102,897 and #6,633,688.  Rights to use these patents 
12
** is included in the license agreements.
13
**
14
** FILE:     $Archive: /NCS/Source/include/NCSJP2IOStream.h $
15
** CREATED:  28/11/2002 3:27:34 PM
16
** AUTHOR:   Simon Cope
17
** PURPOSE:  CNCSJPCIOStream class header
18
** EDITS:    [xx] ddMmmyy NAME COMMENTS
19
 *******************************************************/
20

    
21
#ifndef NCSJPCFILEIOSTREAM_H
22
#define NCSJPCFILEIOSTREAM_H
23

    
24
#ifndef NCSJPCIOSTREAM_H
25
#include "NCSJPCIOStream.h"
26
#endif // NCSJPCIOSTREAM_H
27

    
28
#ifndef NCSUTIL_H
29
#include "NCSUtil.h"
30
#endif // NCSUTIL_H
31

    
32
/**
33
 * CNCSJPCFileIOStream class - 64bit File-based IO "Stream" class.
34
 * This class is the IO mechanism used to access JP2 files.
35
 * << and >> Operators are not implemented as we can't use exception handling for portability reasons.
36
 * 
37
 * @author       Simon Cope
38
 * @version      $Revision: 1458 $ $Author: igbrotru $ $Date: 2005-02-15 08:52:16 +0100 (Tue, 15 Feb 2005) $ 
39
 */
40
class NCSJPC_EXPORT_ALL CNCSJPCFileIOStream: public CNCSJPCIOStream {
41
public:
42
                /** Default constructor, initialises members */
43
        CNCSJPCFileIOStream();
44
                /** Virtual destructor, releases members */
45
        virtual ~CNCSJPCFileIOStream();
46

    
47
#if defined(_WCHAR_T_DEFINED)||defined(_WCHAR_T)
48
                /** 
49
                 * Open the stream on the specified file.
50
                 * @param                pFileName        Full path Name of JP2 file being parsed
51
                 * @param                bWrite                Open for writing flag.
52
                 * @return      CNCSError        NCS_SUCCESS, or error code on failure.
53
                 */
54
        virtual CNCSError Open(wchar_t *pFileName, bool bWrite = false);
55
#endif
56
                /** 
57
                 * Open the stream on the specified file.
58
                 * @param                pFileName        Full path Name of JP2 file being parsed
59
                 * @param                bWrite                Open for writing flag.
60
                 * @return      CNCSError        NCS_SUCCESS, or error code on failure.
61
                 */
62
        virtual CNCSError Open(char *pFileName, bool bWrite = false);
63
                /** 
64
                 * Close the stream.
65
                 * @return      CNCSError        NCS_SUCCESS, or error code on failure.
66
                 */
67
        virtual CNCSError Close();
68
                /** 
69
                 * Seek on the file to the specified location.
70
                 * @param                offset                Signed 64bit offset to seek by
71
                 * @param                origin                Origin to calculate new position from.
72
                 * @return      bool                true, or false on failure.  Instance inherits CNCSError object containing error value.
73
                 */
74
        virtual bool NCS_FASTCALL Seek(INT64 offset, Origin origin = CURRENT);
75
                /** 
76
                 * Is stream seekable.
77
                 * @return      bool                true if seekable, or false if not.
78
                 */
79
        virtual bool NCS_FASTCALL Seek();
80
                /** 
81
                 * Get the current file pointer position.
82
                 * @return      INT64                Current file pointer position, or -1 on error.
83
                 */
84
        virtual INT64 NCS_FASTCALL Tell();
85
                /** 
86
                 * Get the total current size of the file, in bytes.
87
                 * @return      INT64                Size of the file, or -1 on error.
88
                 */
89
        virtual INT64 NCS_FASTCALL Size();
90

    
91
                /** 
92
                 * Read some data from the stream into the supplied buffer.
93
                 * @param                buffer                Buffer to read the data into
94
                 * @param                count                How many bytes of data to read.
95
                 * @param                pRead                How many bytes of data were actually read.
96
                 * @return      bool                true, or false on failure.  Instance inherits CNCSError object containing error value.
97
                 */
98
        virtual bool NCS_FASTCALL Read(void* buffer, UINT32 count);
99
                /** 
100
                 * Write some data to the stream.
101
                 * @param                buffer                Buffer of data to write to the stream
102
                 * @param                count                How many bytes of data to write to the stream.
103
                 * @param                pWrote                How many bytes of data were actually written to the stream.
104
                 * @return      bool                true, or false on failure.  Instance inherits CNCSError object containing error value.
105
                 */
106
        virtual bool NCS_FASTCALL Write(void* buffer, UINT32 count);
107
        
108
                /** 
109
                 * Read a UINT8 from the stream.
110
                 * @param                buffer                Buffer to receive the data
111
                 * @return      bool                true, or false on failure.  Instance inherits CNCSError object containing error value.
112
                 */
113
        virtual bool NCS_FASTCALL ReadUINT8(UINT8 &Buffer);
114

    
115
#if defined(_WCHAR_T_DEFINED)||defined(_WCHAR_T)
116
                /** 
117
                 * Set some IO callback functions to use instead of the normal crt IO routines.
118
                 * @param                pOpenACB        Open function - CHAR *.
119
                 * @param                pOpenWCB        Open function - WCHAR_T.
120
                 * @param                pCloseCB        Close function.
121
                 * @param                pReadCB                Read function.
122
                 * @param                pSeekCB                Seek function.
123
                 * @param                pTellCB                Tell function.
124
                 * @return      CNCSError        Error return.
125
                 */
126
        static CNCSError SetIOCallbacks(NCSError (NCS_CALL *pOpenACB)(char *szFileName, void **ppClientData),
127
                                                                        NCSError (NCS_CALL *pOpenWCB)(wchar_t *szFileName, void **ppClientData),
128
                                                                        NCSError (NCS_CALL *pCloseCB)(void *pClientData),
129
                                                                        NCSError (NCS_CALL *pReadCB)(void *pClientData, void *pBuffer, UINT32 nLength),
130
                                                                        NCSError (NCS_CALL *pSeekCB)(void *pClientData, UINT64 nOffset),
131
                                                                        NCSError (NCS_CALL *pTellCB)(void *pClientData, UINT64 *pOffset));
132
#else
133
                /** 
134
                 * Set some IO callback functions to use instead of the normal crt IO routines.
135
                 * @param                pOpenCB                Open function.
136
                 * @param                pCloseCB        Close function.
137
                 * @param                pReadCB                Read function.
138
                 * @param                pSeekCB                Seek function.
139
                 * @param                pTellCB                Tell function.
140
                 * @return      CNCSError        Error return.
141
                 */
142
        static CNCSError SetIOCallbacks(NCSError (NCS_CALL *pOpenCB)(char *szFileName, void **ppClientData),
143
                                                                        NCSError (NCS_CALL *pCloseCB)(void *pClientData),
144
                                                                        NCSError (NCS_CALL *pReadCB)(void *pClientData, void *pBuffer, UINT32 nLength),
145
                                                                        NCSError (NCS_CALL *pSeekCB)(void *pClientData, UINT64 nOffset),
146
                                                                        NCSError (NCS_CALL *pTellCB)(void *pClientData, UINT64 *pOffset));
147
#endif
148
        UINT32 GetIOCacheSize();
149
        void SetIOCacheSize(UINT32 nBytes);
150

    
151
protected:
152
                /** NCS 64bit file handle */
153
        NCS_FILE_HANDLE m_hFile;
154

    
155
                /** IOCache buffer */
156
        UINT8 *m_pIOCache;
157
                /** Number of bytes in Write cache */
158
        UINT32 m_nIOWriteCache;
159
                /** Current Index into read cache */
160
        UINT32 m_iIOReadCache;
161
                        /** Max IO Cache size */
162
        UINT32 m_nMaxIOCache;
163
                        /** Global Max IO Cache size */
164
        static UINT32 sm_nMaxIOCache;
165
                /** Precalculates file size for read only stream */
166
        INT64        m_nFileSize;
167

    
168
                /** 
169
                 * Flush write cache to file.
170
                 * @return      bool                true, or false on failure.  Instance inherits CNCSError object containing error value.
171
                 */
172
        virtual __inline void WriteFlush() {
173
                        if(m_bWrite && m_pIOCache && m_nIOWriteCache) {
174
                                NCSError eError = NCSFileWrite(m_hFile, m_pIOCache, m_nIOWriteCache, NULL);
175
                                if(eError == NCS_SUCCESS) {
176
                                        m_nOffset += m_nIOWriteCache;
177
                                        m_nFileSize = NCSMax(m_nFileSize, m_nOffset);
178
                                        m_nIOWriteCache = 0;
179
                                } else {
180
                                        *(CNCSError*)this = eError;
181
                                }
182
                        } 
183
                }
184

    
185
                /** 
186
                 * Flush read cache .
187
                 * @return      bool                true, or false on failure.  Instance inherits CNCSError object containing error value.
188
                 */
189
        virtual __inline void ReadFlush() {
190
                                // Current just invalidate the cache.
191
                        m_iIOReadCache = GetIOCacheSize();
192
                }
193

    
194
        static NCSError (NCS_CALL *sm_pOpenACB)(char *szFileName, void **ppClientData);
195
        static NCSError (NCS_CALL *sm_pOpenWCB)(wchar_t *szFileName, void **ppClientData);
196
        static NCSError (NCS_CALL *sm_pCloseCB)(void *pClientData);
197
        static NCSError (NCS_CALL *sm_pReadCB)(void *pClientData, void *pBuffer, UINT32 nLength);
198
        static NCSError (NCS_CALL *sm_pSeekCB)(void *pClientData, UINT64 nOffset);
199
        static NCSError (NCS_CALL *sm_pTellCB)(void *pClientData, UINT64 *pOffset);
200
};
201

    
202
#endif // !NCSJPCFILEIOSTREAM_H