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 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 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 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 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 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 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 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 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 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 129*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 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 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 169*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 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 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 225*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 & 231*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*8a106958SDamjan Jovanovic 239