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