summaryrefslogtreecommitdiffstats
path: root/tdecore/tdesycocafactory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdecore/tdesycocafactory.cpp')
-rw-r--r--tdecore/tdesycocafactory.cpp202
1 files changed, 202 insertions, 0 deletions
diff --git a/tdecore/tdesycocafactory.cpp b/tdecore/tdesycocafactory.cpp
new file mode 100644
index 000000000..d7d350ddf
--- /dev/null
+++ b/tdecore/tdesycocafactory.cpp
@@ -0,0 +1,202 @@
+/* This file is part of the KDE libraries
+ * Copyright (C) 1999 David Faure <faure@kde.org>
+ *
+ * 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 "tdesycoca.h"
+#include "tdesycocatype.h"
+#include "tdesycocafactory.h"
+#include "tdesycocaentry.h"
+#include "tdesycocadict.h"
+#include <tqstringlist.h>
+#include <tqdict.h>
+#include <kdebug.h>
+
+template class TQDict<KSycocaEntry>;
+template class TQDict<KSharedPtr<KSycocaEntry> >;
+
+KSycocaFactory::KSycocaFactory(KSycocaFactoryId factory_id)
+ : m_resourceList(0), m_entryDict(0), m_sycocaDict(0)
+{
+ if (!KSycoca::self()->isBuilding()) // read-only database ?
+ {
+ m_str = KSycoca::self()->findFactory( factory_id );
+ // can't call factoryId() here since the constructor can't call inherited methods
+ if (m_str) // Can be 0 in case of errors
+ {
+ // Read position of index tables....
+ TQ_INT32 i;
+ (*m_str) >> i;
+ m_sycocaDictOffset = i;
+ (*m_str) >> i;
+ m_beginEntryOffset = i;
+ (*m_str) >> i;
+ m_endEntryOffset = i;
+
+ int saveOffset = m_str->device()->at();
+ // Init index tables
+ m_sycocaDict = new KSycocaDict(m_str, m_sycocaDictOffset);
+ saveOffset = m_str->device()->at(saveOffset);
+ }
+ }
+ else
+ {
+ // Build new database!
+ m_str = 0;
+ m_resourceList = 0;
+ m_entryDict = new KSycocaEntryDict(977);
+ m_entryDict->setAutoDelete(true);
+ m_sycocaDict = new KSycocaDict();
+ m_beginEntryOffset = 0;
+ m_endEntryOffset = 0;
+
+ // m_resourceList will be filled in by inherited constructors
+ }
+ KSycoca::self()->addFactory(this);
+}
+
+KSycocaFactory::~KSycocaFactory()
+{
+ delete m_entryDict;
+ delete m_sycocaDict;
+}
+
+void
+KSycocaFactory::saveHeader(TQDataStream &str)
+{
+ // Write header
+ str.device()->at(mOffset);
+ str << (TQ_INT32) m_sycocaDictOffset;
+ str << (TQ_INT32) m_beginEntryOffset;
+ str << (TQ_INT32) m_endEntryOffset;
+}
+
+void
+KSycocaFactory::save(TQDataStream &str)
+{
+ if (!m_entryDict) return; // Error! Function should only be called when
+ // building database
+ if (!m_sycocaDict) return; // Error!
+
+ mOffset = str.device()->at(); // store position in member variable
+ m_sycocaDictOffset = 0;
+
+ // Write header (pass #1)
+ saveHeader(str);
+
+ m_beginEntryOffset = str.device()->at();
+
+ // Write all entries.
+ int entryCount = 0;
+ for(TQDictIterator<KSycocaEntry::Ptr> it ( *m_entryDict );
+ it.current();
+ ++it)
+ {
+ KSycocaEntry *entry = (*it.current());
+ entry->save(str);
+ entryCount++;
+ }
+
+ m_endEntryOffset = str.device()->at();
+
+ // Write indices...
+ // Linear index
+ str << (TQ_INT32) entryCount;
+ for(TQDictIterator<KSycocaEntry::Ptr> it ( *m_entryDict );
+ it.current();
+ ++it)
+ {
+ KSycocaEntry *entry = (*it.current());
+ str << (TQ_INT32) entry->offset();
+ }
+
+ // Dictionary index
+ m_sycocaDictOffset = str.device()->at();
+ m_sycocaDict->save(str);
+
+ int endOfFactoryData = str.device()->at();
+
+ // Update header (pass #2)
+ saveHeader(str);
+
+ // Seek to end.
+ str.device()->at(endOfFactoryData);
+}
+
+void
+KSycocaFactory::addEntry(KSycocaEntry *newEntry, const char *)
+{
+ if (!m_entryDict) return; // Error! Function should only be called when
+ // building database
+
+ if (!m_sycocaDict) return; // Error!
+
+ TQString name = newEntry->name();
+ m_entryDict->insert( name, new KSycocaEntry::Ptr(newEntry) );
+ m_sycocaDict->add( name, newEntry );
+}
+
+void
+KSycocaFactory::removeEntry(KSycocaEntry *newEntry)
+{
+ if (!m_entryDict) return; // Error! Function should only be called when
+ // building database
+
+ if (!m_sycocaDict) return; // Error!
+
+ TQString name = newEntry->name();
+ m_entryDict->remove( name );
+ m_sycocaDict->remove( name );
+}
+
+KSycocaEntry::List KSycocaFactory::allEntries()
+{
+ KSycocaEntry::List list;
+ if (!m_str) return list;
+
+ // Assume we're NOT building a database
+
+ m_str->device()->at(m_endEntryOffset);
+ TQ_INT32 entryCount;
+ (*m_str) >> entryCount;
+
+ if (entryCount > 8192)
+ {
+ KSycoca::flagError();
+ return list;
+ }
+
+ TQ_INT32 *offsetList = new TQ_INT32[entryCount];
+ for(int i = 0; i < entryCount; i++)
+ {
+ (*m_str) >> offsetList[i];
+ }
+
+ for(int i = 0; i < entryCount; i++)
+ {
+ KSycocaEntry *newEntry = createEntry(offsetList[i]);
+ if (newEntry)
+ {
+ list.append( KSycocaEntry::Ptr( newEntry ) );
+ }
+ }
+ delete [] offsetList;
+ return list;
+}
+
+void KSycocaFactory::virtual_hook( int /*id*/, void* /*data*/)
+{ /*BASE::virtual_hook( id, data );*/ }
+