Bitcoin

bitcoin uiInterface

tox/toxcore.cpp

#include <ui_interface.h>

static void friend_request_cb(Tox *tox, const uint8_t *public_key, const uint8_t *message, size_t length, void *user_data)
{
    // ...

    uiInterface.FriendRequest(pubkeyHex, req->msg);
}

ui_interface.h

class CClientUIInterface
{
    // ...

    ADD_SIGNALS_DECL_WRAPPER(FriendRequest, void, const std::string&, const std::string&);
};

ui_interface.cpp

struct UISignals {
    // ...
    
    boost::signals2::signal<CClientUIInterface::FriendRequestSig> FriendRequest;
} g_ui_signals;

ADD_SIGNALS_IMPL_WRAPPER(FriendRequest);

void CClientUIInterface::FriendRequest(const std::string& pubkey, const std::string& msg) { return g_ui_signals.FriendRequest(pubkey, msg); }

interfaces/node.h

class Node
{
    // ...

    //! Register handler for tox friend request.
    using FriendRequestFn = std::function<void(const std::string& pubkey, const std::string& msg)>;
    virtual std::unique_ptr<Handler> handleFriendRequest(FriendRequestFn fn) = 0;
};

interfaces/node.cpp

class NodeImpl : public Node
{
    // ...

    std::unique_ptr<Handler> handleFriendRequest(FriendRequestFn fn) override
    {
        return MakeHandler(
            ::uiInterface.FriendRequest_connect([fn](const std::string& pubkey, const std::string& msg) {
                fn(pubkey, msg);
            }));
    }
};

qt/clientmode.h

class ClientModel : public QObject
{
    // ...

Q_SIGNALS:
    void friendRequest(const QString& pubkey, const QString& msg);

public Q_SLOTS:
    void getFriendRequest(const QString& pubkey, const QString& msg);

private:
    std::unique_ptr<interfaces::Handler> m_handler_friend_request;
};

qt/clientmode.cpp

void ClientModel::getFriendRequest(const QString& pubkey, const QString& msg)
{
    Q_EMIT friendRequest(pubkey, msg);
}

static void FriendRequest(ClientModel* clientModel, const std::string& pubkey, const std::string& msg)
{
    bool invoked = QMetaObject::invokeMethod(clientModel, "getFriendRequest", Qt::QueuedConnection,
                                    Q_ARG(QString, QString::fromStdString(pubkey)),
                                    Q_ARG(QString, QString::fromStdString(msg)));
    assert(invoked);
}

void ClientModel::subscribeToCoreSignals()
{
    // ...

    m_handler_friend_request = m_node.handleFriendRequest(std::bind(FriendRequest, this, std::placeholders::_1, std::placeholders::_2));
}

void ClientModel::unsubscribeFromCoreSignals()
{
    // ...

    m_handler_friend_request->disconnect();
}

qt/managementpage.h

class ManagementPage : public QWidget
{
    // ...

private Q_SLOTS:
    void onFriendRequest(const QString& pubkey, const QString& msg);
};

qt/managementpage.cpp

void ManagementPage::setClientModel(ClientModel *_clientModel)
{
    // ...

    if (_clientModel) {
        connect(_clientModel, &ClientModel::friendRequest, this, &ManagementPage::onFriendRequest);
    }
}

void ManagementPage::onFriendRequest(const QString& pubkey, const QString& msg)
{
    // ...
}