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