summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore17
-rw-r--r--catalog.cxx62
-rw-r--r--client.cxx7
m---------libicclient10
-rw-r--r--qicclient.pro16
-rw-r--r--qicclient/catalog.hxx81
-rw-r--r--qicclient/client.hxx9
7 files changed, 174 insertions, 28 deletions
diff --git a/.gitignore b/.gitignore
index 03c1779..f623e34 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,13 +1,10 @@
-*.a
-*.pro.user
-*.o
-*.qmake.stash
-*.so*
-*.swp
-Makefile
-moc_*
CMakeCache.txt
CMakeFiles
-CMakeLists.txt.user
cmake_install.cmake
-*_autogen
+CMakeLists.txt.user
+libqicclient.a
+Makefile
+moc_*
+*.o
+qicclient_autogen
+*.swp
diff --git a/catalog.cxx b/catalog.cxx
new file mode 100644
index 0000000..17702bc
--- /dev/null
+++ b/catalog.cxx
@@ -0,0 +1,62 @@
+#include "qicclient/catalog.hxx"
+
+namespace ICClient {
+
+ int Catalog::rowCount(QModelIndex const& parent) const
+ {
+ Q_UNUSED(parent)
+ return products.count();
+ }
+
+ QVariant Catalog::data(QModelIndex const& index, int role) const
+ {
+ auto row = index.row();
+
+ if (row < 0 || row >= products.count()) return QVariant();
+
+ auto product = products[row];
+ switch (role) {
+ case SkuRole:
+ return product.sku();
+ case DescriptionRole:
+ return product.description();
+ case CommentRole:
+ return product.comment();
+ case ImageRole:
+ return product.image();
+ case PriceRole:
+ return product.price();
+ default:
+ return QVariant();
+ }
+ }
+
+ QHash<int, QByteArray> Catalog::roleNames() const
+ {
+ return QHash<int, QByteArray>{
+ {SkuRole, "sku"}
+ , {DescriptionRole, "description"}
+ , {CommentRole, "comment"}
+ , {ImageRole, "image"}
+ , {PriceRole, "price"}
+ };
+ }
+
+ void Catalog::addProduct(Product const& product)
+ {
+ beginInsertRows(QModelIndex(), rowCount(), rowCount());
+ products << product;
+ endInsertRows();
+ }
+
+ void Catalog::update(icclient_catalog* catalog)
+ {
+ if (catalog) {
+ for (size_t i = 0; i < catalog->length; i++)
+ addProduct(Product{catalog->products[i]});
+ icclient_product_freecatalog(catalog);
+ }
+ emit updated();
+ }
+
+}
diff --git a/client.cxx b/client.cxx
index f9cf9b2..0443ce3 100644
--- a/client.cxx
+++ b/client.cxx
@@ -13,6 +13,13 @@ namespace ICClient {
icclient_cleanup();
}
+ void Client::productAll(icclient_catalog** catalogptr
+ , size_t (*callback)(void*, size_t, size_t, void*))
+ {
+ icclient_product_all(catalogptr, callback);
+ emit gotProductAll(*catalogptr);
+ }
+
void Client::logIn(QString const& username, QString const& password)
{
icclient_login(username.toLatin1().constData()
diff --git a/libicclient b/libicclient
-Subproject 57bb4f20c1cf737b49eac2a8be108a9ffbde60c
+Subproject 8b8fcdd17bf243440f52bd74e447afcface8b10
diff --git a/qicclient.pro b/qicclient.pro
index 40b180a..7adb82e 100644
--- a/qicclient.pro
+++ b/qicclient.pro
@@ -3,22 +3,12 @@ TEMPLATE = lib
CONFIG += staticlib
HEADERS += \
+ qicclient/catalog.hxx \
qicclient/client.hxx
SOURCES += \
+ catalog.cxx \
client.cxx
INCLUDEPATH += $$PWD/libicclient
-LIBS += \
- $$PWD/libicclient/libicclient.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
-}
+LIBS += $$PWD/libicclient/libicclient.a
debug: DEFINES += DEBUG
diff --git a/qicclient/catalog.hxx b/qicclient/catalog.hxx
new file mode 100644
index 0000000..07b4c81
--- /dev/null
+++ b/qicclient/catalog.hxx
@@ -0,0 +1,81 @@
+#ifndef QICCLIENT_CATALOG_HXX
+#define QICCLIENT_CATALOG_HXX
+
+#include <QAbstractListModel>
+#include <QLocale>
+#include <icclient/product.h>
+
+struct icclient_catalog;
+
+namespace ICClient {
+
+ class Product
+ {
+ public:
+ Product(icclient_product* product) : m_sku{product->sku}
+ {
+ if (product->description)
+ m_description
+ = QString{product->description};
+ if (product->comment)
+ m_comment = QString{product->comment};
+ if (product->image)
+ m_image = QString{product->image};
+ QLocale locale;
+ if (product->price)
+ m_price = locale.toCurrencyString
+ (product->price, "Rp");
+ }
+ QString const& sku() const { return m_sku; }
+ QString const& description() const { return m_description; }
+ QString const& comment() const { return m_comment; }
+ QString const& image() const { return m_image; }
+ QString const& price() const { return m_price; }
+
+ private:
+ QString m_sku;
+ QString m_description;
+ QString m_comment;
+ QString m_image;
+ QString m_price;
+ };
+
+ class Catalog : public QAbstractListModel
+ {
+ Q_OBJECT
+
+ public:
+ enum ProductRoles {
+ SkuRole = Qt::UserRole + 1,
+ DescriptionRole,
+ CommentRole,
+ ImageRole,
+ PriceRole
+ };
+
+ explicit Catalog(QObject* parent = nullptr)
+ : QAbstractListModel{parent} {}
+
+ int rowCount(QModelIndex const& parent
+ = QModelIndex()) const Q_DECL_OVERRIDE;
+ QVariant data(const QModelIndex& index
+ , int role = Qt::DisplayRole
+ ) const Q_DECL_OVERRIDE;
+
+ signals:
+ void updated();
+
+ protected:
+ QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE;
+
+ private slots:
+ void update(icclient_catalog* catalog);
+
+ private:
+ QList<Product> products;
+ void addProduct(Product const& product);
+ };
+
+}
+
+#endif // QICCLIENT_CATALOG_HXX
diff --git a/qicclient/client.hxx b/qicclient/client.hxx
index 14c3652..27ba2af 100644
--- a/qicclient/client.hxx
+++ b/qicclient/client.hxx
@@ -2,6 +2,9 @@
#define QRTCLIENT_CLIENT_HXX
#include <QObject>
+#include <icclient/product.h>
+
+struct icclient_catalog;
namespace ICClient {
@@ -13,11 +16,17 @@ namespace ICClient {
Client(char const* url, char const* certificate = nullptr);
~Client();
+ void productAll(icclient_catalog** catalogptr
+ , size_t (*callback)(void* contents
+ , size_t size, size_t nmemb
+ , void* userdata));
+
public slots:
void logIn(QString const& username, QString const& password);
void logOut();
signals:
+ void gotProductAll(icclient_catalog* catalog);
void loggedIn(QString const& username);
void loggedOut();
};