1*11c03c6dSDamjan Jovanovic /**************************************************************
2*11c03c6dSDamjan Jovanovic *
3*11c03c6dSDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one
4*11c03c6dSDamjan Jovanovic * or more contributor license agreements. See the NOTICE file
5*11c03c6dSDamjan Jovanovic * distributed with this work for additional information
6*11c03c6dSDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file
7*11c03c6dSDamjan Jovanovic * to you under the Apache License, Version 2.0 (the
8*11c03c6dSDamjan Jovanovic * "License"); you may not use this file except in compliance
9*11c03c6dSDamjan Jovanovic * with the License. You may obtain a copy of the License at
10*11c03c6dSDamjan Jovanovic *
11*11c03c6dSDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0
12*11c03c6dSDamjan Jovanovic *
13*11c03c6dSDamjan Jovanovic * Unless required by applicable law or agreed to in writing,
14*11c03c6dSDamjan Jovanovic * software distributed under the License is distributed on an
15*11c03c6dSDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*11c03c6dSDamjan Jovanovic * KIND, either express or implied. See the License for the
17*11c03c6dSDamjan Jovanovic * specific language governing permissions and limitations
18*11c03c6dSDamjan Jovanovic * under the License.
19*11c03c6dSDamjan Jovanovic *
20*11c03c6dSDamjan Jovanovic *************************************************************/
21*11c03c6dSDamjan Jovanovic
22*11c03c6dSDamjan Jovanovic
23*11c03c6dSDamjan Jovanovic
24*11c03c6dSDamjan Jovanovic #include <precomp.h>
25*11c03c6dSDamjan Jovanovic #include <cosv/file.hxx>
26*11c03c6dSDamjan Jovanovic
27*11c03c6dSDamjan Jovanovic // NOT FULLY DECLARED SERVICES
28*11c03c6dSDamjan Jovanovic
29*11c03c6dSDamjan Jovanovic
30*11c03c6dSDamjan Jovanovic namespace csv
31*11c03c6dSDamjan Jovanovic {
32*11c03c6dSDamjan Jovanovic
33*11c03c6dSDamjan Jovanovic
File(uintt i_nMode)34*11c03c6dSDamjan Jovanovic File::File( uintt i_nMode )
35*11c03c6dSDamjan Jovanovic : // aPath,
36*11c03c6dSDamjan Jovanovic pStream(0),
37*11c03c6dSDamjan Jovanovic nMode(i_nMode),
38*11c03c6dSDamjan Jovanovic eLastIO(io_none)
39*11c03c6dSDamjan Jovanovic {
40*11c03c6dSDamjan Jovanovic }
41*11c03c6dSDamjan Jovanovic
File(const ploc::Path & i_rLocation,uintt i_nMode)42*11c03c6dSDamjan Jovanovic File::File( const ploc::Path & i_rLocation,
43*11c03c6dSDamjan Jovanovic uintt i_nMode )
44*11c03c6dSDamjan Jovanovic : aPath(i_rLocation),
45*11c03c6dSDamjan Jovanovic pStream(0),
46*11c03c6dSDamjan Jovanovic nMode(i_nMode),
47*11c03c6dSDamjan Jovanovic eLastIO(io_none)
48*11c03c6dSDamjan Jovanovic {
49*11c03c6dSDamjan Jovanovic }
50*11c03c6dSDamjan Jovanovic
File(const char * i_sLocation,uintt i_nMode)51*11c03c6dSDamjan Jovanovic File::File( const char * i_sLocation,
52*11c03c6dSDamjan Jovanovic uintt i_nMode )
53*11c03c6dSDamjan Jovanovic : aPath(i_sLocation),
54*11c03c6dSDamjan Jovanovic pStream(0),
55*11c03c6dSDamjan Jovanovic nMode(i_nMode),
56*11c03c6dSDamjan Jovanovic eLastIO(io_none)
57*11c03c6dSDamjan Jovanovic {
58*11c03c6dSDamjan Jovanovic }
59*11c03c6dSDamjan Jovanovic
File(const String & i_sLocation,uintt i_nMode)60*11c03c6dSDamjan Jovanovic File::File( const String & i_sLocation,
61*11c03c6dSDamjan Jovanovic uintt i_nMode )
62*11c03c6dSDamjan Jovanovic : aPath(i_sLocation),
63*11c03c6dSDamjan Jovanovic pStream(0),
64*11c03c6dSDamjan Jovanovic nMode(i_nMode),
65*11c03c6dSDamjan Jovanovic eLastIO(io_none)
66*11c03c6dSDamjan Jovanovic {
67*11c03c6dSDamjan Jovanovic }
68*11c03c6dSDamjan Jovanovic
~File()69*11c03c6dSDamjan Jovanovic File::~File()
70*11c03c6dSDamjan Jovanovic {
71*11c03c6dSDamjan Jovanovic if ( inq_is_open() )
72*11c03c6dSDamjan Jovanovic close();
73*11c03c6dSDamjan Jovanovic }
74*11c03c6dSDamjan Jovanovic
75*11c03c6dSDamjan Jovanovic bool
Assign(ploc::Path i_rLocation)76*11c03c6dSDamjan Jovanovic File::Assign( ploc::Path i_rLocation )
77*11c03c6dSDamjan Jovanovic {
78*11c03c6dSDamjan Jovanovic if (is_open() )
79*11c03c6dSDamjan Jovanovic return false;
80*11c03c6dSDamjan Jovanovic
81*11c03c6dSDamjan Jovanovic InvalidatePath();
82*11c03c6dSDamjan Jovanovic aPath = i_rLocation;
83*11c03c6dSDamjan Jovanovic return true;
84*11c03c6dSDamjan Jovanovic }
85*11c03c6dSDamjan Jovanovic
86*11c03c6dSDamjan Jovanovic bool
Assign(const char * i_sLocation)87*11c03c6dSDamjan Jovanovic File::Assign( const char * i_sLocation )
88*11c03c6dSDamjan Jovanovic {
89*11c03c6dSDamjan Jovanovic if (is_open() )
90*11c03c6dSDamjan Jovanovic return false;
91*11c03c6dSDamjan Jovanovic
92*11c03c6dSDamjan Jovanovic InvalidatePath();
93*11c03c6dSDamjan Jovanovic aPath.Set( i_sLocation );
94*11c03c6dSDamjan Jovanovic return true;
95*11c03c6dSDamjan Jovanovic }
96*11c03c6dSDamjan Jovanovic
97*11c03c6dSDamjan Jovanovic bool
Assign(const String & i_sLocation)98*11c03c6dSDamjan Jovanovic File::Assign( const String & i_sLocation )
99*11c03c6dSDamjan Jovanovic {
100*11c03c6dSDamjan Jovanovic if (is_open() )
101*11c03c6dSDamjan Jovanovic return false;
102*11c03c6dSDamjan Jovanovic
103*11c03c6dSDamjan Jovanovic InvalidatePath();
104*11c03c6dSDamjan Jovanovic aPath.Set( i_sLocation );
105*11c03c6dSDamjan Jovanovic return true;
106*11c03c6dSDamjan Jovanovic }
107*11c03c6dSDamjan Jovanovic
108*11c03c6dSDamjan Jovanovic uintt
do_read(void * out_pDest,uintt i_nNrofBytes)109*11c03c6dSDamjan Jovanovic File::do_read( void * out_pDest,
110*11c03c6dSDamjan Jovanovic uintt i_nNrofBytes )
111*11c03c6dSDamjan Jovanovic {
112*11c03c6dSDamjan Jovanovic if ( NOT inq_is_open() )
113*11c03c6dSDamjan Jovanovic return 0;
114*11c03c6dSDamjan Jovanovic
115*11c03c6dSDamjan Jovanovic if ( eLastIO == io_write )
116*11c03c6dSDamjan Jovanovic ::fseek( pStream, 0, SEEK_CUR );
117*11c03c6dSDamjan Jovanovic uintt ret = position();
118*11c03c6dSDamjan Jovanovic int iRet= ::fread( out_pDest, 1, i_nNrofBytes, pStream );
119*11c03c6dSDamjan Jovanovic if ( iRet < 0 ) {
120*11c03c6dSDamjan Jovanovic fprintf(stderr, "warning: read failed in %s line %d \n", __FILE__, __LINE__);
121*11c03c6dSDamjan Jovanovic }
122*11c03c6dSDamjan Jovanovic ret = position() - ret;
123*11c03c6dSDamjan Jovanovic
124*11c03c6dSDamjan Jovanovic eLastIO = io_read;
125*11c03c6dSDamjan Jovanovic return ret;
126*11c03c6dSDamjan Jovanovic }
127*11c03c6dSDamjan Jovanovic
128*11c03c6dSDamjan Jovanovic bool
inq_eod() const129*11c03c6dSDamjan Jovanovic File::inq_eod() const
130*11c03c6dSDamjan Jovanovic {
131*11c03c6dSDamjan Jovanovic if ( NOT inq_is_open() )
132*11c03c6dSDamjan Jovanovic return true;
133*11c03c6dSDamjan Jovanovic return feof(pStream) != 0;
134*11c03c6dSDamjan Jovanovic }
135*11c03c6dSDamjan Jovanovic
136*11c03c6dSDamjan Jovanovic uintt
do_write(const void * i_pSrc,uintt i_nNrofBytes)137*11c03c6dSDamjan Jovanovic File::do_write( const void * i_pSrc,
138*11c03c6dSDamjan Jovanovic uintt i_nNrofBytes )
139*11c03c6dSDamjan Jovanovic {
140*11c03c6dSDamjan Jovanovic if ( NOT inq_is_open() )
141*11c03c6dSDamjan Jovanovic return 0;
142*11c03c6dSDamjan Jovanovic
143*11c03c6dSDamjan Jovanovic if ( eLastIO == io_write )
144*11c03c6dSDamjan Jovanovic ::fseek( pStream, 0, SEEK_CUR );
145*11c03c6dSDamjan Jovanovic uintt ret = position();
146*11c03c6dSDamjan Jovanovic ::fwrite( i_pSrc, 1, i_nNrofBytes, pStream );
147*11c03c6dSDamjan Jovanovic ret = position() - ret;
148*11c03c6dSDamjan Jovanovic
149*11c03c6dSDamjan Jovanovic eLastIO = io_write;
150*11c03c6dSDamjan Jovanovic return ret;
151*11c03c6dSDamjan Jovanovic }
152*11c03c6dSDamjan Jovanovic
153*11c03c6dSDamjan Jovanovic uintt
do_seek(intt i_nDistance,seek_dir i_eStartPoint)154*11c03c6dSDamjan Jovanovic File::do_seek( intt i_nDistance,
155*11c03c6dSDamjan Jovanovic seek_dir i_eStartPoint )
156*11c03c6dSDamjan Jovanovic {
157*11c03c6dSDamjan Jovanovic if ( NOT inq_is_open() )
158*11c03c6dSDamjan Jovanovic return uintt(-1);
159*11c03c6dSDamjan Jovanovic
160*11c03c6dSDamjan Jovanovic static int eSearchDir[3] = { SEEK_SET, SEEK_CUR, SEEK_END };
161*11c03c6dSDamjan Jovanovic
162*11c03c6dSDamjan Jovanovic ::fseek( pStream,
163*11c03c6dSDamjan Jovanovic intt(i_nDistance),
164*11c03c6dSDamjan Jovanovic eSearchDir[i_eStartPoint] );
165*11c03c6dSDamjan Jovanovic return position();
166*11c03c6dSDamjan Jovanovic }
167*11c03c6dSDamjan Jovanovic
168*11c03c6dSDamjan Jovanovic uintt
inq_position() const169*11c03c6dSDamjan Jovanovic File::inq_position() const
170*11c03c6dSDamjan Jovanovic {
171*11c03c6dSDamjan Jovanovic if ( inq_is_open() )
172*11c03c6dSDamjan Jovanovic return uintt( ::ftell(pStream) );
173*11c03c6dSDamjan Jovanovic else
174*11c03c6dSDamjan Jovanovic return uintt(-1);
175*11c03c6dSDamjan Jovanovic }
176*11c03c6dSDamjan Jovanovic
177*11c03c6dSDamjan Jovanovic bool
do_open(uintt i_nOpenMode)178*11c03c6dSDamjan Jovanovic File::do_open( uintt i_nOpenMode )
179*11c03c6dSDamjan Jovanovic {
180*11c03c6dSDamjan Jovanovic if ( inq_is_open() )
181*11c03c6dSDamjan Jovanovic {
182*11c03c6dSDamjan Jovanovic if ( i_nOpenMode == 0 OR i_nOpenMode == nMode )
183*11c03c6dSDamjan Jovanovic return true;
184*11c03c6dSDamjan Jovanovic close();
185*11c03c6dSDamjan Jovanovic }
186*11c03c6dSDamjan Jovanovic
187*11c03c6dSDamjan Jovanovic if ( i_nOpenMode != 0 )
188*11c03c6dSDamjan Jovanovic nMode = i_nOpenMode;
189*11c03c6dSDamjan Jovanovic
190*11c03c6dSDamjan Jovanovic const char * sFacadeMode = "";
191*11c03c6dSDamjan Jovanovic switch ( nMode )
192*11c03c6dSDamjan Jovanovic {
193*11c03c6dSDamjan Jovanovic case CFM_RW: sFacadeMode = "r+b";
194*11c03c6dSDamjan Jovanovic break;
195*11c03c6dSDamjan Jovanovic case CFM_CREATE: sFacadeMode = "w+b";
196*11c03c6dSDamjan Jovanovic break;
197*11c03c6dSDamjan Jovanovic case CFM_READ: sFacadeMode = "rb";
198*11c03c6dSDamjan Jovanovic break;
199*11c03c6dSDamjan Jovanovic default:
200*11c03c6dSDamjan Jovanovic sFacadeMode = "rb";
201*11c03c6dSDamjan Jovanovic }
202*11c03c6dSDamjan Jovanovic
203*11c03c6dSDamjan Jovanovic pStream = ::fopen( StrPath(), sFacadeMode );
204*11c03c6dSDamjan Jovanovic if ( pStream == 0 AND nMode == CFM_RW )
205*11c03c6dSDamjan Jovanovic {
206*11c03c6dSDamjan Jovanovic sFacadeMode = "w+b";
207*11c03c6dSDamjan Jovanovic pStream = ::fopen( StrPath(), sFacadeMode );
208*11c03c6dSDamjan Jovanovic }
209*11c03c6dSDamjan Jovanovic
210*11c03c6dSDamjan Jovanovic return pStream != 0;
211*11c03c6dSDamjan Jovanovic }
212*11c03c6dSDamjan Jovanovic
213*11c03c6dSDamjan Jovanovic void
do_close()214*11c03c6dSDamjan Jovanovic File::do_close()
215*11c03c6dSDamjan Jovanovic {
216*11c03c6dSDamjan Jovanovic if ( inq_is_open() )
217*11c03c6dSDamjan Jovanovic {
218*11c03c6dSDamjan Jovanovic ::fclose(pStream);
219*11c03c6dSDamjan Jovanovic pStream = 0;
220*11c03c6dSDamjan Jovanovic }
221*11c03c6dSDamjan Jovanovic eLastIO = io_none;
222*11c03c6dSDamjan Jovanovic }
223*11c03c6dSDamjan Jovanovic
224*11c03c6dSDamjan Jovanovic bool
inq_is_open() const225*11c03c6dSDamjan Jovanovic File::inq_is_open() const
226*11c03c6dSDamjan Jovanovic {
227*11c03c6dSDamjan Jovanovic return pStream != 0;
228*11c03c6dSDamjan Jovanovic }
229*11c03c6dSDamjan Jovanovic
230*11c03c6dSDamjan Jovanovic const ploc::Path &
inq_MyPath() const231*11c03c6dSDamjan Jovanovic File::inq_MyPath() const
232*11c03c6dSDamjan Jovanovic {
233*11c03c6dSDamjan Jovanovic return aPath;
234*11c03c6dSDamjan Jovanovic }
235*11c03c6dSDamjan Jovanovic
236*11c03c6dSDamjan Jovanovic
237*11c03c6dSDamjan Jovanovic } // namespace csv
238