OSDN Git Service

Add BoardDatabase class
[kita/kita.git] / kita / src / libkita / favoritethreads.cpp
1 /***************************************************************************
2 *   Copyright (C) 2004 by Kita Developers                                 *
3 *   ikemo@users.sourceforge.jp                                            *
4 *                                                                         *
5 *   This program is free software; you can redistribute it and/or modify  *
6 *   it under the terms of the GNU General Public License as published by  *
7 *   the Free Software Foundation; either version 2 of the License, or     *
8 *   (at your option) any later version.                                   *
9 ***************************************************************************/
10
11 #include "favoritethreads.h"
12
13 #include <QtCore/QList>
14 #include <QtXml/QDomDocument>
15
16 #include "boarddatabase.h"
17 #include "datmanager.h"
18 #include "kita_misc.h"
19 #include "thread.h"
20 #include "threadindex.h"
21
22 using namespace Kita;
23
24 // FavoriteThreadItem
25 FavoriteThreadItem::FavoriteThreadItem()
26 {}
27
28 FavoriteThreadItem::~ FavoriteThreadItem()
29 {}
30
31 bool FavoriteThreadItem::operator==(const FavoriteThreadItem& item) const
32 {
33     return (m_datUrl == item.m_datUrl);
34 }
35
36 // FavoriteThreads
37 FavoriteThreads* FavoriteThreads::instance = 0;
38
39 FavoriteThreads::FavoriteThreads()
40 {}
41
42 FavoriteThreads::~FavoriteThreads()
43 {}
44
45 FavoriteThreads* FavoriteThreads::getInstance()
46 {
47     if (! instance) {
48         instance = new FavoriteThreads();
49     }
50     return instance;
51 }
52
53 void FavoriteThreads::insert(const QString& datUrl)
54 {
55     if (! m_threadList.contains(datUrl)) {
56         m_threadList.append(datUrl);
57     }
58 }
59
60 void FavoriteThreads::remove(const QString& datUrl)
61 {
62     m_threadList.removeAll(datUrl);
63 }
64
65 bool FavoriteThreads::contains(const QString& datUrl)
66 {
67     if (m_threadList.contains(datUrl)) {
68         return true;
69     } else {
70         return false;
71     }
72 }
73
74 const QList<FavoriteThreadItem> FavoriteThreads::threadList() const
75 {
76     return m_threadList;
77 }
78
79 bool FavoriteThreads::readFromXML(const QString& xml)
80 {
81     FavoriteThreads * instance = FavoriteThreads::getInstance();
82     instance->m_threadList.clear();
83
84     QDomDocument document;
85     if (! document.setContent(xml, true)) {
86         return false;
87     }
88
89     QDomElement root = document.documentElement();
90
91     QDomNode node = root.firstChild();
92     while (!node.isNull()) {
93         if (node.isElement() &&
94                 node.nodeName() == QString("thread") &&
95                 node.namespaceURI() == QString("http://kita.sourceforge.jp/ns/thread")) {
96             processThreadNode(node);
97         }
98         node = node.nextSibling();
99     }
100     return true;
101 }
102
103 void FavoriteThreads::processThreadNode(QDomNode& node)
104 {
105     QDomNode datUrlNode = node.namedItem("daturl");
106     QDomNode nameNode = node.namedItem("name");
107
108     if (!datUrlNode.isElement() || !nameNode.isElement()) return ;
109
110     QString url = datUrlNode.toElement().text();
111     QString name = nameNode.toElement().text();
112
113     KUrl datUrl = Kita::getDatUrl(url);
114     Thread* thread = Thread::getByUrl(datUrl);
115     thread->setThreadName(name);
116     ThreadIndex threadIndex(datUrl);
117     threadIndex.loadIndex(thread);
118
119     FavoriteThreads::getInstance() ->insert(datUrl.prettyUrl());
120 }
121
122 const QString FavoriteThreads::toXML() const
123 {
124     QDomDocument document;
125
126     //    QDomProcessingInstruction pi = document.createProcessingInstruction("xml", "version=\"1.0\"");
127     //    document.appendChild(pi);
128
129     QDomElement root = document.createElementNS("http://kita.sourceforge.jp/ns/favorites", "favorites");
130     document.appendChild(root);
131
132     QList<FavoriteThreadItem>::const_iterator it;
133     for (it = threadList().begin(); it != threadList().end(); ++it) {
134         QString datUrl = (*it).m_datUrl;
135         QDomElement threadElement = document.createElementNS("http://kita.sourceforge.jp/ns/thread", "thread");
136         root.appendChild(threadElement);
137
138         QDomElement datUrlElement = document.createElement("daturl");
139         threadElement.appendChild(datUrlElement);
140         datUrlElement.appendChild(document.createTextNode(datUrl));
141
142         DatManager datManager(datUrl);
143         QString threadName = datManager.threadName();
144         QDomElement nameElement = document.createElement("name");
145         threadElement.appendChild(nameElement);
146         nameElement.appendChild(document.createTextNode(threadName));
147
148         QString resNum = QString::number(datManager.getResNum());
149         QDomElement resNumElement = document.createElement("resnum");
150         threadElement.appendChild(resNumElement);
151         resNumElement.appendChild(document.createTextNode(resNum));
152
153         // board
154         QDomElement board = document.createElementNS("http://kita.sourceforge.jp/ns/board", "board");
155         threadElement.appendChild(board);
156
157         BoardDatabase db(datUrl);
158         QString boardUrl = db.boardUrl();
159         QDomElement boardUrlElement = document.createElement("url");
160         board.appendChild(boardUrlElement);
161         boardUrlElement.appendChild(document.createTextNode(boardUrl));
162
163         BoardDatabase db2(boardUrl);
164         QString boardName = db2.boardName();
165         QDomElement boardNameElement = document.createElement("name");
166         board.appendChild(boardNameElement);
167         boardNameElement.appendChild(document.createTextNode(boardName));
168     }
169     return document.toString(0);
170 }
171
172 void FavoriteThreads::replace(const QString& fromUrl, const QString& toUrl)
173 {
174     if (FavoriteThreads::getInstance() == 0) return ;
175     QList<FavoriteThreadItem>& threadList = FavoriteThreads::getInstance() ->m_threadList;
176     QList<FavoriteThreadItem>::iterator it;
177     for (it = threadList.begin(); it != threadList.end(); ++it) {
178         QString url = (*it).m_datUrl;
179         if (url.indexOf(fromUrl) == 0) {
180             url = url.replace(0, fromUrl.length(), toUrl);
181             threadList.erase(it);
182             threadList.prepend(url);
183             it = threadList.begin();
184         }
185     }
186 }
187
188 QString FavoriteThreads::getDatUrl(int i)
189 {
190     if (getInstance() ->m_threadList.count() > i) {
191         return getInstance() ->m_threadList[ i ].m_datUrl;
192     } else {
193         return QString();
194     }
195 }