应用搜索调用应用商店接口接口改为异步调用
This commit is contained in:
parent
2619025065
commit
3d128c42b7
|
@ -60,4 +60,5 @@ enum SearchResultProperty {
|
||||||
typedef QVector<SearchProperty::SearchResultProperty> SearchResultProperties;
|
typedef QVector<SearchProperty::SearchResultProperty> SearchResultProperties;
|
||||||
typedef QMap<SearchProperty::SearchResultProperty, QVariant> SearchResultPropertyMap;
|
typedef QMap<SearchProperty::SearchResultProperty, QVariant> SearchResultPropertyMap;
|
||||||
}
|
}
|
||||||
|
Q_DECLARE_METATYPE(UkuiSearch::SearchResultProperties);
|
||||||
#endif // SEARCHRESULTPROPERTY_H
|
#endif // SEARCHRESULTPROPERTY_H
|
||||||
|
|
|
@ -32,6 +32,7 @@ AppSearchTask::AppSearchTask(QObject *parent)
|
||||||
qRegisterMetaType<size_t>("size_t");
|
qRegisterMetaType<size_t>("size_t");
|
||||||
m_pool = new QThreadPool(this);
|
m_pool = new QThreadPool(this);
|
||||||
m_pool->setMaxThreadCount(3);
|
m_pool->setMaxThreadCount(3);
|
||||||
|
m_dbusCallBackThread = new QThread(this);
|
||||||
qDBusRegisterMetaType<QMap<QString, QString>>();
|
qDBusRegisterMetaType<QMap<QString, QString>>();
|
||||||
qDBusRegisterMetaType<QList<QMap<QString, QString>>>();
|
qDBusRegisterMetaType<QList<QMap<QString, QString>>>();
|
||||||
}
|
}
|
||||||
|
@ -40,6 +41,8 @@ AppSearchTask::~AppSearchTask()
|
||||||
{
|
{
|
||||||
m_pool->clear();
|
m_pool->clear();
|
||||||
m_pool->waitForDone();
|
m_pool->waitForDone();
|
||||||
|
m_dbusCallBackThread->quit();
|
||||||
|
m_dbusCallBackThread->wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppSearchTask::setController(const SearchController &searchController)
|
void AppSearchTask::setController(const SearchController &searchController)
|
||||||
|
@ -64,12 +67,18 @@ QString AppSearchTask::getCustomSearchType()
|
||||||
|
|
||||||
void AppSearchTask::startSearch()
|
void AppSearchTask::startSearch()
|
||||||
{
|
{
|
||||||
|
if(!m_dbusCallBackThread->isRunning()) {
|
||||||
|
m_dbusCallBackThread->start();
|
||||||
|
}
|
||||||
AppSearchWorker *appSearchWorker = new AppSearchWorker(this);
|
AppSearchWorker *appSearchWorker = new AppSearchWorker(this);
|
||||||
m_pool->start(appSearchWorker);
|
m_pool->start(appSearchWorker);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppSearchTask::stop()
|
void AppSearchTask::stop()
|
||||||
{
|
{
|
||||||
|
if(m_dbusCallBackThread->isRunning()) {
|
||||||
|
m_dbusCallBackThread->exit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AppSearchTask::isSearching()
|
bool AppSearchTask::isSearching()
|
||||||
|
@ -77,6 +86,59 @@ bool AppSearchTask::isSearching()
|
||||||
return m_pool->activeThreadCount() > 0;
|
return m_pool->activeThreadCount() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AppSearchTask::dbusCallBack(QDBusPendingCallWatcher *call)
|
||||||
|
{
|
||||||
|
QDBusPendingReply<QList<QMap<QString, QString>>> reply = *call;
|
||||||
|
size_t searchId = call->property("id").value<size_t>();
|
||||||
|
if(reply.isValid()) {
|
||||||
|
SearchResultProperties properties = call->property("prop").value<SearchResultProperties>();
|
||||||
|
int resultNum = call->property("num").toInt();
|
||||||
|
for(int i = 0; i < reply.value().size(); i++) {
|
||||||
|
if (m_searchController.beginSearchIdCheck(searchId)) {
|
||||||
|
ResultItem item(searchId);
|
||||||
|
item.setItemKey(reply.value().at(i).value("appname"));
|
||||||
|
if(properties.contains(SearchProperty::SearchResultProperty::ApplicationPkgName)) {
|
||||||
|
item.setValue(SearchProperty::SearchResultProperty::ApplicationPkgName, reply.value().at(i).value("appname"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(properties.contains(SearchProperty::SearchResultProperty::ApplicationLocalName)) {
|
||||||
|
QString localName;
|
||||||
|
if(QLocale::system().language() == QLocale::Chinese) {
|
||||||
|
localName = reply.value().at(i).value("displayname_cn");
|
||||||
|
} else {
|
||||||
|
localName = reply.value().at(i).value("appname");
|
||||||
|
}
|
||||||
|
item.setValue(SearchProperty::SearchResultProperty::ApplicationLocalName, localName);
|
||||||
|
}
|
||||||
|
if(properties.contains(SearchProperty::SearchResultProperty::ApplicationIconName)) {
|
||||||
|
item.setValue(SearchProperty::SearchResultProperty::ApplicationIconName, reply.value().at(i).value("icon"));
|
||||||
|
}
|
||||||
|
if(properties.contains(SearchProperty::SearchResultProperty::ApplicationDescription)) {
|
||||||
|
item.setValue(SearchProperty::SearchResultProperty::ApplicationDescription, reply.value().at(i).value("discription"));
|
||||||
|
}
|
||||||
|
if(properties.contains(SearchProperty::SearchResultProperty::IsOnlineApplication)) {
|
||||||
|
item.setValue(SearchProperty::SearchResultProperty::IsOnlineApplication, 1);
|
||||||
|
}
|
||||||
|
m_searchController.getDataQueue()->enqueue(item);
|
||||||
|
if(++resultNum == m_searchController.informNum()) {
|
||||||
|
Q_EMIT reachInformNum();
|
||||||
|
resultNum = 0;
|
||||||
|
}
|
||||||
|
m_searchController.finishSearchIdCheck();
|
||||||
|
} else {
|
||||||
|
qDebug() << "Search id changed!";
|
||||||
|
m_searchController.finishSearchIdCheck();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Q_EMIT searchFinished(searchId);
|
||||||
|
} else {
|
||||||
|
qWarning() << "SoftWareCenter dbus called failed!" << reply.error();
|
||||||
|
Q_EMIT searchError(searchId, "SoftWareCenter dbus called failed!");
|
||||||
|
}
|
||||||
|
call->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
AppSearchWorker::AppSearchWorker(AppSearchTask *AppSarchTask): m_appSearchTask(AppSarchTask)
|
AppSearchWorker::AppSearchWorker(AppSearchTask *AppSarchTask): m_appSearchTask(AppSarchTask)
|
||||||
{
|
{
|
||||||
m_controller = &m_appSearchTask->m_searchController;
|
m_controller = &m_appSearchTask->m_searchController;
|
||||||
|
@ -132,55 +194,17 @@ void AppSearchWorker::run()
|
||||||
QStringLiteral("com.kylin.getsearchresults"),
|
QStringLiteral("com.kylin.getsearchresults"),
|
||||||
QStringLiteral("get_search_result"));
|
QStringLiteral("get_search_result"));
|
||||||
msg.setArguments({keyword});
|
msg.setArguments({keyword});
|
||||||
QDBusReply<QList<QMap<QString, QString>>> reply = QDBusConnection::sessionBus().call(msg, QDBus::Block, 1500);
|
QDBusPendingCall call = QDBusConnection::sessionBus().asyncCall(msg);
|
||||||
if(reply.isValid()) {
|
auto *watcher = new QDBusPendingCallWatcher(call);
|
||||||
// qDebug() << reply.value();
|
watcher->setProperty("id", QVariant::fromValue(m_currentSearchId));
|
||||||
for(int i = 0; i < reply.value().size(); i++) {
|
watcher->setProperty("prop", QVariant::fromValue(properties));
|
||||||
if (m_controller->beginSearchIdCheck(m_currentSearchId)) {
|
watcher->setProperty("num", m_resultNum);
|
||||||
ResultItem item(m_currentSearchId);
|
watcher->moveToThread(m_appSearchTask->m_dbusCallBackThread);
|
||||||
item.setItemKey(reply.value().at(i).value("appname"));
|
QObject::connect(watcher, &QDBusPendingCallWatcher::finished, m_appSearchTask, &AppSearchTask::dbusCallBack, Qt::DirectConnection);
|
||||||
if(properties.contains(SearchProperty::SearchResultProperty::ApplicationPkgName)) {
|
|
||||||
item.setValue(SearchProperty::SearchResultProperty::ApplicationPkgName, reply.value().at(i).value("appname"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(properties.contains(SearchProperty::SearchResultProperty::ApplicationLocalName)) {
|
|
||||||
QString localName;
|
|
||||||
if(QLocale::system().language() == QLocale::Chinese) {
|
|
||||||
localName = reply.value().at(i).value("displayname_cn");
|
|
||||||
} else {
|
|
||||||
localName = reply.value().at(i).value("appname");
|
|
||||||
}
|
|
||||||
item.setValue(SearchProperty::SearchResultProperty::ApplicationLocalName, localName);
|
|
||||||
}
|
|
||||||
if(properties.contains(SearchProperty::SearchResultProperty::ApplicationIconName)) {
|
|
||||||
item.setValue(SearchProperty::SearchResultProperty::ApplicationIconName, reply.value().at(i).value("icon"));
|
|
||||||
}
|
|
||||||
if(properties.contains(SearchProperty::SearchResultProperty::ApplicationDescription)) {
|
|
||||||
item.setValue(SearchProperty::SearchResultProperty::ApplicationDescription, reply.value().at(i).value("discription"));
|
|
||||||
}
|
|
||||||
if(properties.contains(SearchProperty::SearchResultProperty::IsOnlineApplication)) {
|
|
||||||
item.setValue(SearchProperty::SearchResultProperty::IsOnlineApplication, 1);
|
|
||||||
}
|
|
||||||
m_controller->getDataQueue()->enqueue(item);
|
|
||||||
if(++m_resultNum == m_controller->informNum()) {
|
|
||||||
QMetaObject::invokeMethod(m_appSearchTask, "reachInformNum");
|
|
||||||
m_resultNum = 0;
|
|
||||||
}
|
|
||||||
m_controller->finishSearchIdCheck();
|
|
||||||
} else {
|
|
||||||
qDebug() << "Search id changed!";
|
|
||||||
m_controller->finishSearchIdCheck();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
qWarning() << "SoftWareCenter dbus called failed!" << reply.error();
|
|
||||||
sendErrorMsg(QString("SoftWareCenter dbus called failed!") + reply.error().message());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
QMetaObject::invokeMethod(m_appSearchTask, "searchFinished", Q_ARG(size_t, m_currentSearchId));
|
||||||
}
|
}
|
||||||
|
|
||||||
QMetaObject::invokeMethod(m_appSearchTask, "searchFinished", Q_ARG(size_t, m_currentSearchId));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppSearchWorker::sendErrorMsg(const QString &msg)
|
void AppSearchWorker::sendErrorMsg(const QString &msg)
|
||||||
|
|
|
@ -53,10 +53,14 @@ public:
|
||||||
void stop();
|
void stop();
|
||||||
bool isSearching();
|
bool isSearching();
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void dbusCallBack(QDBusPendingCallWatcher *call);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ApplicationInfo m_appinfo;
|
ApplicationInfo m_appinfo;
|
||||||
SearchController m_searchController;
|
SearchController m_searchController;
|
||||||
QThreadPool *m_pool = nullptr;
|
QThreadPool *m_pool = nullptr;
|
||||||
|
QThread *m_dbusCallBackThread = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AppSearchWorker : public QRunnable
|
class AppSearchWorker : public QRunnable
|
||||||
|
|
Loading…
Reference in New Issue