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 #ifndef CSV_BSTREAM_HXX 25*11c03c6dSDamjan Jovanovic #define CSV_BSTREAM_HXX 26*11c03c6dSDamjan Jovanovic 27*11c03c6dSDamjan Jovanovic #include <string.h> 28*11c03c6dSDamjan Jovanovic #include <cosv/string.hxx> 29*11c03c6dSDamjan Jovanovic 30*11c03c6dSDamjan Jovanovic 31*11c03c6dSDamjan Jovanovic namespace csv 32*11c03c6dSDamjan Jovanovic { 33*11c03c6dSDamjan Jovanovic 34*11c03c6dSDamjan Jovanovic 35*11c03c6dSDamjan Jovanovic enum seek_dir 36*11c03c6dSDamjan Jovanovic { 37*11c03c6dSDamjan Jovanovic beg = 0, 38*11c03c6dSDamjan Jovanovic cur = 1, 39*11c03c6dSDamjan Jovanovic end = 2 40*11c03c6dSDamjan Jovanovic }; 41*11c03c6dSDamjan Jovanovic 42*11c03c6dSDamjan Jovanovic 43*11c03c6dSDamjan Jovanovic class bistream 44*11c03c6dSDamjan Jovanovic { 45*11c03c6dSDamjan Jovanovic public: 46*11c03c6dSDamjan Jovanovic // LIFECYCLE 47*11c03c6dSDamjan Jovanovic virtual ~bistream() {} 48*11c03c6dSDamjan Jovanovic 49*11c03c6dSDamjan Jovanovic // OPERATIONS 50*11c03c6dSDamjan Jovanovic /// @return Number of actually read bytes. 51*11c03c6dSDamjan Jovanovic uintt read( 52*11c03c6dSDamjan Jovanovic void * out_pDest, 53*11c03c6dSDamjan Jovanovic uintt i_nNrofBytes); 54*11c03c6dSDamjan Jovanovic // INQUIRY 55*11c03c6dSDamjan Jovanovic /** @return True, if already one try to read had failed. 56*11c03c6dSDamjan Jovanovic There is no guarantee, that it returns true, if end of data 57*11c03c6dSDamjan Jovanovic is just reached. 58*11c03c6dSDamjan Jovanovic Though it will return false, if there is still somemething 59*11c03c6dSDamjan Jovanovic to read. 60*11c03c6dSDamjan Jovanovic */ 61*11c03c6dSDamjan Jovanovic bool eod() const; 62*11c03c6dSDamjan Jovanovic 63*11c03c6dSDamjan Jovanovic private: 64*11c03c6dSDamjan Jovanovic virtual uintt do_read( 65*11c03c6dSDamjan Jovanovic void * out_pDest, 66*11c03c6dSDamjan Jovanovic uintt i_nNrofBytes) = 0; 67*11c03c6dSDamjan Jovanovic virtual bool inq_eod() const = 0; 68*11c03c6dSDamjan Jovanovic }; 69*11c03c6dSDamjan Jovanovic 70*11c03c6dSDamjan Jovanovic 71*11c03c6dSDamjan Jovanovic class bostream 72*11c03c6dSDamjan Jovanovic { 73*11c03c6dSDamjan Jovanovic public: 74*11c03c6dSDamjan Jovanovic // LIFECYCLE 75*11c03c6dSDamjan Jovanovic virtual ~bostream() {} 76*11c03c6dSDamjan Jovanovic 77*11c03c6dSDamjan Jovanovic // OPERATIONS 78*11c03c6dSDamjan Jovanovic /// @return Number of actually written bytes. 79*11c03c6dSDamjan Jovanovic uintt write( 80*11c03c6dSDamjan Jovanovic const void * i_pSrc, 81*11c03c6dSDamjan Jovanovic uintt i_nNrofBytes); 82*11c03c6dSDamjan Jovanovic /// @return Number of actually written bytes. 83*11c03c6dSDamjan Jovanovic uintt write( 84*11c03c6dSDamjan Jovanovic const char * i_pSrc ); 85*11c03c6dSDamjan Jovanovic /// @return Number of actually written bytes. 86*11c03c6dSDamjan Jovanovic uintt write( 87*11c03c6dSDamjan Jovanovic const String & i_pSrc ); 88*11c03c6dSDamjan Jovanovic private: 89*11c03c6dSDamjan Jovanovic virtual uintt do_write( 90*11c03c6dSDamjan Jovanovic const void * i_pSrc, 91*11c03c6dSDamjan Jovanovic uintt i_nNrofBytes) = 0; 92*11c03c6dSDamjan Jovanovic }; 93*11c03c6dSDamjan Jovanovic 94*11c03c6dSDamjan Jovanovic 95*11c03c6dSDamjan Jovanovic class bstream : public bistream, 96*11c03c6dSDamjan Jovanovic public bostream 97*11c03c6dSDamjan Jovanovic { 98*11c03c6dSDamjan Jovanovic public: 99*11c03c6dSDamjan Jovanovic uintt seek( 100*11c03c6dSDamjan Jovanovic intt i_nDistanceFromBegin, 101*11c03c6dSDamjan Jovanovic seek_dir i_eStartPoint = ::csv::beg ); 102*11c03c6dSDamjan Jovanovic uintt position() const; 103*11c03c6dSDamjan Jovanovic 104*11c03c6dSDamjan Jovanovic private: 105*11c03c6dSDamjan Jovanovic virtual uintt do_seek( 106*11c03c6dSDamjan Jovanovic intt i_nDistance, 107*11c03c6dSDamjan Jovanovic seek_dir i_eStartPoint = ::csv::beg ) = 0; 108*11c03c6dSDamjan Jovanovic virtual uintt inq_position() const = 0; 109*11c03c6dSDamjan Jovanovic }; 110*11c03c6dSDamjan Jovanovic 111*11c03c6dSDamjan Jovanovic 112*11c03c6dSDamjan Jovanovic // IMPLEMENTATION 113*11c03c6dSDamjan Jovanovic inline uintt 114*11c03c6dSDamjan Jovanovic bistream::read( void * o_pDest, 115*11c03c6dSDamjan Jovanovic uintt i_nNrofBytes) 116*11c03c6dSDamjan Jovanovic { return do_read(o_pDest, i_nNrofBytes); } 117*11c03c6dSDamjan Jovanovic inline bool 118*11c03c6dSDamjan Jovanovic bistream::eod() const 119*11c03c6dSDamjan Jovanovic { return inq_eod(); } 120*11c03c6dSDamjan Jovanovic 121*11c03c6dSDamjan Jovanovic inline uintt 122*11c03c6dSDamjan Jovanovic bostream::write( const void * i_pSrc, 123*11c03c6dSDamjan Jovanovic uintt i_nNrofBytes) 124*11c03c6dSDamjan Jovanovic { return do_write( i_pSrc, i_nNrofBytes ); } 125*11c03c6dSDamjan Jovanovic inline uintt 126*11c03c6dSDamjan Jovanovic bostream::write( const char * i_sSrc ) 127*11c03c6dSDamjan Jovanovic { return write( i_sSrc, strlen(i_sSrc) ); } 128*11c03c6dSDamjan Jovanovic inline uintt 129*11c03c6dSDamjan Jovanovic bostream::write( const String & i_sSrc ) 130*11c03c6dSDamjan Jovanovic { return write( i_sSrc.c_str(), i_sSrc.length() ); } 131*11c03c6dSDamjan Jovanovic 132*11c03c6dSDamjan Jovanovic inline uintt 133*11c03c6dSDamjan Jovanovic bstream::seek( intt i_nDistance, 134*11c03c6dSDamjan Jovanovic seek_dir i_eStartPoint ) 135*11c03c6dSDamjan Jovanovic { return do_seek( i_nDistance, i_eStartPoint ); } 136*11c03c6dSDamjan Jovanovic inline uintt 137*11c03c6dSDamjan Jovanovic bstream::position() const 138*11c03c6dSDamjan Jovanovic { return inq_position(); } 139*11c03c6dSDamjan Jovanovic 140*11c03c6dSDamjan Jovanovic 141*11c03c6dSDamjan Jovanovic 142*11c03c6dSDamjan Jovanovic } // namespace csv 143*11c03c6dSDamjan Jovanovic 144*11c03c6dSDamjan Jovanovic 145*11c03c6dSDamjan Jovanovic #endif 146*11c03c6dSDamjan Jovanovic 147