174 lines · 7.1 KB · C++
RawDownload
////  GlobalServicesScriptingInterface.cpp//  interface/src/scripting////  Created by Thijs Wenker on 9/10/14.//  Copyright 2014 High Fidelity, Inc.////  Distributed under the Apache License, Version 2.0.//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html// #include "AccountManager.h"#include "Application.h"#include "ResourceCache.h"#include "XmppClient.h" #include "GlobalServicesScriptingInterface.h" GlobalServicesScriptingInterface::GlobalServicesScriptingInterface() {    AccountManager& accountManager = AccountManager::getInstance();    connect(&accountManager, &AccountManager::usernameChanged, this, &GlobalServicesScriptingInterface::myUsernameChanged);    connect(&accountManager, &AccountManager::logoutComplete, this, &GlobalServicesScriptingInterface::loggedOut);#ifdef HAVE_QXMPP    const XmppClient& xmppClient = XmppClient::getInstance();    connect(&xmppClient, &XmppClient::joinedPublicChatRoom, this, &GlobalServicesScriptingInterface::connected);    connect(&xmppClient, &XmppClient::joinedPublicChatRoom, this, &GlobalServicesScriptingInterface::onConnected);    const QXmppClient& qxmppClient = XmppClient::getInstance().getXMPPClient();    connect(&qxmppClient, &QXmppClient::messageReceived, this, &GlobalServicesScriptingInterface::messageReceived);#endif // HAVE_QXMPP     _downloading = false;    connect(Application::getInstance(), &Application::renderingInWorldInterface, this, &GlobalServicesScriptingInterface::checkDownloadInfo);} GlobalServicesScriptingInterface::~GlobalServicesScriptingInterface() {    AccountManager& accountManager = AccountManager::getInstance();    disconnect(&accountManager, &AccountManager::usernameChanged, this, &GlobalServicesScriptingInterface::myUsernameChanged);    disconnect(&accountManager, &AccountManager::logoutComplete, this, &GlobalServicesScriptingInterface::loggedOut);#ifdef HAVE_QXMPP    const XmppClient& xmppClient = XmppClient::getInstance();    disconnect(&xmppClient, &XmppClient::joinedPublicChatRoom, this, &GlobalServicesScriptingInterface::connected);    disconnect(&xmppClient, &XmppClient::joinedPublicChatRoom, this, &GlobalServicesScriptingInterface::onConnected);    const QXmppClient& qxmppClient = XmppClient::getInstance().getXMPPClient();    disconnect(&qxmppClient, &QXmppClient::messageReceived, this, &GlobalServicesScriptingInterface::messageReceived);    const QXmppMucRoom* publicChatRoom = XmppClient::getInstance().getPublicChatRoom();    disconnect(publicChatRoom, &QXmppMucRoom::participantsChanged, this, &GlobalServicesScriptingInterface::participantsChanged);#endif // HAVE_QXMPP} void GlobalServicesScriptingInterface::onConnected() {#ifdef HAVE_QXMPP    const QXmppMucRoom* publicChatRoom = XmppClient::getInstance().getPublicChatRoom();    connect(publicChatRoom, &QXmppMucRoom::participantsChanged, this, &GlobalServicesScriptingInterface::participantsChanged, Qt::UniqueConnection);#endif // HAVE_QXMPP} void GlobalServicesScriptingInterface::participantsChanged() {#ifdef HAVE_QXMPP    emit GlobalServicesScriptingInterface::onlineUsersChanged(this->getOnlineUsers());#endif // HAVE_QXMPP} GlobalServicesScriptingInterface* GlobalServicesScriptingInterface::getInstance() {    static GlobalServicesScriptingInterface sharedInstance;    return &sharedInstance;} bool GlobalServicesScriptingInterface::isConnected() {#ifdef HAVE_QXMPP    return XmppClient::getInstance().getXMPPClient().isConnected();#else    return false;#endif // HAVE_QXMPP} QScriptValue GlobalServicesScriptingInterface::chat(const QString& message) {#ifdef HAVE_QXMPP    if (XmppClient::getInstance().getXMPPClient().isConnected()) {        const QXmppMucRoom* publicChatRoom = XmppClient::getInstance().getPublicChatRoom();        QXmppMessage messageObject;        messageObject.setTo(publicChatRoom->jid());        messageObject.setType(QXmppMessage::GroupChat);        messageObject.setBody(message);        return XmppClient::getInstance().getXMPPClient().sendPacket(messageObject);    }#endif // HAVE_QXMPP    return false;} QString GlobalServicesScriptingInterface::getMyUsername() {    return AccountManager::getInstance().getAccountInfo().getUsername();} QStringList GlobalServicesScriptingInterface::getOnlineUsers() {#ifdef HAVE_QXMPP    if (XmppClient::getInstance().getXMPPClient().isConnected()) {        QStringList usernames;        const QXmppMucRoom* publicChatRoom = XmppClient::getInstance().getPublicChatRoom();        foreach(const QString& participant, XmppClient::getInstance().getPublicChatRoom()->participants()) {            usernames.append(participant.right(participant.count() - 1 - publicChatRoom->jid().count()));        }        return usernames;    }#endif // HAVE_QXMPP    return QStringList();} void GlobalServicesScriptingInterface::loggedOut() {    emit GlobalServicesScriptingInterface::disconnected(QString("logout"));} #ifdef HAVE_QXMPPvoid GlobalServicesScriptingInterface::messageReceived(const QXmppMessage& message) {    if (message.type() != QXmppMessage::GroupChat) {        return;    }    const QXmppMucRoom* publicChatRoom = XmppClient::getInstance().getPublicChatRoom();    emit GlobalServicesScriptingInterface::incomingMessage(message.from().right(message.from().count() - 1 - publicChatRoom->jid().count()), message.body());}#endif // HAVE_QXMPP  DownloadInfoResult::DownloadInfoResult() :    downloading(QList<float>()),    pending(0.0f){} QScriptValue DownloadInfoResultToScriptValue(QScriptEngine* engine, const DownloadInfoResult& result) {    QScriptValue object = engine->newObject();     QScriptValue array = engine->newArray(result.downloading.count());    for (int i = 0; i < result.downloading.count(); i += 1) {        array.setProperty(i, result.downloading[i]);    }     object.setProperty("downloading", array);    object.setProperty("pending", result.pending);    return object;} void DownloadInfoResultFromScriptValue(const QScriptValue& object, DownloadInfoResult& result) {    QList<QVariant> downloading = object.property("downloading").toVariant().toList();    result.downloading.clear();    for (int i = 0; i < downloading.count(); i += 1) {        result.downloading.append(downloading[i].toFloat());    }     result.pending = object.property("pending").toVariant().toFloat();} DownloadInfoResult GlobalServicesScriptingInterface::getDownloadInfo() {    DownloadInfoResult result;    foreach(Resource* resource, ResourceCache::getLoadingRequests()) {        result.downloading.append(resource->getProgress() * 100.0f);    }    result.pending = ResourceCache::getPendingRequestCount();    return result;} void GlobalServicesScriptingInterface::checkDownloadInfo() {    DownloadInfoResult downloadInfo = getDownloadInfo();    bool downloading = downloadInfo.downloading.count() > 0 || downloadInfo.pending > 0;     // Emit signal if downloading or have just finished.    if (downloading || _downloading) {        _downloading = downloading;        emit downloadInfoChanged(downloadInfo);    }} void GlobalServicesScriptingInterface::updateDownloadInfo() {    emit downloadInfoChanged(getDownloadInfo());}