#include <SignalDB.h>
Public Member Functions | |
| void | addFile (SignalFile *file) |
| void | addMetaData (MetaData *d) |
| void | addSignal (Signal *sig) |
| Signal * | at (int index) const |
| void | clear () |
| bool | contains (Signal *sig) const |
| int | count () const |
| bool | exists () const |
| SignalFilePool & | filePool () |
| AbstractSignalGroup * | findGroup (QString name) const |
| bool | isModified () |
| MasterSignalGroup * | masterGroup () const |
| MetaData * | metaData (int id) |
| const MetaData * | metaData (int id) const |
| QString | name () const |
| QDir | newFilePath () const |
| bool | open (QString fileName=QString::null) |
| void | removeFile (SignalFile *f) |
| void | removeMetaData (int id) |
| void | removeSignal (Signal *sig) |
| MetaData * | resolveMetaData (int index) |
| void | save () |
| void | saveAs (QString fileName=QString::null) |
| void | setName (const QString &n) |
| Signal * | signal (int id) const |
| SignalDB () | |
| void | signalDeleted (Signal *sig) |
| const SubSignalPool & | subPool () const |
| int | uniqueId (int requestedId) |
| int | version () const |
| virtual const QString & | xml_tagName () const |
| ~SignalDB () | |
Static Public Attributes | |
| static const QString | xmlSignalDBTag = "SignalDB" |
Protected Member Functions | |
| virtual XMLMember | xml_member (XML_MEMBER_ARGS) |
| void | xml_polish (XML_POLISH_ARGS) |
| virtual bool | xml_setProperty (XML_SETPROPERTY_ARGS) |
| virtual void | xml_writeChildren (XML_WRITECHILDREN_ARGS) const |
| virtual void | xml_writeProperties (XML_WRITEPROPERTIES_ARGS) const |
References GeopsyCore::AbstractSignalGroup::setComments(), GeopsyCore::AbstractSignalGroup::setModified(), GeopsyCore::AbstractSignalGroup::setName(), SIGNALDB_CURRENT_VERSION, QGpCoreTools::tr(), and TRACE.
Referenced by open().
: _files(this) { TRACE; _newId=0; _version=SIGNALDB_CURRENT_VERSION; _masterGroup=new MasterSignalGroup(this); _masterGroup->setName("/"); _masterGroup->setComments(tr("Root folder of all groups")); _masterGroup->setModified(false); _allSharedMetaData=0; }
References GeopsyCore::SubSignalPool::begin(), GeopsyCore::SubSignalPool::end(), and TRACE.
{
TRACE;
delete _masterGroup;
// Prepare all signals for delete
for(const_iterator it=begin(); it!=end(); ++it) {
(*it)->setDatabase(0); /* avoid removal from internal list upon deletion
(this will be done by SubSignalPool destructor).*/
}
ASSERT(!_allSharedMetaData);
}
| void GeopsyCore::SignalDB::addFile | ( | SignalFile * | file | ) |
References GeopsyCore::SignalFile::database(), and TRACE.
Referenced by GeopsyCore::SignalFile::SignalFile().
{
TRACE;
ASSERT(file->database()==this);
_files.append(file);
}
| void GeopsyCore::SignalDB::addMetaData | ( | MetaData * | d | ) | [inline] |
{_permanentSharedMetaData.add(d);}
| void GeopsyCore::SignalDB::addSignal | ( | Signal * | sig | ) |
This is the only one function to add new signals to database. It is automatically called by all constructors of Signal. Signal::id() is set uniquely here.
Reimplemented from GeopsyCore::SubSignalPool.
References GeopsyCore::Signal::database(), GeopsyCore::Signal::setId(), and TRACE.
Referenced by GeopsyCore::Signal::Signal().
{
TRACE;
ASSERT(sig->database()==this);
sig->setId(-1);
SubSignalPool::addSignal(sig);
}
| Signal* GeopsyCore::SignalDB::at | ( | int | index | ) | const [inline] |
Reimplemented from GeopsyCore::SubSignalPool.
References GeopsyCore::SubSignalPool::at().
{return SubSignalPool::at(index);}
| void GeopsyCore::SignalDB::clear | ( | ) |
| bool GeopsyCore::SignalDB::contains | ( | Signal * | sig | ) | const [inline] |
References contains().
{return SubSignalPool::contains(sig);}
| int GeopsyCore::SignalDB::count | ( | ) | const [inline] |
Reimplemented from GeopsyCore::SubSignalPool.
References GeopsyCore::SubSignalPool::count().
Referenced by open(), and GeopsyMainWindow::showDBStatus().
{return SubSignalPool::count();}
| bool GeopsyCore::SignalDB::exists | ( | ) | const [inline] |
Referenced by newFilePath(), save(), GeopsyCore::XMLSignal::xml_writeBinaryData(), and GeopsyCore::XMLSignal::xml_writeProperties().
{return !name().isEmpty();}
| SignalFilePool& GeopsyCore::SignalDB::filePool | ( | ) | [inline] |
Referenced by GeopsyGui::SubPoolWindow::addFile(), GeopsyCore::SubSignalPool::addFile(), GeopsyCore::Signal::compare(), GeopsyCore::GeopsyCoreEngine::file(), GeopsyGui::SignalFileItem::getSelection(), GeopsyCore::Signal::header(), GeopsyGui::SignalFileItem::index(), GeopsyCore::GeopsyCoreEngine::load(), GeopsyGui::CityLoader::on_loadBut_clicked(), GeopsyGui::SignalFileItem::rowCount(), GeopsyMainWindow::showDBStatus(), GeopsyCore::AllFilesGroup::subPool(), GeopsyCore::TemporaryFilesGroup::subPool(), and GeopsyCore::PermanentFilesGroup::subPool().
{return _files;}
| AbstractSignalGroup * GeopsyCore::SignalDB::findGroup | ( | QString | name | ) | const |
References GeopsyCore::AbstractSignalGroup::find(), and TRACE.
Referenced by loadSignals(), main(), and GeopsyCore::SignalProcess::subtractSignalsCore().
| bool GeopsyCore::SignalDB::isModified | ( | ) |
Return true if samples, header or groups are touched since last save or open Also return true if there are temporary files
References GeopsyCore::SignalFilePool::at(), GeopsyCore::SubSignalPool::begin(), GeopsyCore::SignalFilePool::count(), GeopsyCore::SubSignalPool::end(), GeopsyCore::SignalFile::format(), GeopsyCore::SignalFileFormat::id(), GeopsyCore::SubSignalPool::isHeaderModified(), GeopsyCore::AbstractSignalGroup::isModified(), GeopsyCore::SignalFileFormat::Temporary, and TRACE.
Referenced by GeopsyMainWindow::warnBeforeClear(), GeopsyCore::XMLSignal::xml_writeBinaryData(), and GeopsyCore::XMLSignal::xml_writeProperties().
{
TRACE;
//App::stream() << tr("Checking state of database:") << endl;
if(isHeaderModified()) return true;
//App::stream() << tr(" No header modified") << endl;
if(_masterGroup->isModified()) return true;
//App::stream() << tr(" No group modified") << endl;
// scan for temporary files
for(int i=0; i < _files.count(); ++i) {
SignalFile * fsig=_files.at(i);
if(fsig->format().id()==SignalFileFormat::Temporary) return true;
}
//App::stream() << tr(" No temporary files") << endl;
// scan for temporary signals
for(iterator it=begin(); it!=end(); ++it) {
if( !(*it)->file()) return true;
}
//App::stream() << tr(" No temporary signals") << endl;
return false;
}
| MasterSignalGroup* GeopsyCore::SignalDB::masterGroup | ( | ) | const [inline] |
Referenced by MonoStation::WinResults::categoriesToGroups(), GroupProperties::folder(), GeopsyGui::SignalGroupItem::index(), modeGroupList(), GroupView::select(), and GeopsyGui::SignalGroupItem::setDatabase().
{return _masterGroup;}
| MetaData* GeopsyCore::SignalDB::metaData | ( | int | id | ) | [inline] |
References GeopsyCore::MetaData::data().
{return _permanentSharedMetaData.data(id);}
| const MetaData* GeopsyCore::SignalDB::metaData | ( | int | id | ) | const [inline] |
References GeopsyCore::MetaData::data().
{return _permanentSharedMetaData.data(id);}
| QString GeopsyCore::SignalDB::name | ( | ) | const [inline] |
Reimplemented from GeopsyCore::SubSignalPool.
References GeopsyCore::SubSignalPool::name().
Referenced by newFilePath(), GeopsyMainWindow::showDBStatus(), and GeopsyCore::XMLSignal::xml_writeProperties().
{return SubSignalPool::name();}
| QDir GeopsyCore::SignalDB::newFilePath | ( | ) | const |
Returns the directory where to save new files generated by Geopsy (signals, results,...).
| bool GeopsyCore::SignalDB::open | ( | QString | fileName = QString::null | ) |
References GeopsyCore::SubSignalPool::_name, count(), QGpCoreTools::endl(), QGpCoreTools::XMLClass::ErrorEndTagNotFound, QGpCoreTools::XMLClass::ErrorNoDocType, QGpCoreTools::XMLClass::ErrorNoVersion, fileName, MSG_ID, QGpCoreTools::XMLClass::NoError, open(), SignalDB(), QGpCoreTools::tr(), TRACE, and QGpCoreTools::XMLHeader::xml_restoreFile().
Referenced by GeopsyCore::GeopsyCoreEngine::database(), loadSignals(), main(), modeGroupList(), open(), and GeopsyMainWindow::openDB().
{
TRACE;
if(fileName.isEmpty()) {
fileName=Message::getOpenFileName(tr("Open a database"), tr("Geopsy database (*.gpy *.sdb)"));
} else {
QFileInfo fi(fileName);
fileName=fi.absoluteFilePath();
}
if(fileName.isEmpty()) return false;
if(count()>0) {
if(Message::warning(MSG_ID, tr("Open database"),
tr("The current database already contains signals, Do you want to add signals from another database?"),
Message::yes(), Message::no())==Message::Answer1) {
return false;
}
SignalDB * newDB=new SignalDB;
if(!newDB->open(fileName)) {
delete newDB;
return false;
} else { // New database opened successfully, merge it with current one
add(newDB);
delete newDB;
// Set name as empty to force saveAs()
_name=QString::null;
return true;
}
} else {
_name=fileName;
}
MessageContext mc;
XMLHeader hdr(this);
createAllSharedMetaData();
XMLClass::Error err=hdr.xml_restoreFile(fileName, this);
releaseAllSharedMetaData();
bool ret;
switch (err) {
case ErrorNoDocType:
case ErrorNoVersion:
case ErrorEndTagNotFound: // Apparently not an XML file, hence try old formats
App::stream() << tr("Trying with an old geopsy database format...") << endl;
ret=openDBFileV12(fileName);
openGroupsV12(); // in any case, try to open groups
break;
default:
ret=(err==NoError);
break;
}
if(!ret) {
Message::warning(MSG_ID, tr( "Opening Database ..." ),
tr( "Errors occured while opening database, for more details read log." ),
Message::ok());
// Set name as empty to force saveAs()
_name=QString::null;
}
return ret;
}
| void GeopsyCore::SignalDB::removeFile | ( | SignalFile * | f | ) |
Removes file f from database and delete its signals.
References GeopsyCore::SubSignalPool::addFile(), GeopsyCore::SubSignalPool::begin(), GeopsyCore::SubSignalPool::end(), GeopsyCore::SignalFile::removeFile(), GeopsyCore::AbstractSignalGroup::removeSignal(), and TRACE.
Referenced by GeopsyGui::SignalFileItem::remove(), and Process::run().
{
TRACE;
SubSignalPool subpool;
subpool.addFile(f);
for(SubSignalPool::iterator it=subpool.begin(); it!=subpool.end(); ++it) {
Signal * sig=*it;
remove(sig);
_masterGroup->removeSignal(sig);
}
f->removeFile();
_files.remove(f);
}
| void GeopsyCore::SignalDB::removeMetaData | ( | int | id | ) | [inline] |
{_permanentSharedMetaData.remove(id);}
| void GeopsyCore::SignalDB::removeSignal | ( | Signal * | sig | ) | [inline] |
Removes one signal from database and delete it through reference mechanism.
References GeopsyCore::SubSignalPool::remove().
Referenced by Process::run().
{SubSignalPool::remove(sig);}
| MetaData * GeopsyCore::SignalDB::resolveMetaData | ( | int | index | ) |
References QGpCoreTools::endl(), QGpCoreTools::tr(), and TRACE.
Referenced by xml_member(), and GeopsyCore::Signal::xml_member().
| void GeopsyCore::SignalDB::save | ( | ) |
References GeopsyCore::SubSignalPool::_name, exists(), MSG_ID, saveAs(), GeopsyCore::SubSignalPool::setHeaderModified(), GeopsyCore::AbstractSignalGroup::setModified(), SIGNALDB_CURRENT_VERSION, QGpCoreTools::tr(), TRACE, and QGpCoreTools::XMLHeader::xml_saveFile().
Referenced by saveAs(), and GeopsyMainWindow::saveDB().
{
TRACE;
if(!exists()) {
saveAs ();
return ;
}
MessageContext mc;
if(_version<SIGNALDB_CURRENT_VERSION) {
if(_version<3) {
Message::information(MSG_ID, tr("Converting an old Geopsy or Sardine database"),
tr("Groups are no longer saved in separate files, after conversion, you can "
"safely remove all files .group, .grouplist and .sdb. The new database is saved "
"in a .gpy file which include all signal and group information. This is in fact a "
" .tar.gz that you can unpack to access its XML contents."));
saveAs();
return;
} else {
Message::information(MSG_ID, tr("Converting an old Geopsy database"),
tr("Signal database internal format has changed and the saved file will "
"not be readable with old Geopsy releases."));
saveAs();
return;
}
}
// Here, database may not yet exist on the disk but exist() returns always true.
// Saving temporary files and signals and modified samples
if(!saveTemporaryFiles()) return;
if(!saveTemporarySignals()) return;
// Saving database file
XMLHeader hdr(this);
collectAllSharedMetaData();
XMLClass::Error err=hdr.xml_saveFile(_name);
releaseAllSharedMetaData();
if(err!=XMLClass::NoError) return;
setHeaderModified(false);
_masterGroup->setModified(false);
}
| void GeopsyCore::SignalDB::saveAs | ( | QString | fileName = QString::null | ) |
References GeopsyCore::SubSignalPool::_name, fileName, save(), SIGNALDB_CURRENT_VERSION, QGpCoreTools::tr(), and TRACE.
Referenced by save(), and GeopsyMainWindow::saveDBAs().
| void GeopsyCore::SignalDB::setName | ( | const QString & | n | ) | [inline] |
Reimplemented from GeopsyCore::SubSignalPool.
References GeopsyCore::SubSignalPool::setName().
Referenced by clear(), and GeopsyCore::AbstractSignalGroup::xml_member().
{SubSignalPool::setName(n);}
| Signal * GeopsyCore::SignalDB::signal | ( | int | id | ) | const |
Returns pointer to signal with id or 0 if no signal has id.
References GeopsyCore::SubSignalPool::begin(), GeopsyCore::SubSignalPool::end(), GeopsyCore::Signal::id(), and TRACE.
Referenced by GeopsyCore::SubSignalPool::addSignal(), and GeopsyCore::XMLSignal::signal().
{
TRACE;
for(SubSignalPool::const_iterator it=begin(); it!=end(); ++it) {
Signal * sig=*it;
if(sig->id()==id) {
return sig;
}
}
return 0;
}
| void GeopsyCore::SignalDB::signalDeleted | ( | Signal * | sig | ) |
Removes sig from database. Do not call directly this function, it is automatically called from Signal::~Signal().
References GeopsyCore::SubSignalPool::indexOf(), GeopsyCore::SubSignalPool::removeAt(), and TRACE.
Referenced by GeopsyCore::Signal::~Signal().
{
TRACE;
int i=QList<Signal *>::indexOf(sig);
QList<Signal *>::removeAt(i);
}
| const SubSignalPool& GeopsyCore::SignalDB::subPool | ( | ) | const [inline] |
Referenced by GeopsyCore::SubSignalPool::addAll(), GeopsyCore::SubSignalPool::addFile(), GeopsyCore::AllSignalsGroup::subPool(), and GeopsyCore::TemporarySignalsGroup::subPool().
{return *this;}
| int GeopsyCore::SignalDB::uniqueId | ( | int | resquestedId | ) |
Returns a unique ID number for signal. This function is called automatically every time the ID of a signal is modified.
References QGpCoreTools::endl(), QGpCoreTools::tr(), and TRACE.
Referenced by GeopsyCore::Signal::setId().
{
TRACE;
if(resquestedId==-1)
return ++_newId;
else {
/* In Signal::setId() the _id is set to -1, hence even if resquestedId is the same as the current
id of the signal, countId() will return 0 if no other signal have the same id. */
if(countId(resquestedId)>0) {
_newId++;
App::stream() << Message::severityString(Message::Warning)
<< tr(" signal ID %1 changed to %2" ).arg(resquestedId).arg(_newId) << endl;
return _newId;
} else {
if(resquestedId>_newId) {
_newId=resquestedId;
}
return resquestedId;
}
}
}
| int GeopsyCore::SignalDB::version | ( | ) | const [inline] |
Referenced by GeopsyCore::Signal::read(), and GeopsyCore::AbstractSignalGroup::xml_polishChild().
{return _version;}
| XMLMember GeopsyCore::SignalDB::xml_member | ( | XML_MEMBER_ARGS | ) | [protected, virtual] |
Re-implement this function to offer XML restore (children and properties) support to your class.
From tag and map (with contains the attibute value) return a unique identifier under the format of a XMLMember. XMLMember is initialized with 3 types of contructors:
Map of attributes can be inspected in this way (can be achived also in xml_setProperty()):
static const QString tmp("childrenName"); XMLRestoreAttributeIterator it=map.find(tmp); if(it!=map.end()) { // found attribute "childrenName" }
If the map of attributes is not used:
Q_UNUSED(attributes);
if(tag=="x1") return XMLMember(0);
else if(tag=="y1") return XMLMember(1);
else if(tag=="x2") return XMLMember(2);
else if(tag=="y2") return XMLMember(3);
else return XMLMember(XMLMember::Unknown);
Arithmetic operations + and - apply to XMLMember to avoid confusion of property id numbers between inherited objects. Offset 3 corresponds to the number of properties defined in this object.
if(tag=="anInteger") return XMLMember(0); else if(tag=="aString") return XMLMember(1); else if(tag=="aDouble") return XMLMember(2); return AbstractLine::xml_member(tag, attributes, context)+3;
For the arguments of this function use Macro XML_MEMBER_ARGS.
Reimplemented from QGpCoreTools::XMLClass.
References GeopsyCore::MetaDataMap::add(), QGpCoreTools::endl(), resolveMetaData(), QGpCoreTools::tr(), and QGpCoreTools::XMLClass::xml_tagName().
{
Q_UNUSED(attributes);
Q_UNUSED(context);
switch (tag[0].unicode()) {
case 'F':
if(tag=="File") {
SignalFile * f=new SignalFile(this);
return XMLMember(f);
}
break;
case 'M':
if(tag=="MasterGroup") {
return XMLMember(_masterGroup);
}
break;
case 'G':
if(tag=="Group") { // Kept for compatibility
return XMLMember(_masterGroup);
}
break;
case 'S':
if(tag=="SharedMetaData") {
ASSERT(_allSharedMetaData);
return XMLMember(_allSharedMetaData);
}
break;
case 'v':
if(tag=="version") {
return XMLMember(0);
}
break;
default: {
// Probably a link to permanent shared meta data
static QString indexAtt="index";
XMLRestoreAttributeIterator it=attributes.find(indexAtt);
if(it!=attributes.end()) { // It is a link to shared data
MetaData * d=resolveMetaData(it.value().toInt());
if(d) {
if(tag==d->xml_tagName()) {
_permanentSharedMetaData.add(d);
return XMLMember(101);
} else {
App::stream() << tr("Mismatch resolving shared meta data index %1: expecting type %2, found %3.")
.arg(it.value().toInt()).arg(tag.toString()).arg(d->xml_tagName()) << endl;
}
}
}
}
break;
}
return XMLMember(XMLMember::Unknown);
}
| void GeopsyCore::SignalDB::xml_polish | ( | XML_POLISH_ARGS | ) | [protected, virtual] |
Reimplemented from QGpCoreTools::XMLClass.
References GeopsyCore::SubSignalPool::begin(), GeopsyCore::AbstractSignalGroup::convertIds(), GeopsyCore::SubSignalPool::end(), GeopsyCore::Signal::id(), GeopsyCore::AbstractSignalGroup::setModified(), and TRACE.
{
TRACE;
Q_UNUSED(context);
// Groups refers to signal through IDs. Before starting anything
// We must convert those IDs into real pointers.
QHash<int, Signal *> lookup;
for(SubSignalPool::const_iterator it=begin(); it!=end(); ++it) {
Signal * sig=*it;
lookup.insert(sig->id(), sig);
}
_masterGroup->convertIds(lookup);
_masterGroup->setModified(false);
}
| bool GeopsyCore::SignalDB::xml_setProperty | ( | XML_SETPROPERTY_ARGS | ) | [protected, virtual] |
Re-implement this function to offer XML restore properties support to your class.
From memberID set the corresponding property with value content. The map of attributes is given as a supplementary information (not useful in all cases).
For a general case:
Q_UNUSED(attributes); double val=content.toDouble(); switch (memberID) { case 0: _x1=val; return true; case 1: _y1=val; return true; case 2: _x2=val; return true; case 3: _y2=val; return true; default: return false; }
For classes inheriting other classes (see also xml_member())
switch (memberID) { case 0: _anInteger=content.toString(); return true; case 1: _aString=content.toInt(); return true; case 2: _aDouble=content.toDouble(); return true; default: return AbstractLine::xml_setProperty(memberID-3, map, content);
For the arguments of this function use Macro XML_SETPROPERTY_ARGS.
Reimplemented from QGpCoreTools::XMLClass.
References QGpCoreTools::endl(), SIGNALDB_CURRENT_VERSION, and QGpCoreTools::tr().
{
Q_UNUSED(tag);
Q_UNUSED(attributes);
Q_UNUSED(context);
switch (memberID) {
case 0:
_version=content.toInt();
if(_version>SIGNALDB_CURRENT_VERSION) {
App::stream() << tr("Database saved with a more recent release, upgrade yours.") << endl;
return false;
}
return true;
default:
return false;
}
}
| virtual const QString& GeopsyCore::SignalDB::xml_tagName | ( | ) | const [inline, virtual] |
Implements QGpCoreTools::XMLClass.
{return xmlSignalDBTag;}
| void GeopsyCore::SignalDB::xml_writeChildren | ( | XML_WRITECHILDREN_ARGS | ) | const [protected, virtual] |
Reimplemented from QGpCoreTools::XMLClass.
References GeopsyCore::SignalFilePool::begin(), GeopsyCore::SignalFilePool::end(), GeopsyCore::AbstractSignalGroup::setModified(), TRACE, and QGpCoreTools::XMLClass::xml_save().
{
TRACE;
// Save all shared meta data
ASSERT(_allSharedMetaData);
_allSharedMetaData->xml_save(s, context);
// Save files and signals
for(QList<SignalFile *>::const_iterator it=_files.begin(); it!=_files.end(); ++it) {
(*it)->xml_save(s, context);
}
// Save user groups
_masterGroup->xml_save(s, context);
_masterGroup->setModified(false);
}
| void GeopsyCore::SignalDB::xml_writeProperties | ( | XML_WRITEPROPERTIES_ARGS | ) | const [protected, virtual] |
Reimplemented from QGpCoreTools::XMLClass.
References QGpCoreTools::SortedVector< Key, T >::at(), GeopsyCore::MetaDataMap::count(), GeopsyCore::MetaData::isStored(), GeopsyCore::MetaDataMap::vector(), QGpCoreTools::XMLClass::writeProperty(), and GeopsyCore::MetaData::xml_writeLink().
{
Q_UNUSED(context);
writeProperty(s, "version", _version);
// Save links for permanent meta data
ASSERT(_allSharedMetaData);
int n=_permanentSharedMetaData.count();
const SortedVector<int, MetaData>& v=_permanentSharedMetaData.vector();
for(int i=0; i<n; i++) {
const MetaData * d=v.at(i);
if(d->isStored()) {
d->xml_writeLink(s);
}
}
}
const QString GeopsyCore::SignalDB::xmlSignalDBTag = "SignalDB" [static] |