xref: /aoo4110/main/cosv/source/storage/file.cxx (revision b1cdbd2c)
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