// SingleFileDataset.cxx #include "dataset_base/SingleFileDataset.h" #include #include #include #include "dataset_base/DatasetCreator.h" #include "dataset_util/DtdRegistry.h" using std::string; using std::ostream; using std::cerr; using std::endl; using std::auto_ptr; using dset::Url; using dset::Dataset; using dset::DatasetList; using dset::DatasetCreator; using dset::GenericDataset; using dset::SingleFileDataset; typedef SingleFileDataset::Name Name; typedef std::map CreatorMap; //********************************************************************** // Local definitions. //********************************************************************** namespace { // Register creator. int SingleFileDataset_xml_stat = GenericDataset:: register_promoter("SingleFileDataset", dset::promote); // Register ID. // Returns 0 for success. int regid(const char* name) { static int stat = 1; if ( stat != 1 ) return stat; stat = 2; for ( int i=100; i<1000; ++i ) { ContentId cid = ContentId::register_id(i, name); if ( cid.is_valid() ) { stat = 0; break; } } return stat; } // Force registration int CRSRTAT = regid("Url"); // Single-file creators. CreatorMap& sfcreators() { static CreatorMap cres; return cres; } // Single file creator. const Dataset* sfcreator(Url furl, Name clab, DatasetId parent) { SingleFileDataset* pdst = new SingleFileDataset(furl, clab); if ( parent.is_valid() ) { pdst->set_parent_id(parent); } pdst->lock(); return pdst; } // Register the single-file creator for this class. int SingleFileDataset_sfreg = SingleFileDataset::register_creator("SingleFileDataset", sfcreator); } // end unnamed namespace. //********************************************************************** // Static member functions. //********************************************************************** // Register a single-file dataset creator. int SingleFileDataset::register_creator(Name fulltype, Creator pfun) { sfcreators()[fulltype] = pfun; return 0; } //********************************************************************** // Create a dataset. const Dataset* SingleFileDataset::create(Name fulltype, Url furl, Name content, DatasetId parent) { string prefix = "SingleFileDataset::create: "; CreatorMap::const_iterator icre = sfcreators().find(fulltype); if ( icre == sfcreators().end() ) { cerr << prefix << "Unable to find creator for " << fulltype << endl; return 0; } SingleFileDataset::Creator pcre = icre->second; if ( pcre == 0 ) { cerr << prefix << "Null creator for " << fulltype << endl; return 0; } return pcre(furl, content, parent); } //********************************************************************** // Member functions. //********************************************************************** // Constructor from a single file. SingleFileDataset:: SingleFileDataset(Url furl, string clab) { assert( regid("Url") == 0 ); set_fulltype("SingleFileDataset"); set_id(); ContentIdList cids; ContentId cid("Url", furl.to_string()); cids.insert(cid); Content con("SingleFileDataset", clab, cids); set_content(con); Location loc; loc.files().push_back(furl); set_location(loc); set_evstate_none(); } //********************************************************************** // Constructor from generic dataset. SingleFileDataset::SingleFileDataset(const GenericDataset& dst) : GenericDataset(dst) { if ( fulltype() != "SingleFileDataset" ) set_error(11); } //********************************************************************** // Return the file. Url SingleFileDataset::file() const { if ( location().files().size() != 1 ) return Url(); return location().files().front(); } //**********************************************************************