Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #49 from nemomobile/mer1367
[ssu] Introduce SsuFeatureModel. Fixes MER#1367
  • Loading branch information
Joona Petrell committed Oct 15, 2015
2 parents 8a44464 + 0345de0 commit 08deec1
Show file tree
Hide file tree
Showing 24 changed files with 448 additions and 12 deletions.
7 changes: 7 additions & 0 deletions constants.h
Expand Up @@ -24,4 +24,11 @@
#define SSU_MAX_RECURSION 1024
/// Path to zypper repo configuration
#define ZYPP_REPO_PATH "/etc/zypp/repos.d"

/// Path to the main ssu configuration file
#define SSU_FEATURE_CONFIGURATION "/var/cache/ssu/features.ini"

/// Path to the main ssu configuration file
#define SSU_FEATURE_CONFIGURATION_DIR "/usr/share/ssu/features.d"

#endif
24 changes: 24 additions & 0 deletions declarative/declarative.pro
@@ -0,0 +1,24 @@
TEMPLATE = lib
TARGET = declarativessu
TARGET = $$qtLibraryTarget($$TARGET)

include(../libssu/libssu.pri)

MODULENAME = Nemo/Ssu
TARGETPATH = $$[QT_INSTALL_QML]/$$MODULENAME

QT += qml
QT -= gui

CONFIG += plugin

target.path = $$TARGETPATH

HEADERS = declarativessufeaturemodel.h
SOURCES += plugin.cpp \
declarativessufeaturemodel.cpp

qmldir.files = qmldir *.qml *.js
qmldir.path = $$target.path

INSTALLS += target qmldir
32 changes: 32 additions & 0 deletions declarative/declarativessufeaturemodel.cpp
@@ -0,0 +1,32 @@
/**
* @file declarativessufeaturemodel.cpp
* @copyright 2015 Jolla Ltd.
* @author Joona Petrell <joona.petrell@jolla.com>
* @date 2015
*/

#include "declarativessufeaturemodel.h"
#include <QHash>
#include <qqml.h>
#include <QQmlEngine>
#include <qqmlinfo.h>

QJSValue DeclarativeSsuFeatureModel::get(int index) const
{
if (index < 0 || index >= count()) {
qmlInfo(this) << "Index" << index << "out of bounds";
return QJSValue();
}
const QHash<QByteArray, QString> feature = featureAt(index);

QJSEngine *const engine = qmlEngine(this);
QJSValue value = engine->newObject();

QHash<QByteArray, QString>::const_iterator i = feature.constBegin();
while (i != feature.constEnd()) {
value.setProperty(QString::fromLatin1(i.key()), i.value());
++i;
}

return value;
}
23 changes: 23 additions & 0 deletions declarative/declarativessufeaturemodel.h
@@ -0,0 +1,23 @@
/**
* @file declarativessufeaturemodel.h
* @copyright 2015 Jolla Ltd.
* @author Joona Petrell <joona.petrell@jolla.com>
* @date 2015
*/

#ifndef _DECLARATIVESSUFEATUREMODEL_H
#define _DECLARATIVESSUFEATUREMODEL_H

#include "../libssu/ssufeaturemodel.h"
#include <QJSValue>

class DeclarativeSsuFeatureModel: public SsuFeatureModel
{
Q_OBJECT
public:
Q_INVOKABLE QJSValue get(int index) const;
};

#endif


26 changes: 26 additions & 0 deletions declarative/plugin.cpp
@@ -0,0 +1,26 @@
/**
* @file plugin.cpp
* @copyright 2015 Jolla Ltd.
* @author Joona Petrell <joona.petrell@jollamobile.com>
* @date 2015
*/

#include <QQmlExtensionPlugin>
#include <QQmlEngine>

#include <qqml.h>
#include "declarativessufeaturemodel.h"

class NemoSsuPlugin : public QQmlExtensionPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.nemomobile.ssu")

public:
virtual void registerTypes(const char *)
{
qmlRegisterType<DeclarativeSsuFeatureModel>("Nemo.Ssu", 1, 0, "FeatureModel");
}
};

#include "plugin.moc"
2 changes: 2 additions & 0 deletions declarative/qmldir
@@ -0,0 +1,2 @@
module Nemo.Ssu
plugin declarativessu
2 changes: 2 additions & 0 deletions libssu/libssu.pro
Expand Up @@ -6,6 +6,7 @@ public_headers = \
ssu.h \
ssudeviceinfo.h \
ssurepomanager.h \
ssufeaturemodel.h

HEADERS = \
$${public_headers} \
Expand All @@ -23,6 +24,7 @@ SOURCES = \
ssudeviceinfo.cpp \
ssulog.cpp \
ssufeaturemanager.cpp \
ssufeaturemodel.cpp \
ssuvariables.cpp \
ssurepomanager.cpp \
ssusettings.cpp
Expand Down
10 changes: 0 additions & 10 deletions libssu/ssufeaturemanager.cpp
Expand Up @@ -18,16 +18,6 @@

#include "../constants.h"

#ifndef SSU_FEATURE_CONFIGURATION
/// Path to the main ssu configuration file
#define SSU_FEATURE_CONFIGURATION "/var/cache/ssu/features.ini"
#endif

#ifndef SSU_FEATURE_CONFIGURATION_DIR
/// Path to the main ssu configuration file
#define SSU_FEATURE_CONFIGURATION_DIR "/usr/share/ssu/features.d"
#endif

SsuFeatureManager::SsuFeatureManager(): QObject() {
featureSettings = new SsuSettings(SSU_FEATURE_CONFIGURATION, SSU_FEATURE_CONFIGURATION_DIR);
}
Expand Down
127 changes: 127 additions & 0 deletions libssu/ssufeaturemodel.cpp
@@ -0,0 +1,127 @@
/**
* @file ssufeaturemodel.cpp
* @copyright 2015 Jolla Ltd.
* @author Joona Petrell <joona.petrell@jolla.com>
* @date 2015
*/

#include "ssufeaturemodel.h"
#include <QList>
#include <QSettings>
#include <QHash>
#include <QDebug>
#include <QDirIterator>
#include "../constants.h"

bool featureLessThan(const QHash<QByteArray, QString> &feature1, const QHash<QByteArray, QString> &feature2)
{
return feature1.value("name") < feature2.value("name");
}

class SsuFeatureModelPrivate {
public:
SsuFeatureModelPrivate(const QString &p) : path(p)
{
load();
}

~SsuFeatureModelPrivate()
{}

void load() {
QDirIterator it(path, QDir::AllEntries|QDir::NoDot|QDir::NoDotDot, QDirIterator::FollowSymlinks);
QStringList settingsFiles;

while (it.hasNext()) {
it.next();
settingsFiles.append(it.filePath());
}
foreach (const QString &settingsFile, settingsFiles) {
QSettings settings(settingsFile, QSettings::IniFormat);

foreach (const QString &childGroup, settings.childGroups()) {
settings.beginGroup(childGroup);
QStringList keys = settings.childKeys();

if (keys.contains("name")) {
QHash<QByteArray, QString> feature;
feature.insert("name", settings.value("name").toString());
if (keys.contains("version")) {
feature.insert("version", settings.value("version").toString());
} else {
feature.insert("version", QString(""));
}
features.append(feature);
}
settings.endGroup();
}
}
qSort(features.begin(), features.end(), featureLessThan);
}

QString path;
QList<QHash<QByteArray, QString> > features;
};

SsuFeatureModel::SsuFeatureModel(QObject *parent, const QString &path)
: QAbstractListModel(parent),
d(new SsuFeatureModelPrivate(path))
{
}

SsuFeatureModel::SsuFeatureModel(QObject *parent)
: QAbstractListModel(parent),
d(new SsuFeatureModelPrivate(SSU_FEATURE_CONFIGURATION_DIR))
{
}

SsuFeatureModel::~SsuFeatureModel()
{
delete d;
}

int SsuFeatureModel::count() const
{
return rowCount();
}

const QHash<QByteArray, QString> &SsuFeatureModel::featureAt(int index) const
{
return d->features.at(index);
}

int SsuFeatureModel::rowCount(const QModelIndex &parent) const
{
return parent.isValid() ? 0 : d->features.count();
}

void SsuFeatureModel::reload()
{
beginResetModel();
d->features.clear();
d->load();
endResetModel();
}

QVariant SsuFeatureModel::data(const QModelIndex &index, int role) const
{
int row = index.row();
if (!index.isValid() || row < 0 || row >= d->features.count())
return QVariant();

switch (role) {
case Name:
return d->features.at(row).value("name");
case Version:
return d->features.at(row).value("version");
}
return QVariant();
}

QHash<int, QByteArray> SsuFeatureModel::roleNames() const
{
QHash<int,QByteArray> roles;
roles.insert(Name, "name");
roles.insert(Version, "version");
return roles;
}
49 changes: 49 additions & 0 deletions libssu/ssufeaturemodel.h
@@ -0,0 +1,49 @@
/**
* @file ssufeaturemodel.h
* @copyright 2015 Jolla Ltd.
* @author Joona Petrell <joona.petrell@jolla.com>
* @date 2015
*/

#ifndef _SSUFEATUREMODEL_H
#define _SSUFEATUREMODEL_H

#include <QAbstractListModel>

class SsuFeatureModelPrivate;
class FeatureModelTest;

class SsuFeatureModel: public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(int count READ count NOTIFY countChanged)
public:
enum Roles {
Name = Qt::UserRole,
Version
};

SsuFeatureModel(QObject *parent = 0);
SsuFeatureModel(QObject *parent, const QString &path);
~SsuFeatureModel();

virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
virtual QVariant data(const QModelIndex &index, int role) const;

public slots:
void reload();
int count() const;

protected:
QHash<int, QByteArray> roleNames() const;
const QHash<QByteArray, QString> &featureAt(int index) const;

signals:
void countChanged();

private:
SsuFeatureModelPrivate *d;
friend class FeatureModelTest;
};

#endif
12 changes: 11 additions & 1 deletion rpm/ssu.spec
Expand Up @@ -84,7 +84,6 @@ Provides: rpm-macros
%config %{_sysconfdir}/rpm/macros.ssuks
%{_bindir}/ssuks


%package slipstream
Summary: %{name} OS factory snapshot download provider
Group: System/Base
Expand All @@ -96,6 +95,17 @@ Helper utility to authenticate downloads of factory snapshot manifests.
%defattr(-,root,root,-)
%{_bindir}/ssuslipstream

%package declarative
Summary: QML plugin for libssu
Group: System/Base
BuildRequires: pkgconfig(Qt5Qml)

%description declarative
%{summary}

%files declarative
%{_libdir}/qt5/qml/Nemo/Ssu/*

%package devel
Summary: Development files for %{name}
Group: Development/Libraries
Expand Down
3 changes: 2 additions & 1 deletion ssu.pro
Expand Up @@ -4,7 +4,8 @@ contains(QT_VERSION, ^4\\.[0-7]\\..*) {

TEMPLATE = subdirs
SUBDIRS = libssu libssunetworkproxy ssud
SUBDIRS += ssucli ssuurlresolver ssuks ssuslipstream
SUBDIRS += ssucli ssuurlresolver ssuks
SUBDIRS += ssuslipstream declarative

ssuconfhack {
SUBDIRS += ssuconfperm
Expand Down
1 change: 1 addition & 0 deletions tests/tests.pro
Expand Up @@ -6,6 +6,7 @@ SUBDIRS = \
testutils/sandboxhook.pro \
ut_coreconfig \
ut_deviceinfo \
ut_featuremodel \
ut_repomanager \
ut_ssu \
ut_ssucli \
Expand Down
5 changes: 5 additions & 0 deletions tests/tests.xml
Expand Up @@ -38,6 +38,11 @@
<step expected_result="0">/opt/tests/ssu/runtest.sh ut_settings</step>
</case>
</set>
<set name="featuremodel" description="Test to determine feature model behaves correctly" feature="featuremodel">
<case name="ut_featuremodel" type="Functional" description="Feature model processing test" timeout="1000" subfeature="">
<step expected_result="0">/opt/tests/ssu/runtest.sh ut_featuremodel</step>
</case>
</set>
<set name="ssuurlresolver" description="Test to determine if the UrlResolverPlugin works well with installed version of libzypp" feature="ssuurlresolver">
<case name="ut_ssuurlresolver" type="Functional" description="URL resolver plugin test" timeout="1000" subfeature="">
<step expected_result="0">/opt/tests/ssu/runtest.sh ut_ssuurlresolver</step>
Expand Down

0 comments on commit 08deec1

Please sign in to comment.