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