kmdriverdb.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kmdriverdb.h"
00021 #include "kmdbentry.h"
00022 #include "kmdbcreator.h"
00023 #include "kmmanager.h"
00024 #include "kmfactory.h"
00025 #include <kdebug.h>
00026
00027 #include <qfile.h>
00028 #include <qtextstream.h>
00029 #include <qfileinfo.h>
00030 #include <kstandarddirs.h>
00031 #include <kapplication.h>
00032 #include <kmessagebox.h>
00033
00034 KMDriverDB* KMDriverDB::m_self = 0;
00035
00036 KMDriverDB* KMDriverDB::self()
00037 {
00038 if (!m_self)
00039 {
00040 m_self = new KMDriverDB();
00041 Q_CHECK_PTR(m_self);
00042 }
00043 return m_self;
00044 }
00045
00046 KMDriverDB::KMDriverDB(QObject *parent, const char *name)
00047 : QObject(parent,name)
00048 {
00049 m_creator = new KMDBCreator(this,"db-creator");
00050 connect(m_creator,SIGNAL(dbCreated()),SLOT(slotDbCreated()));
00051
00052 m_entries.setAutoDelete(true);
00053 m_pnpentries.setAutoDelete(true);
00054 }
00055
00056 KMDriverDB::~KMDriverDB()
00057 {
00058 }
00059
00060 QString KMDriverDB::dbFile()
00061 {
00062
00063 QString filename = locateLocal("data",QString::fromLatin1("kdeprint/printerdb_%1.txt").arg(KMFactory::self()->printSystem()));
00064 return filename;
00065 }
00066
00067 void KMDriverDB::init(QWidget *parent)
00068 {
00069 QFileInfo dbfi(dbFile());
00070 QString dirname = KMFactory::self()->manager()->driverDirectory();
00071 QStringList dbDirs = QStringList::split(':', dirname, false);
00072 bool createflag(false);
00073
00074 for (QStringList::ConstIterator it=dbDirs.begin(); it!=dbDirs.end() && !createflag; ++it)
00075 if (!(*it).startsWith("module:") && !m_creator->checkDriverDB(*it, dbfi.lastModified()))
00076 createflag = true;
00077
00078 if (createflag)
00079 {
00080
00081 if (!m_creator->createDriverDB(dirname,dbfi.absFilePath(),parent))
00082 KMessageBox::error(parent, KMFactory::self()->manager()->errorMsg().prepend("<qt>").append("</qt>"));
00083 }
00084 else if (m_entries.count() == 0)
00085 {
00086
00087
00088 slotDbCreated();
00089 }
00090 else
00091
00092 emit dbLoaded(false);
00093 }
00094
00095 void KMDriverDB::slotDbCreated()
00096 {
00097
00098 if (m_creator->status())
00099 {
00100
00101 loadDbFile();
00102 emit dbLoaded(true);
00103 }
00104 else
00105
00106 emit error(KMManager::self()->errorMsg());
00107
00108
00109 }
00110
00111 KMDBEntryList* KMDriverDB::findEntry(const QString& manu, const QString& model)
00112 {
00113 QDict<KMDBEntryList> *models = m_entries.find(manu);
00114 if (models)
00115 return models->find(model);
00116 return 0;
00117 }
00118
00119 KMDBEntryList* KMDriverDB::findPnpEntry(const QString& manu, const QString& model)
00120 {
00121 QDict<KMDBEntryList> *models = m_pnpentries.find(manu);
00122 if (models)
00123 return models->find(model);
00124 return 0;
00125 }
00126
00127 QDict<KMDBEntryList>* KMDriverDB::findModels(const QString& manu)
00128 {
00129 return m_entries.find(manu);
00130 }
00131
00132 void KMDriverDB::insertEntry(KMDBEntry *entry)
00133 {
00134
00135 if (!entry->validate())
00136 {
00137 kdDebug() << "Incorrect entry, skipping...(" << entry->file << ")" << endl;
00138 delete entry;
00139 return;
00140 }
00141
00142
00143 QDict<KMDBEntryList> *models = m_entries.find(entry->manufacturer);
00144 if (!models)
00145 {
00146 models = new QDict<KMDBEntryList>(17,false);
00147 models->setAutoDelete(true);
00148 m_entries.insert(entry->manufacturer,models);
00149 }
00150 KMDBEntryList *list = models->find(entry->model);
00151 if (!list)
00152 {
00153 list = new KMDBEntryList;
00154 list->setAutoDelete(true);
00155 models->insert(entry->model,list);
00156 }
00157 list->append(entry);
00158
00159 if (!entry->pnpmanufacturer.isEmpty() && !entry->pnpmodel.isEmpty())
00160 {
00161
00162 models = m_pnpentries.find(entry->manufacturer);
00163 if (!models)
00164 {
00165 models = new QDict<KMDBEntryList>(17,false);
00166 models->setAutoDelete(true);
00167 m_pnpentries.insert(entry->manufacturer,models);
00168 }
00169 list = models->find(entry->model);
00170 if (!list)
00171 {
00172 list = new KMDBEntryList;
00173 list->setAutoDelete(true);
00174 models->insert(entry->model,list);
00175 }
00176 list->append(entry);
00177 }
00178
00179
00180 kapp->processEvents();
00181 }
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193 void KMDriverDB::loadDbFile()
00194 {
00195
00196 m_entries.clear();
00197 m_pnpentries.clear();
00198
00199 QFile f(dbFile());
00200 if (f.exists() && f.open(IO_ReadOnly))
00201 {
00202 QTextStream t(&f);
00203 QString line;
00204 QStringList words;
00205 KMDBEntry *entry(0);
00206
00207 while (!t.eof())
00208 {
00209 line = t.readLine().stripWhiteSpace();
00210 if (line.isEmpty())
00211 continue;
00212 int p = line.find('=');
00213 if (p == -1)
00214 continue;
00215 words.clear();
00216 words << line.left(p) << line.mid(p+1);
00217 if (words[0] == "FILE")
00218 {
00219 if (entry) insertEntry(entry);
00220 entry = new KMDBEntry;
00221 entry->file = words[1];
00222 }
00223 else if (words[0] == "MANUFACTURER" && entry)
00224 entry->manufacturer = words[1].upper();
00225 else if (words[0] == "MODEL" && entry)
00226 entry->model = words[1];
00227 else if (words[0] == "MODELNAME" && entry)
00228 entry->modelname = words[1];
00229 else if (words[0] == "PNPMANUFACTURER" && entry)
00230 entry->pnpmanufacturer = words[1].upper();
00231 else if (words[0] == "PNPMODEL" && entry)
00232 entry->pnpmodel = words[1];
00233 else if (words[0] == "DESCRIPTION" && entry)
00234 entry->description = words[1];
00235 else if (words[0] == "RECOMMANDED" && entry && words[1].lower() == "yes")
00236 entry->recommended = true;
00237 else if (words[0] == "DRIVERCOMMENT" && entry)
00238 entry->drivercomment = ("<qt>"+words[1].replace("<", "<").replace(">", ">")+"</qt>");
00239 }
00240 if (entry)
00241 insertEntry(entry);
00242 }
00243 }
00244 #include "kmdriverdb.moc"
|