summaryrefslogtreecommitdiffstats
path: root/kdeprint/management/kmdriverdb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kdeprint/management/kmdriverdb.cpp')
-rw-r--r--kdeprint/management/kmdriverdb.cpp244
1 files changed, 244 insertions, 0 deletions
diff --git a/kdeprint/management/kmdriverdb.cpp b/kdeprint/management/kmdriverdb.cpp
new file mode 100644
index 000000000..d75588d0d
--- /dev/null
+++ b/kdeprint/management/kmdriverdb.cpp
@@ -0,0 +1,244 @@
+/*
+ * This file is part of the KDE libraries
+ * Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+#include "kmdriverdb.h"
+#include "kmdbentry.h"
+#include "kmdbcreator.h"
+#include "kmmanager.h"
+#include "kmfactory.h"
+#include <kdebug.h>
+
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qfileinfo.h>
+#include <kstandarddirs.h>
+#include <kapplication.h>
+#include <kmessagebox.h>
+
+KMDriverDB* KMDriverDB::m_self = 0;
+
+KMDriverDB* KMDriverDB::self()
+{
+ if (!m_self)
+ {
+ m_self = new KMDriverDB();
+ Q_CHECK_PTR(m_self);
+ }
+ return m_self;
+}
+
+KMDriverDB::KMDriverDB(QObject *parent, const char *name)
+: QObject(parent,name)
+{
+ m_creator = new KMDBCreator(this,"db-creator");
+ connect(m_creator,SIGNAL(dbCreated()),SLOT(slotDbCreated()));
+
+ m_entries.setAutoDelete(true);
+ m_pnpentries.setAutoDelete(true);
+}
+
+KMDriverDB::~KMDriverDB()
+{
+}
+
+QString KMDriverDB::dbFile()
+{
+ // this calls insure missing directories creation
+ QString filename = locateLocal("data",QString::fromLatin1("kdeprint/printerdb_%1.txt").arg(KMFactory::self()->printSystem()));
+ return filename;
+}
+
+void KMDriverDB::init(QWidget *parent)
+{
+ QFileInfo dbfi(dbFile());
+ QString dirname = KMFactory::self()->manager()->driverDirectory();
+ QStringList dbDirs = QStringList::split(':', dirname, false);
+ bool createflag(false);
+
+ for (QStringList::ConstIterator it=dbDirs.begin(); it!=dbDirs.end() && !createflag; ++it)
+ if (!(*it).startsWith("module:") && !m_creator->checkDriverDB(*it, dbfi.lastModified()))
+ createflag = true;
+
+ if (createflag)
+ {
+ // starts DB creation and wait for creator signal
+ if (!m_creator->createDriverDB(dirname,dbfi.absFilePath(),parent))
+ KMessageBox::error(parent, KMFactory::self()->manager()->errorMsg().prepend("<qt>").append("</qt>"));
+ }
+ else if (m_entries.count() == 0)
+ {
+ // call directly the slot as the DB won't be re-created
+ // this will (re)load the driver DB
+ slotDbCreated();
+ }
+ else
+ // no need to refresh, and already loaded, just emit signal
+ emit dbLoaded(false);
+}
+
+void KMDriverDB::slotDbCreated()
+{
+ // DB should be created, check creator status
+ if (m_creator->status())
+ {
+ // OK, load DB and emit signal
+ loadDbFile();
+ emit dbLoaded(true);
+ }
+ else
+ // error while creating DB, notify the DB widget
+ emit error(KMManager::self()->errorMsg());
+ // be sure to emit this signal to notify the DB widget
+ //emit dbLoaded(true);
+}
+
+KMDBEntryList* KMDriverDB::findEntry(const QString& manu, const QString& model)
+{
+ QDict<KMDBEntryList> *models = m_entries.find(manu);
+ if (models)
+ return models->find(model);
+ return 0;
+}
+
+KMDBEntryList* KMDriverDB::findPnpEntry(const QString& manu, const QString& model)
+{
+ QDict<KMDBEntryList> *models = m_pnpentries.find(manu);
+ if (models)
+ return models->find(model);
+ return 0;
+}
+
+QDict<KMDBEntryList>* KMDriverDB::findModels(const QString& manu)
+{
+ return m_entries.find(manu);
+}
+
+void KMDriverDB::insertEntry(KMDBEntry *entry)
+{
+ // first check entry
+ if (!entry->validate())
+ {
+ kdDebug() << "Incorrect entry, skipping...(" << entry->file << ")" << endl;
+ delete entry;
+ return;
+ }
+
+ // insert it in normal entries
+ QDict<KMDBEntryList> *models = m_entries.find(entry->manufacturer);
+ if (!models)
+ {
+ models = new QDict<KMDBEntryList>(17,false);
+ models->setAutoDelete(true);
+ m_entries.insert(entry->manufacturer,models);
+ }
+ KMDBEntryList *list = models->find(entry->model);
+ if (!list)
+ {
+ list = new KMDBEntryList;
+ list->setAutoDelete(true);
+ models->insert(entry->model,list);
+ }
+ list->append(entry);
+
+ if (!entry->pnpmanufacturer.isEmpty() && !entry->pnpmodel.isEmpty())
+ {
+ // insert it in PNP entries
+ models = m_pnpentries.find(entry->manufacturer);
+ if (!models)
+ {
+ models = new QDict<KMDBEntryList>(17,false);
+ models->setAutoDelete(true);
+ m_pnpentries.insert(entry->manufacturer,models);
+ }
+ list = models->find(entry->model);
+ if (!list)
+ {
+ list = new KMDBEntryList;
+ list->setAutoDelete(true);
+ models->insert(entry->model,list);
+ }
+ list->append(entry);
+ }
+
+ // don't block GUI
+ kapp->processEvents();
+}
+
+/*
+ Driver DB file format:
+ FILE=<path>
+ MANUFACTURER=<string>
+ MODEL=<string>
+ PNPMANUFACTURER=<string>
+ PNPMODEL=<string>
+ DESCRIPTION=<string>
+*/
+
+void KMDriverDB::loadDbFile()
+{
+ // first clear everything
+ m_entries.clear();
+ m_pnpentries.clear();
+
+ QFile f(dbFile());
+ if (f.exists() && f.open(IO_ReadOnly))
+ {
+ QTextStream t(&f);
+ QString line;
+ QStringList words;
+ KMDBEntry *entry(0);
+
+ while (!t.eof())
+ {
+ line = t.readLine().stripWhiteSpace();
+ if (line.isEmpty())
+ continue;
+ int p = line.find('=');
+ if (p == -1)
+ continue;
+ words.clear();
+ words << line.left(p) << line.mid(p+1);
+ if (words[0] == "FILE")
+ {
+ if (entry) insertEntry(entry);
+ entry = new KMDBEntry;
+ entry->file = words[1];
+ }
+ else if (words[0] == "MANUFACTURER" && entry)
+ entry->manufacturer = words[1].upper();
+ else if (words[0] == "MODEL" && entry)
+ entry->model = words[1];
+ else if (words[0] == "MODELNAME" && entry)
+ entry->modelname = words[1];
+ else if (words[0] == "PNPMANUFACTURER" && entry)
+ entry->pnpmanufacturer = words[1].upper();
+ else if (words[0] == "PNPMODEL" && entry)
+ entry->pnpmodel = words[1];
+ else if (words[0] == "DESCRIPTION" && entry)
+ entry->description = words[1];
+ else if (words[0] == "RECOMMANDED" && entry && words[1].lower() == "yes")
+ entry->recommended = true;
+ else if (words[0] == "DRIVERCOMMENT" && entry)
+ entry->drivercomment = ("<qt>"+words[1].replace("&lt;", "<").replace("&gt;", ">")+"</qt>");
+ }
+ if (entry)
+ insertEntry(entry);
+ }
+}
+#include "kmdriverdb.moc"