enabled packagekit backend for packagekit 0.2.0
[opensuse:kupdateapplet.git] / updater / packagekit / packagekit_updater.cpp
1 /*
2    Copyright (C) 2006,2007,2008 Novell Inc
3
4    This program is free software; you can redistribute it and/or
5    modify it under the terms of the GNU General Public
6    License as published by the Free Software Foundation; either
7    version 2 of the License, or (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program; see the file COPYING.  If not, write to
16    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17    Boston, MA 02110-1301, USA.
18 */
19
20 #include <stdio.h>
21 #include <string.h>
22 #include <unistd.h>
23 #include <sys/poll.h>
24 #include <sys/types.h>
25 #include <fcntl.h>
26
27 #include <q3listview.h>
28 #include <qobject.h>
29 #include <qtimer.h>
30 #include <qmessagebox.h>
31
32 #include <kglobal.h>
33
34 #include <kgenericfactory.h>
35 #include <k3process.h>
36 #include <kdebug.h>
37 #include <klocale.h>
38 #include <kmessagebox.h>
39 #include <kconfig.h>
40 #include "packagekit_updater.h"
41 #include "UpdateListItem.h"
42 #include "../Constants.h"
43 #include "../MainWindow.h"
44
45 // NO UPDATE SOURCE TEST
46
47 K_EXPORT_COMPONENT_FACTORY( opensuseupdater_packagekit, KGenericFactory<PackageKitUpdater>( "opensuseupdater_packagekit" ) )
48
49 PackageKitUpdater::PackageKitUpdater( QObject *parent, const QStringList& ) 
50         : Updater( parent ) 
51         , _patchList (0)
52         , _packageList (0)
53         , _securityAvailable (false)
54 {
55         // For ease announce that we have been loaded.
56         kDebug() << "PackageKit plugin loaded";
57         kDebug() << "Initializing PackageKit backend";
58
59         // Connect to PackageKit 
60         pkConnector = new QPackageKitConnector(this);
61
62         // Package information when asked (by getupdates)
63         connect(pkConnector,
64                 SIGNAL(Package(const QString&, const QString&, const QString&)),
65                 this,
66                 SLOT(newPackage(const QString&, const QString&, const QString&))
67                 );
68
69         // Package description when asked (by getdescription)
70         connect(pkConnector, 
71                 SIGNAL(Description(const QString&, const QString&, const QString&,
72                          const QString&, const QString&, qulonglong)),
73                 this,
74                 SLOT(gotDescription(const QString&, const QString&, const QString&,
75                         const QString&, const QString&, qulonglong))
76         );
77
78         // transaction finished
79         connect(pkConnector,
80                 SIGNAL(Finished(QPackageKitConnector::Exit::ExitEnum, uint)),
81                 this,
82                 SLOT(transactionFinished(QPackageKitConnector::Exit::ExitEnum, uint))
83         );
84
85         // getUpdates transaction finished
86         connect(pkConnector,
87                 SIGNAL(UpdatesFinished()),
88                 this,
89                 SLOT(updatesFinished())
90         );
91
92         // transaction without progress information
93         connect(pkConnector,
94                 SIGNAL(NoProgressUpdates()),
95                 this,
96                 SLOT(noProgressInfo())
97         );
98
99         // transaction with progress information
100         connect(pkConnector,
101                 SIGNAL(ProgressChanged(uint, uint, uint, uint)),
102                 this,
103                 SLOT(updateProgress(uint, uint, uint, uint))
104         );
105
106         // transaction with progress information
107         connect(pkConnector,
108                 SIGNAL(ErrorMessage(const QString&)),
109                 this,
110                 SLOT(error(const QString&))
111         );
112 }
113
114 void PackageKitUpdater::transactionFinished(QPackageKitConnector::Exit::ExitEnum exitCode, uint runtime)
115 {
116         kDebug() << "transaction finished" << exitCode;
117 }
118
119 void PackageKitUpdater::error(const QString &message)
120 {
121         kDebug() << message;
122         emit updateAppletError(message);
123 }
124
125 void PackageKitUpdater::noProgressInfo()
126 {
127         // TODO
128         kDebug() << "noProgressInfo";
129 }
130
131
132 void PackageKitUpdater::updateProgress(uint percentage, uint subpercentage, uint elapsed, uint remaining) 
133 {
134         // TODO
135         kDebug() << "updateProgress" ;
136         kDebug() << percentage << "/" << subpercentage ;
137 }
138
139 // Called when PackageKit returns search results from GetUpdates command
140 void PackageKitUpdater::newPackage(const QString &info, const QString &package_id, const QString &summary)
141 {
142
143         if (!_packageList || !_patchList)
144                 return;
145
146         // disassemble package_id
147         QStringList id_list = package_id.split(";");
148         QString name = id_list[0];
149         QString version = id_list[1];
150         QString arch = id_list[2];
151         QString data = id_list[3];
152
153
154         // add package to list
155         Q3CheckListItem *newItem;
156
157         if (info == "enhancement")
158                 newItem = new Q3CheckListItem ( _packageList, name, Q3CheckListItem::CheckBox );
159         else
160                 newItem = new Q3CheckListItem ( _patchList, name, Q3CheckListItem::CheckBox );
161
162         newItem->setText(COLUMN_NAME, name );
163         newItem->setText(COLUMN_SUMMARY, summary );
164         newItem->setText(COLUMN_TYPE, info );
165         newItem->setText(COLUMN_NEW_VERSION, version );
166         newItem->setText(COLUMN_CATALOG, data );
167         newItem->setText(COLUMN_ID, package_id ) ;
168
169         if (info == "security")
170                 _securityAvailable = true;
171
172 }
173
174 void PackageKitUpdater::updatesFinished()
175 {
176         if (_securityAvailable)
177                 emit updateApplet(APPLET_CRITICAL_UPDATES, _patchList->childCount(), _packageList->childCount());
178         else if ( _patchList->childCount() + _packageList->childCount() > 0 )
179                 emit updateApplet(APPLET_UPDATES, _patchList->childCount(), _packageList->childCount());
180         else
181                 emit updateApplet(APPLET_NO_UPDATES, 0, 0);
182
183         emit populateDone();
184 }
185
186 UpdaterCapabilities PackageKitUpdater::capabilities()
187 {
188         UpdaterCapabilities caps;
189         caps.canSelectIndividualUpdates = true;
190         caps.canProvidePackages = true;
191         return caps;
192 }
193
194 void PackageKitUpdater::gotDescription(const QString &package_id, const QString &licence, const QString &group,
195                         const QString &detail, const QString &url, qulonglong size) 
196 {
197         emit returnDescription(detail, 0);      // ugly hack: set description of package and pathes
198         emit returnDescription(detail, 1);      // as we don't know which resolvable type was queried
199 }
200
201 void PackageKitUpdater::shutdown()
202 {
203         delete pkConnector;
204 }
205
206 void PackageKitUpdater::showLog()
207 {
208 }
209
210 void PackageKitUpdater::doCheckForUpdates()
211 {
212         kDebug() << "Checking for updates...";
213
214         if (!_patchList || !_packageList)
215                 return;
216
217         _patchList->clear();
218         _packageList->clear();
219         _securityAvailable=false;
220
221         emit updateApplet(APPLET_CHECKING, 0, 0);
222         pkConnector->getUpdates();
223 }
224
225 void PackageKitUpdater::populateLists(Q3ListView *patchList, Q3ListView *packageList, bool silent )
226 {
227         _patchList = patchList;
228         _packageList = packageList;
229
230         kDebug() << "got populate UI request...";
231         doCheckForUpdates();
232 }
233
234 void PackageKitUpdater::resolvableSelected(Q3ListViewItem *item, int resolvableType)
235 {
236         kDebug() << "retrieve updating item";
237         
238         if (item)
239         {
240                 QString id = item->text(COLUMN_ID);
241                 pkConnector->getDescription(id);
242         }
243 }
244
245 void PackageKitUpdater::startInstall()
246 {
247         // TODO
248         QMessageBox::warning(NULL,"not implemented", "This function is not implemented.");
249         return;
250         
251         kDebug() << "start installation...";
252
253         if (!_patchList || !_packageList)
254                 return;
255
256         // iterate through list of updates the user wants to install and trigger installation
257
258         {
259                 kDebug() << "start installation (patches)...";
260                 Q3CheckListItem *item = (Q3CheckListItem*) _patchList->firstChild();
261                 while (item != NULL)
262                 {
263                         if (item->isOn())
264                         {
265                                 kDebug() <<  "INSTALL: " << item->text(COLUMN_ID);
266                                 pkConnector->installPackage(item->text(COLUMN_ID));
267                         }               
268                         item = (Q3CheckListItem*)  item->nextSibling();
269                 }
270         }
271
272
273
274         {
275                 kDebug() << "start installation (packages)...";
276                 Q3CheckListItem *item = (Q3CheckListItem*) _packageList->firstChild();
277                 while (item != NULL)
278                 {
279                         if (item->isOn())
280                         {
281                                 kDebug() <<  "INSTALL: " << item->text(COLUMN_ID);
282                                 pkConnector->installPackage(item->text(COLUMN_ID));
283                         }               
284                         item = (Q3CheckListItem*)  item->nextSibling();
285                 }
286         }
287 }
288
289
290
291
292 void PackageKitUpdater::configureUpdater()
293 {
294         kDebug() << "configure updater";
295         // TODO
296
297         QMessageBox::warning(NULL,"not implemented", "This function is not implemented.");
298 }
299
300
301 #include "packagekit_updater.moc"
302
303 // vim: ts=2 noet sw=2