DataFile *DataFile::reference(const stdString &req_dirname, const stdString &req_basename, bool for_write) { DataFile *datafile = 0; stdString dirname, basename, filename; Filename::build(req_dirname, req_basename, filename); Filename::getDirname(filename, dirname); Filename::getBasename(filename, basename); #ifdef LOG_DATAFILE LOG_MSG("reference('%s', '%s', %s)\n", req_dirname.c_str(), req_basename.c_str(), (for_write ? "read/write" : "read-only")); LOG_MSG("normalized: '%s' + '%s' = '%s')\n", dirname.c_str(), basename.c_str(), filename.c_str()); #endif stdList<DataFile *>::iterator i = open_data_files.begin(); for (/**/; i != open_data_files.end (); ++i) { datafile = *i; if (datafile->getFilename() == filename && datafile->for_write == for_write) { #ifdef LOG_DATAFILE LOG_MSG("DataFile %s (%c) is cached (%d)\n", filename.c_str(), (for_write?'W':'R'), datafile->ref_count); #endif datafile->reference(); // When it was put in the cache, it might // have been a new file. // But now it's one that already existed, // so reset is_new_file: datafile->is_new_file = false; return datafile; } } try { datafile = new DataFile(dirname, basename, filename, for_write); datafile->reopen(); open_data_files.push_back(datafile); return datafile; } catch (...) { if (datafile) delete datafile; throw GenericException(__FILE__, __LINE__, "Cannot reference '%s'", filename.c_str()); } }
DataFile *DataFile::reference (const stdString &filename, bool for_write) { DataFile *file; FileMap::iterator i = open_data_files.find (filename); if (i == open_data_files.end ()) { file = new DataFile (filename, for_write); open_data_files.insert (FileMap::value_type (file->getFilename(), file)); } else { file = i->second; file->reference (); } return file; }