Я знаю, что есть много тем, касающихся того, как использовать файл заголовка для нескольких исходных файлов, к сожалению, я ничего не нашел, что заставило бы меня решить это для моего использования. < /p>
Как известно У меня есть один файл заголовка (oauth2_google.h): < /p>
class GoogleSSO : public QObject
{
Q_OBJECT
Q_PROPERTY(QByteArray loginData READ loginData WRITE setLoginData NOTIFY loginDataChanged)
public:
explicit GoogleSSO(QObject *parent = nullptr);
virtual ~GoogleSSO(); // dont even know what is this, maybe someone can explain?
// triggered by QML (only ready)
QByteArray loginData() const { return m_loginData; }
// triggered by QML: loginData = ""; // or by C++: setLoginData(string)
void setLoginData(const QByteArray &newData) { ... }
public slots:
Q_INVOKABLE void authenticate(); // Invoked externally to initiate
private:
QOAuth2AuthorizationCodeFlow *google;
QByteArray m_loginData;
QString generateRandomString() { ... }
QString replyMessage = "LOGIN FINISHED OK!";
signals:
void loginDataChanged(/*QByteArray*/);
};
< /code>
и исходный файл (oauth2_google.cpp): < /p>
#include "oauth2_google.h"
GoogleSSO::GoogleSSO(QObject *parent) : QObject(parent)
{
this->google = new QOAuth2AuthorizationCodeFlow(this);
this->google->setScope("https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile");
this->google->setClientIdentifier("........");
....
this->google->setClientIdentifierSharedKey("..........");
QObject::connect(this->google, &QOAuth2AuthorizationCodeFlow::authorizeWithBrowser, &QDesktopServices::openUrl);
// set the webpage content to show the user
QOAuthHttpServerReplyHandler *replyHandler = new QOAuthHttpServerReplyHandler(port, this);
replyHandler->setCallbackText(replyMessage); // this is from header file
this->google->setReplyHandler(replyHandler);
// HANDLER WHEN LOGGIN FAILS
QObject::connect(this->google, &QOAuth2AuthorizationCodeFlow::authorizationCallbackReceived, this, [&](const QVariantMap &data) {
QString error = data.value("error").toString();
if (!error.isEmpty()) {
....
setLoginData(....);
// QUESTION #2... in case of login failed, i want to change the replyMessage in header file... how do I do it from here?
QString replyMessage = "LOGIN FAILED";
}
});
// HANDLER WHEN LOGGIN SUCCEED
QObject::connect(this->google, &QOAuth2AuthorizationCodeFlow::granted, this, [this](){
// send the token to receive needed info
QNetworkRequest req; req.setUrl(QUrl("https://people.googleapis.com/v1/people/me?personFields=emailAddresses,photos,names&access_token=" + this->google->token()));
QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkReply *rep = manager->get(req);
QObject::connect(manager, &QNetworkAccessManager::finished, this, [this](QNetworkReply *reply) {
QByteArray serverReply = reply->readAll();
...
setLoginData(....);
reply->deleteLater();
});
});
}
GoogleSSO::~GoogleSSO() { delete this->google; }
void GoogleSSO::authenticate() { this->google->grant(); }
< /code>
На данный момент это работает отлично ...
Однако сейчас проблема в том, что мне нужно ввести также вход в Facebook Oauth в приложении, поэтому я хочу иметь отдельный источник Файл (потому что я буду иметь дело с каким -то сутфом там по -разному), но как можно больше я хотел бы сохранить один общий файл заголовка для обоих исходных файлов ... < /p>
Итак, давайте рассмотрим, что у меня есть Второй исходный файл (oauth2_firebase.cpp): < /p>
FacebookSSO::FacebookSSO(QObject *parent) : QObject(parent)
{
this->facebook = new QOAuth2AuthorizationCodeFlow(this);
this->facebook->setScope("public_profile,email");
this->facebook->setClientIdentifier("........");
....
this->facebook->setClientIdentifierSharedKey("..........");
QObject::connect(this->facebook, &QOAuth2AuthorizationCodeFlow::authorizeWithBrowser, &QDesktopServices::openUrl);
// set the webpage content to show the user
QOAuthHttpServerReplyHandler *replyHandler = new QOAuthHttpServerReplyHandler(port, this);
replyHandler->setCallbackText(replyMessage); // this is from header file
this->facebook->setReplyHandler(replyHandler);
// HANDLER WHEN LOGGIN FAILS
QObject::connect(this->facebook, &QOAuth2AuthorizationCodeFlow::authorizationCallbackReceived, this, [&](const QVariantMap &data) {
QString error = data.value("error").toString();
if (!error.isEmpty()) {
....
setLoginData(....);
// QUESTION #2... in case of login failed, i want to change the replyMessage in header file... how do I do it from here? - same as in first source
QString replyMessage = "LOGIN FAILED";
}
});
// HANDLER WHEN LOGGIN SUCCEED
QObject::connect(this->facebook, &QOAuth2AuthorizationCodeFlow::granted, this, [this](){
// send the token to receive needed info
QNetworkRequest req; req.setUrl(QUrl("https://graph.facebook.com/me?fields=id,name,email,picture.width(320).height(320)&access_token=" + this->facebook->token()));
QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkReply *rep = manager->get(req);
QObject::connect(manager, &QNetworkAccessManager::finished, this, [this](QNetworkReply *reply) {
QByteArray serverReply = reply->readAll();
...
setLoginData(....);
reply->deleteLater();
});
});
}
FacebookSSO::~FacebookSSO() { delete this->facebook; }
void FacebookSSO::authenticate() { this->facebook->grant(); }
Question #1: how do I modify header and both sorce files to be able to achieve what I want (one header file, two source files)
of course considering renaming authenticate() functions for each, so one will be googleAuthenticate() while second facebookAuthenticate()
both functions should change one same variable loginData from header file
Question #2 (optional): how to handle replyMessage string
i think better here would be to declare and set two string sin header ("replyMessagePASS" and "replyMessageFAIL") and Каким-то образом переключитесь между ними, позвонив: ReplyHandler-> setCallbackText (ReplyMessagePass) < /code>
или
Я знаю, что есть много тем, касающихся того, как использовать файл заголовка для нескольких исходных файлов, к сожалению, я ничего не нашел, что заставило бы меня решить это для моего использования. < /p> Как известно У меня есть один файл заголовка (oauth2_google.h): < /p> [code]class GoogleSSO : public QObject { Q_OBJECT Q_PROPERTY(QByteArray loginData READ loginData WRITE setLoginData NOTIFY loginDataChanged)
public: explicit GoogleSSO(QObject *parent = nullptr); virtual ~GoogleSSO(); // dont even know what is this, maybe someone can explain?
// set the webpage content to show the user QOAuthHttpServerReplyHandler *replyHandler = new QOAuthHttpServerReplyHandler(port, this); replyHandler->setCallbackText(replyMessage); // this is from header file this->google->setReplyHandler(replyHandler);
// QUESTION #2... in case of login failed, i want to change the replyMessage in header file... how do I do it from here? QString replyMessage = "LOGIN FAILED"; }
});
// HANDLER WHEN LOGGIN SUCCEED QObject::connect(this->google, &QOAuth2AuthorizationCodeFlow::granted, this, [this](){
// send the token to receive needed info QNetworkRequest req; req.setUrl(QUrl("https://people.googleapis.com/v1/people/me?personFields=emailAddresses,photos,names&access_token=" + this->google->token())); QNetworkAccessManager *manager = new QNetworkAccessManager(); QNetworkReply *rep = manager->get(req); QObject::connect(manager, &QNetworkAccessManager::finished, this, [this](QNetworkReply *reply) {
void GoogleSSO::authenticate() { this->google->grant(); } < /code> На данный момент это работает отлично ... Однако сейчас проблема в том, что мне нужно ввести также вход в Facebook Oauth в приложении, поэтому я хочу иметь отдельный источник Файл (потому что я буду иметь дело с каким -то сутфом там по -разному), но как можно больше я хотел бы сохранить один общий файл заголовка для обоих исходных файлов ... < /p> Итак, давайте рассмотрим, что у меня есть Второй исходный файл (oauth2_firebase.cpp): < /p> FacebookSSO::FacebookSSO(QObject *parent) : QObject(parent) { this->facebook = new QOAuth2AuthorizationCodeFlow(this);
// set the webpage content to show the user QOAuthHttpServerReplyHandler *replyHandler = new QOAuthHttpServerReplyHandler(port, this); replyHandler->setCallbackText(replyMessage); // this is from header file this->facebook->setReplyHandler(replyHandler);
// QUESTION #2... in case of login failed, i want to change the replyMessage in header file... how do I do it from here? - same as in first source QString replyMessage = "LOGIN FAILED"; }
});
// HANDLER WHEN LOGGIN SUCCEED QObject::connect(this->facebook, &QOAuth2AuthorizationCodeFlow::granted, this, [this](){
// send the token to receive needed info QNetworkRequest req; req.setUrl(QUrl("https://graph.facebook.com/me?fields=id,name,email,picture.width(320).height(320)&access_token=" + this->facebook->token())); QNetworkAccessManager *manager = new QNetworkAccessManager(); QNetworkReply *rep = manager->get(req); QObject::connect(manager, &QNetworkAccessManager::finished, this, [this](QNetworkReply *reply) {
void FacebookSSO::authenticate() { this->facebook->grant(); } [/code] [b]Question #1:[/b] how do I modify header and both sorce files to be able to achieve what I want (one header file, two source files) [list] [*]of course considering renaming authenticate() functions for each, so one will be googleAuthenticate() while second facebookAuthenticate() [*]both functions should change one same variable loginData from header file [/list] [b]Question #2 (optional):[/b] how to handle replyMessage string
i think better here would be to declare and set two string sin header ("replyMessagePASS" and "replyMessageFAIL") and Каким-то образом переключитесь между ними, позвонив: ReplyHandler-> setCallbackText (ReplyMessagePass) < /code> или [code]replyHandler->setCallbackText(replyMessageFAIL)[/code] from lambdas ... если это даже возможно? Strong> Что на самом деле делает ~ googlesso () ? Я думаю, это какой -то разрушитель, но как это работает?
Я пытаюсь использовать файлы заголовков и их исходные файлы, но когда я пытаюсь получить доступ к классам внутри них, у меня возникают проблемы. Вот код моего файла заголовка:
Предположим, у нас есть две карты с некоторыми общими ключами, но разными значениями. Я хотел бы перебрать «пересечение» двух карт, где ключи одинаковы. Затем я хотел бы выполнить функцию преобразования f(key, value_in_map1, value_in_map2).
Я пытаюсь изучить C#, имея опыт работы с C++, но не могу понять, как связать два исходных файла вместе. У меня есть относительно простая программа под названием test.cs и main.cs. Все, что я хочу сделать, это написать в main.cs: