| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #include <precomp.h> |
| #include <cosv/file.hxx> |
| |
| // NOT FULLY DECLARED SERVICES |
| |
| |
| namespace csv |
| { |
| |
| |
| File::File( uintt i_nMode ) |
| : // aPath, |
| pStream(0), |
| nMode(i_nMode), |
| eLastIO(io_none) |
| { |
| } |
| |
| File::File( const ploc::Path & i_rLocation, |
| uintt i_nMode ) |
| : aPath(i_rLocation), |
| pStream(0), |
| nMode(i_nMode), |
| eLastIO(io_none) |
| { |
| } |
| |
| File::File( const char * i_sLocation, |
| uintt i_nMode ) |
| : aPath(i_sLocation), |
| pStream(0), |
| nMode(i_nMode), |
| eLastIO(io_none) |
| { |
| } |
| |
| File::File( const String & i_sLocation, |
| uintt i_nMode ) |
| : aPath(i_sLocation), |
| pStream(0), |
| nMode(i_nMode), |
| eLastIO(io_none) |
| { |
| } |
| |
| File::~File() |
| { |
| if ( inq_is_open() ) |
| close(); |
| } |
| |
| bool |
| File::Assign( ploc::Path i_rLocation ) |
| { |
| if (is_open() ) |
| return false; |
| |
| InvalidatePath(); |
| aPath = i_rLocation; |
| return true; |
| } |
| |
| bool |
| File::Assign( const char * i_sLocation ) |
| { |
| if (is_open() ) |
| return false; |
| |
| InvalidatePath(); |
| aPath.Set( i_sLocation ); |
| return true; |
| } |
| |
| bool |
| File::Assign( const String & i_sLocation ) |
| { |
| if (is_open() ) |
| return false; |
| |
| InvalidatePath(); |
| aPath.Set( i_sLocation ); |
| return true; |
| } |
| |
| uintt |
| File::do_read( void * out_pDest, |
| uintt i_nNrofBytes ) |
| { |
| if ( NOT inq_is_open() ) |
| return 0; |
| |
| if ( eLastIO == io_write ) |
| ::fseek( pStream, 0, SEEK_CUR ); |
| uintt ret = position(); |
| int iRet= ::fread( out_pDest, 1, i_nNrofBytes, pStream ); |
| if ( iRet < 0 ) { |
| fprintf(stderr, "warning: read failed in %s line %d \n", __FILE__, __LINE__); |
| } |
| ret = position() - ret; |
| |
| eLastIO = io_read; |
| return ret; |
| } |
| |
| bool |
| File::inq_eod() const |
| { |
| if ( NOT inq_is_open() ) |
| return true; |
| return feof(pStream) != 0; |
| } |
| |
| uintt |
| File::do_write( const void * i_pSrc, |
| uintt i_nNrofBytes ) |
| { |
| if ( NOT inq_is_open() ) |
| return 0; |
| |
| if ( eLastIO == io_write ) |
| ::fseek( pStream, 0, SEEK_CUR ); |
| uintt ret = position(); |
| ::fwrite( i_pSrc, 1, i_nNrofBytes, pStream ); |
| ret = position() - ret; |
| |
| eLastIO = io_write; |
| return ret; |
| } |
| |
| uintt |
| File::do_seek( intt i_nDistance, |
| seek_dir i_eStartPoint ) |
| { |
| if ( NOT inq_is_open() ) |
| return uintt(-1); |
| |
| static int eSearchDir[3] = { SEEK_SET, SEEK_CUR, SEEK_END }; |
| |
| ::fseek( pStream, |
| intt(i_nDistance), |
| eSearchDir[i_eStartPoint] ); |
| return position(); |
| } |
| |
| uintt |
| File::inq_position() const |
| { |
| if ( inq_is_open() ) |
| return uintt( ::ftell(pStream) ); |
| else |
| return uintt(-1); |
| } |
| |
| bool |
| File::do_open( uintt i_nOpenMode ) |
| { |
| if ( inq_is_open() ) |
| { |
| if ( i_nOpenMode == 0 OR i_nOpenMode == nMode ) |
| return true; |
| close(); |
| } |
| |
| if ( i_nOpenMode != 0 ) |
| nMode = i_nOpenMode; |
| |
| const char * sFacadeMode = ""; |
| switch ( nMode ) |
| { |
| case CFM_RW: sFacadeMode = "r+b"; |
| break; |
| case CFM_CREATE: sFacadeMode = "w+b"; |
| break; |
| case CFM_READ: sFacadeMode = "rb"; |
| break; |
| default: |
| sFacadeMode = "rb"; |
| } |
| |
| pStream = ::fopen( StrPath(), sFacadeMode ); |
| if ( pStream == 0 AND nMode == CFM_RW ) |
| { |
| sFacadeMode = "w+b"; |
| pStream = ::fopen( StrPath(), sFacadeMode ); |
| } |
| |
| return pStream != 0; |
| } |
| |
| void |
| File::do_close() |
| { |
| if ( inq_is_open() ) |
| { |
| ::fclose(pStream); |
| pStream = 0; |
| } |
| eLastIO = io_none; |
| } |
| |
| bool |
| File::inq_is_open() const |
| { |
| return pStream != 0; |
| } |
| |
| const ploc::Path & |
| File::inq_MyPath() const |
| { |
| return aPath; |
| } |
| |
| |
| } // namespace csv |
| |