00001 /* 00002 * Copyright (c) 2004 CSIRO ICT Centre 00003 * 00004 * $Id: SplitFileReader.cpp 587 2004-12-03 15:06:33Z nch $ 00005 */ 00006 00007 #include <stdio.h> 00008 #include "String.h" 00009 #include <vector> 00010 00011 #include "FileObjectReader.h" 00012 #include "FileReader.h" 00013 #include "SplitFileReader.h" 00014 00015 00016 SplitFileReader::SplitFileReader(FileObjectReader * obj, 00017 std::vector<String> const & fileNames, 00018 bool areLargeFiles) 00019 : FileReader(obj, areLargeFiles), 00020 m_fileNames(fileNames), 00021 m_fileNum(0), 00022 m_finished(false) 00023 { 00024 } 00025 00026 SplitFileReader::~SplitFileReader() 00027 { 00028 m_fileNames.clear(); 00029 } 00030 00031 void SplitFileReader::open() 00032 { 00033 if (m_fileNum < m_fileNames.size()) 00034 { 00035 fileName = m_fileNames[m_fileNum++].c_str(); 00036 FileReader::open(); 00037 } 00038 else 00039 { 00040 m_finished = true; 00041 } 00042 } 00043 00044 void SplitFileReader::reopen() 00045 { 00046 m_fileNum = 0; 00047 m_finished = false; 00048 close(); 00049 open(); 00050 } 00051 00052 Object * SplitFileReader::read() 00053 { 00054 Object * next = 0; 00055 00056 if (!m_finished) 00057 { 00058 next = FileReader::read(); 00059 if (next == 0) 00060 { 00061 // try to read from the next file 00062 close(); 00063 open(); 00064 if (!m_finished) 00065 { 00066 next = read(); 00067 } 00068 } 00069 } 00070 00071 return next; 00072 }