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