summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore7
-rw-r--r--.gitmodules3
-rw-r--r--COPYING20
-rw-r--r--client.cxx34
m---------librtclient0
-rw-r--r--qrtclient.pro29
-rw-r--r--qrtclient/client.hxx30
-rw-r--r--qrtclient/ticket.hxx56
-rw-r--r--qrtclient/user.hxx165
-rw-r--r--ticket.cxx49
-rw-r--r--user.cxx225
11 files changed, 618 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..984b9cb
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+*.pro.user
+*.o
+*.qmake.stash
+*.so*
+*.swp
+Makefile
+moc_*
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..8a122f9
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "librtclient"]
+ path = librtclient
+ url = git@github.com:darapsa/librtclient.git
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..086fa3c
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,20 @@
+Copyright (c) 2019 Erik Prabowo Kamal
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/client.cxx b/client.cxx
new file mode 100644
index 0000000..2f30b49
--- /dev/null
+++ b/client.cxx
@@ -0,0 +1,34 @@
+#include <rtclient/client.h>
+#include "qrtclient/client.hxx"
+
+namespace RTClient {
+
+ Client::Client(QString const& url)
+ {
+ rtclient_init(url.toLatin1().constData());
+ }
+
+ void Client::logIn(QString const& name, QString const& password)
+ {
+ rtclient_login(name.toLatin1().constData(), password.toLatin1().constData());
+ struct rt_user* user = NULL;
+ rtclient_user_show(&user, name.toLatin1().constData());
+ if (user) emit logged(user);
+ }
+
+ void Client::search(QString const& owner)
+ {
+ QString query{"Owner='"};
+ query.append(owner);
+ query.append("'");
+ rt_ticketlist* taskList = NULL;
+ rtclient_ticket_search(&taskList, query.toLatin1().constData());
+ if (taskList) emit foundTasks(taskList);
+ }
+
+ Client::~Client()
+ {
+ rtclient_cleanup();
+ }
+
+}
diff --git a/librtclient b/librtclient
new file mode 160000
+Subproject cb9020218b20470b483197dd6662c0fae3237e3
diff --git a/qrtclient.pro b/qrtclient.pro
new file mode 100644
index 0000000..195110c
--- /dev/null
+++ b/qrtclient.pro
@@ -0,0 +1,29 @@
+TEMPLATE = lib
+
+HEADERS += \
+ qrtclient/user.hxx \
+ qrtclient/ticket.hxx \
+ qrtclient/client.hxx
+
+SOURCES += \
+ user.cxx \
+ ticket.cxx \
+ client.cxx
+
+INCLUDEPATH += $$PWD/librtclient
+
+LIBS += \
+ $$PWD/librtclient/librtclient.a \
+ -lcurl
+
+contains(ANDROID_TARGET_ARCH,arm64-v8a) {
+ QMAKE_CFLAGS += -I/usr/local/aarch64-linux-android/sysroot/usr/include
+ LIBS += -L/usr/local/aarch64-linux-android/sysroot/usr/lib
+}
+
+contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
+ QMAKE_CFLAGS += -I/usr/local/arm-linux-androideabi/sysroot/usr/include
+ LIBS += -L/usr/local/arm-linux-androideabi/sysroot/usr/lib
+}
+
+debug: DEFINES += DEBUG
diff --git a/qrtclient/client.hxx b/qrtclient/client.hxx
new file mode 100644
index 0000000..e32e83b
--- /dev/null
+++ b/qrtclient/client.hxx
@@ -0,0 +1,30 @@
+#ifndef QRTCLIENT_HXX
+#define QRTCLIENT_HXX
+
+#include <QObject>
+
+struct rt_user;
+struct rt_ticketlist;
+
+namespace RTClient {
+
+ class Client : public QObject
+ {
+ Q_OBJECT
+
+ public:
+ Client(QString const& url);
+ ~Client();
+
+ public slots:
+ void logIn(QString const& name, QString const& password);
+ void search(QString const& owner);
+
+ signals:
+ void logged(struct rt_user* user);
+ void foundTasks(struct rt_ticketlist* list);
+ };
+
+}
+
+#endif // QRTCLIENT_HXX
diff --git a/qrtclient/ticket.hxx b/qrtclient/ticket.hxx
new file mode 100644
index 0000000..af438ae
--- /dev/null
+++ b/qrtclient/ticket.hxx
@@ -0,0 +1,56 @@
+#ifndef QRTCLIENT_TICKET_HXX
+#define QRTCLIENT_TICKET_HXX
+
+#include <QAbstractListModel>
+
+struct rt_ticketlist;
+
+namespace RTClient {
+
+ class Ticket
+ {
+ public:
+ Ticket(QString subject) : m_subject{subject} {}
+ QString const& subject() const { return m_subject; }
+
+ private:
+ QString m_subject;
+ };
+
+ class TicketList : public QAbstractListModel
+ {
+ Q_OBJECT
+ Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged)
+
+ public:
+ enum TicketRoles {
+ SubjectRole = Qt::UserRole + 1,
+ };
+
+ explicit TicketList(QObject* parent = nullptr)
+ : QAbstractListModel{parent} {}
+ ~TicketList() {}
+
+ int rowCount(QModelIndex const& parent
+ = QModelIndex()) const Q_DECL_OVERRIDE;
+ QVariant data(const QModelIndex& index
+ , int role = Qt::DisplayRole
+ ) const Q_DECL_OVERRIDE;
+
+ protected:
+ QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE;
+
+ signals:
+ void rowCountChanged();
+
+ private:
+ QList<Ticket> tickets;
+ void addTicket(Ticket const& ticket);
+
+ private slots:
+ void addTickets(struct rt_ticketlist* ticketList);
+ };
+
+}
+
+#endif // QRTCLIENT_TICKET_HXX
diff --git a/qrtclient/user.hxx b/qrtclient/user.hxx
new file mode 100644
index 0000000..06d6a71
--- /dev/null
+++ b/qrtclient/user.hxx
@@ -0,0 +1,165 @@
+#ifndef QRTCLIENT_USER_HXX
+#define QRTCLIENT_USER_HXX
+
+#include <QObject>
+
+struct rt_user;
+
+namespace RTClient {
+
+ class User : public QObject
+ {
+ Q_OBJECT
+ Q_PROPERTY(QString id READ id WRITE setId NOTIFY idChanged)
+ Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
+ Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged)
+ Q_PROPERTY(QString emailAddress READ emailAddress WRITE setEmailAddress NOTIFY emailAddressChanged)
+ Q_PROPERTY(QString realName READ realName WRITE setRealName NOTIFY realNameChanged)
+ Q_PROPERTY(QString nickName READ nickName WRITE setNickName NOTIFY nickNameChanged)
+ Q_PROPERTY(QString organization READ organization WRITE setOrganization NOTIFY organizationChanged)
+ Q_PROPERTY(QString address1 READ address1 WRITE setAddress1 NOTIFY address1Changed)
+ Q_PROPERTY(QString address2 READ address2 WRITE setAddress2 NOTIFY address2Changed)
+ Q_PROPERTY(QString city READ city WRITE setCity NOTIFY cityChanged)
+ Q_PROPERTY(QString state READ state WRITE setState NOTIFY stateChanged)
+ Q_PROPERTY(QString zip READ zip WRITE setZip NOTIFY zipChanged)
+ Q_PROPERTY(QString country READ country WRITE setCountry NOTIFY countryChanged)
+ Q_PROPERTY(QString homePhone READ homePhone WRITE setHomePhone NOTIFY homePhoneChanged)
+ Q_PROPERTY(QString workPhone READ workPhone WRITE setWorkPhone NOTIFY workPhoneChanged)
+ Q_PROPERTY(QString mobilePhone READ mobilePhone WRITE setMobilePhone NOTIFY mobilePhoneChanged)
+ Q_PROPERTY(QString pagerPhone READ pagerPhone WRITE setPagerPhone NOTIFY pagerPhoneChanged)
+ Q_PROPERTY(QString lang READ lang WRITE setLang NOTIFY langChanged)
+ Q_PROPERTY(bool privileged READ privileged WRITE setPrivileged NOTIFY privilegedChanged)
+ Q_PROPERTY(bool disabled READ disabled WRITE setDisabled NOTIFY disabledChanged)
+ Q_PROPERTY(bool loggedIn READ loggedIn WRITE setLoggedIn NOTIFY loggedInChanged)
+
+ public:
+ explicit User(QObject* parent = nullptr)
+ : QObject{parent}
+ , m_id{""}
+ , m_name{""}
+ , m_password{""}
+ , m_emailAddress{""}
+ , m_realName{""}
+ , m_nickName{""}
+ , m_organization{""}
+ , m_gecos{""}
+ , m_address1{""}
+ , m_address2{""}
+ , m_city{""}
+ , m_state{""}
+ , m_zip{""}
+ , m_country{""}
+ , m_homePhone{""}
+ , m_workPhone{""}
+ , m_mobilePhone{""}
+ , m_pagerPhone{""}
+ , m_contactInfo{""}
+ , m_comments{""}
+ , m_lang{""}
+ , m_privileged{false}
+ , m_disabled{true}
+ , m_loggedIn{false}
+ {}
+ ~User() {}
+
+ QString const& id() const { return m_id; }
+ QString const& name() const { return m_name; }
+ QString const& password() const { return m_password; }
+ QString const& emailAddress() const { return m_emailAddress; }
+ QString const& realName() const { return m_realName; }
+ QString const& nickName() const { return m_nickName; }
+ QString const& organization() const { return m_organization; }
+ QString const& address1() const { return m_address1; }
+ QString const& address2() const { return m_address2; }
+ QString const& city() const { return m_city; }
+ QString const& state() const { return m_state; }
+ QString const& zip() const { return m_zip; }
+ QString const& country() const { return m_country; }
+ QString const& homePhone() const { return m_homePhone; }
+ QString const& workPhone() const { return m_workPhone; }
+ QString const& mobilePhone() const { return m_mobilePhone; }
+ QString const& pagerPhone() const { return m_pagerPhone; }
+ QString const& lang() const { return m_lang; }
+ bool privileged() const { return m_privileged; }
+ bool disabled() const { return m_disabled; }
+ bool loggedIn() const { return m_loggedIn; }
+
+ void setId(QString const& id);
+ void setName(QString const& name);
+ void setPassword(QString const& password);
+ void setEmailAddress(QString const& emailAddress);
+ void setRealName(QString const& realName);
+ void setNickName(QString const& nickName);
+ void setOrganization(QString const& organization);
+ void setAddress1(QString const& address1);
+ void setAddress2(QString const& address2);
+ void setCity(QString const& city);
+ void setState(QString const& state);
+ void setZip(QString const& zip);
+ void setCountry(QString const& country);
+ void setHomePhone(QString const& homePhone);
+ void setWorkPhone(QString const& workPhone);
+ void setMobilePhone(QString const& mobilePhone);
+ void setPagerPhone(QString const& pagerPhone);
+ void setLang(QString const& lang);
+ void setPrivileged(bool privileged);
+ void setDisabled(bool disabled);
+ void setLoggedIn(bool loggedIn);
+
+ signals:
+ void idChanged();
+ void nameChanged();
+ void passwordChanged();
+ void emailAddressChanged();
+ void realNameChanged();
+ void nickNameChanged();
+ void organizationChanged();
+ void gecosChanged();
+ void address1Changed();
+ void address2Changed();
+ void cityChanged();
+ void stateChanged();
+ void zipChanged();
+ void countryChanged();
+ void homePhoneChanged();
+ void workPhoneChanged();
+ void mobilePhoneChanged();
+ void pagerPhoneChanged();
+ void langChanged();
+ void privilegedChanged();
+ void disabledChanged();
+ void loggedInChanged();
+
+ private slots:
+ void update(struct rt_user* user);
+
+ private:
+ QString m_id;
+ QString m_name;
+ QString m_password;
+ QString m_emailAddress;
+ QString m_realName;
+ QString m_nickName;
+ QString m_organization;
+ QString m_gecos;
+ QString m_address1;
+ QString m_address2;
+ QString m_city;
+ QString m_state;
+ QString m_zip;
+ QString m_country;
+ QString m_homePhone;
+ QString m_workPhone;
+ QString m_mobilePhone;
+ QString m_pagerPhone;
+ QString m_contactInfo;
+ QString m_comments;
+ QString m_lang;
+ bool m_privileged;
+ bool m_disabled;
+ bool m_loggedIn;
+ };
+
+}
+
+#endif // QRTCLIENT_USER_HXX
diff --git a/ticket.cxx b/ticket.cxx
new file mode 100644
index 0000000..381e573
--- /dev/null
+++ b/ticket.cxx
@@ -0,0 +1,49 @@
+#include <rtclient/client.h>
+#include "qrtclient/ticket.hxx"
+
+namespace RTClient {
+
+ int TicketList::rowCount(QModelIndex const& parent) const
+ {
+ Q_UNUSED(parent)
+ return tickets.count();
+ }
+
+ QVariant TicketList::data(QModelIndex const& index, int role) const
+ {
+ auto row = index.row();
+
+ if (row < 0 || row >= tickets.count()) return QVariant();
+
+ auto ticket = tickets[row];
+ switch (role) {
+ case SubjectRole:
+ return ticket.subject();
+ default:
+ return QVariant();
+ }
+ }
+
+ QHash<int, QByteArray> TicketList::roleNames() const
+ {
+ return QHash<int, QByteArray>{
+ {SubjectRole, "subject"}
+ };
+ }
+
+ void TicketList::addTicket(Ticket const& ticket)
+ {
+ beginInsertRows(QModelIndex(), rowCount(), rowCount());
+ tickets << ticket;
+ endInsertRows();
+ emit rowCountChanged();
+ }
+
+ void TicketList::addTickets(rt_ticketlist* ticketList)
+ {
+ for (unsigned int i = 0; i < ticketList->length; i++)
+ addTicket(Ticket{ticketList->tickets[i]});
+ rtclient_ticket_freelist(ticketList);
+ }
+
+}
diff --git a/user.cxx b/user.cxx
new file mode 100644
index 0000000..3c22df4
--- /dev/null
+++ b/user.cxx
@@ -0,0 +1,225 @@
+#include <rtclient/client.h>
+#include "qrtclient/user.hxx"
+
+namespace RTClient {
+
+ void User::setId(QString const& id)
+ {
+ if (m_id != id) {
+ m_id = id;
+ emit idChanged();
+ }
+ }
+
+ void User::setName(QString const& name)
+ {
+ if (m_name != name) {
+ m_name = name;
+ emit nameChanged();
+ }
+ }
+
+ void User::setPassword(QString const& password)
+ {
+ if (m_password != password) {
+ m_password = password;
+ emit passwordChanged();
+ }
+ }
+
+ void User::setEmailAddress(QString const& emailAddress)
+ {
+ if (m_emailAddress != emailAddress) {
+ m_emailAddress = emailAddress;
+ emit emailAddressChanged();
+ }
+ }
+
+ void User::setRealName(QString const& realName)
+ {
+ if (m_realName != realName) {
+ m_realName = realName;
+ emit realNameChanged();
+ }
+ }
+
+ void User::setNickName(QString const& nickName)
+ {
+ if (m_nickName != nickName) {
+ m_nickName = nickName;
+ emit nickNameChanged();
+ }
+ }
+
+ void User::setOrganization(QString const& organization)
+ {
+ if (m_organization != organization) {
+ m_organization = organization;
+ emit organizationChanged();
+ }
+ }
+
+ void User::setAddress1(QString const& address1)
+ {
+ if (m_address1 != address1) {
+ m_address1 = address1;
+ emit address1Changed();
+ }
+ }
+
+ void User::setAddress2(QString const& address2)
+ {
+ if (m_address2 != address2) {
+ m_address2 = address2;
+ emit address2Changed();
+ }
+ }
+
+ void User::setCity(QString const& city)
+ {
+ if (m_city != city) {
+ m_city = city;
+ emit cityChanged();
+ }
+ }
+
+ void User::setState(QString const& state)
+ {
+ if (m_state != state) {
+ m_state = state;
+ emit stateChanged();
+ }
+ }
+
+ void User::setZip(QString const& zip)
+ {
+ if (m_zip != zip) {
+ m_zip = zip;
+ emit zipChanged();
+ }
+ }
+
+ void User::setCountry(QString const& country)
+ {
+ if (m_country != country) {
+ m_country = country;
+ emit countryChanged();
+ }
+ }
+
+ void User::setHomePhone(QString const& homePhone)
+ {
+ if (m_homePhone != homePhone) {
+ m_homePhone = homePhone;
+ emit homePhoneChanged();
+ }
+ }
+
+ void User::setWorkPhone(QString const& workPhone)
+ {
+ if (m_workPhone != workPhone) {
+ m_workPhone = workPhone;
+ emit workPhoneChanged();
+ }
+ }
+
+ void User::setMobilePhone(QString const& mobilePhone)
+ {
+ if (m_mobilePhone != mobilePhone) {
+ m_mobilePhone = mobilePhone;
+ emit mobilePhoneChanged();
+ }
+ }
+
+ void User::setPagerPhone(QString const& pagerPhone)
+ {
+ if (m_pagerPhone != pagerPhone) {
+ m_pagerPhone = pagerPhone;
+ emit pagerPhoneChanged();
+ }
+ }
+
+ void User::setLang(QString const& lang)
+ {
+ if (m_lang != lang) {
+ m_lang = lang;
+ emit langChanged();
+ }
+ }
+
+ void User::setPrivileged(bool privileged)
+ {
+ if (m_privileged != privileged) {
+ m_privileged = privileged;
+ emit privilegedChanged();
+ }
+ }
+
+ void User::setDisabled(bool disabled)
+ {
+ if (m_disabled != disabled) {
+ m_disabled = disabled;
+ emit disabledChanged();
+ }
+ }
+
+ void User::setLoggedIn(bool loggedIn)
+ {
+ if (m_loggedIn != loggedIn) {
+ m_loggedIn = loggedIn;
+ emit loggedInChanged();
+ }
+ }
+
+ void User::update(rt_user* user)
+ {
+ if (user) {
+ m_id = user->id;
+ m_emailAddress = user->emailaddress;
+ emit emailAddressChanged();
+ m_realName = user->realname;
+ emit realNameChanged();
+ m_nickName = user->nickname;
+ m_gecos = user->gecos;
+ m_organization = user->organization;
+ m_address1 = user->address1;
+ m_address2 = user->address2;
+ m_city = user->city;
+ m_state = user->state;
+ m_zip = user->zip;
+ m_country = user->country;
+ m_homePhone = user->homephone;
+ m_workPhone = user->workphone;
+ m_mobilePhone = user->mobilephone;
+ m_pagerPhone = user->pagerphone;
+ m_lang = user->lang;
+ m_privileged = user->privileged;
+ m_disabled = user->disabled;
+ m_loggedIn = true;
+ rtclient_user_free(user);
+ } else {
+ m_id = "";
+ m_name = "";
+ m_password = "";
+ m_emailAddress = "";
+ m_realName = "";
+ m_nickName = "";
+ m_organization = "";
+ m_address1 = "";
+ m_address2 = "";
+ m_city = "";
+ m_state = "";
+ m_zip = "";
+ m_country = "";
+ m_homePhone = "";
+ m_workPhone = "";
+ m_mobilePhone = "";
+ m_pagerPhone = "";
+ m_lang = "";
+ m_privileged = false;
+ m_disabled = true;
+ m_loggedIn = false;
+ }
+ }
+
+}