mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-01-17 19:38:09 +00:00
- Add feedback on errors - More generic import requests - Replace storing password by a native popup that ask passwork when needed - Store passwords in settings file - Import Feedback in advanced settings tab - Use English as default translator if no translations are found - Add OpenSSL packaging for Windows to deal with Qt connections - Add option to overwrite plugin if exists - Plugin load/unload managment. Hot-Dynamic load of plugins. Safely test the loaded plugin - Set plugin data with default value when all GUI items are loaded - Rewrite folder priority - Add filename info from pluginloader - Add plugin versionning - Specify inputs for saving - Copy desktop headers in OUTPUT to be used by external projects - Add a plugins folder auto-managed by cmake - Remove obsolete contact api submodule - Clean plugin example - Add specific behaviour for plugin type : inputs have been splitted by Capability. - Update save/load to be more generic and add clean function for configurations - Instantiate Importer List model - Add IDE integration for plugins - Set input fields to be dependent of capability - Change signals interface to take account capability
157 lines
5.3 KiB
C++
157 lines
5.3 KiB
C++
#include "DataAPI.hpp"
|
|
#include "NetworkAPI.hpp"
|
|
#include "Plugin.hpp"
|
|
|
|
#include <QInputDialog>
|
|
#include <QPluginLoader>
|
|
#include <linphone++/proxy_config.hh>
|
|
|
|
DataAPI::DataAPI(Plugin *plugin, void * core, QPluginLoader * pluginLoader) :PluginDataAPI(plugin, core, pluginLoader){
|
|
auto proxyConfig = static_cast<linphone::Core*>(mLinphoneCore)->getDefaultProxyConfig();
|
|
QVariantMap account;
|
|
std::string domain;
|
|
if(proxyConfig)
|
|
domain = proxyConfig->getDomain();
|
|
else{
|
|
proxyConfig = static_cast<linphone::Core*>(mLinphoneCore)->createProxyConfig();
|
|
if(proxyConfig)
|
|
domain = proxyConfig->getDomain();
|
|
if(domain == "")
|
|
domain = "sip.linphone.org";
|
|
}
|
|
mInputFields[CONTACTS]["SIP_Domain"] = QString::fromLocal8Bit(domain.c_str(), int(domain.size()));
|
|
}
|
|
|
|
QString DataAPI::getUrl()const{
|
|
return mInputFields[CONTACTS]["URL"].toString();
|
|
}
|
|
QString DataAPI::getDomain()const{
|
|
return mInputFields[CONTACTS]["SIP_Domain"].toString();
|
|
}
|
|
QString DataAPI::getUsername()const{
|
|
return mInputFields[CONTACTS]["Username"].toString();
|
|
}
|
|
QString DataAPI::getPassword()const{
|
|
return mInputFields[CONTACTS]["Password"].toString();
|
|
}
|
|
QString DataAPI::getKey()const{
|
|
return mInputFields[CONTACTS]["Key"].toString();
|
|
}
|
|
bool DataAPI::isEnabled()const{
|
|
return mInputFields[CONTACTS]["enabled"].toInt()>0;
|
|
}
|
|
void DataAPI::setPassword(const QString &password){
|
|
mInputFields[CONTACTS]["Password"] = password;
|
|
}
|
|
|
|
bool DataAPI::isValid(const bool &pRequestData, QString * pError){
|
|
QStringList errors;
|
|
if( getDomain().isEmpty())
|
|
errors << "Domain is empty.";
|
|
if( getUrl().isEmpty())
|
|
errors << "Url is empty.";
|
|
if( getUsername().isEmpty())
|
|
errors << "Username is empty.";
|
|
if( getPassword().isEmpty() && getKey().isEmpty()){
|
|
if(pRequestData)
|
|
setPassword(QInputDialog::getText(nullptr, "Linphone example Address Book","Password",QLineEdit::EchoMode::Password));
|
|
if( getPassword().isEmpty())
|
|
errors << "Password is empty.";
|
|
}
|
|
if( errors.size() > 0){
|
|
if(pError)
|
|
*pError = "Data is invalid : " + errors.join(" ");
|
|
return false;
|
|
}else
|
|
return true;
|
|
}
|
|
|
|
QMap<PluginDataAPI::PluginCapability, QVariantMap> DataAPI::getInputFieldsToSave(const PluginCapability& capability){// Remove Password from config file
|
|
QMap<PluginCapability, QVariantMap> data = mInputFields;
|
|
data[CONTACTS].remove("Password");
|
|
return data;
|
|
}
|
|
|
|
void DataAPI::run(const PluginCapability& actionType){
|
|
if( actionType == PluginCapability::CONTACTS){
|
|
NetworkAPI * network = new NetworkAPI(this);
|
|
QObject::connect(this, &PluginDataAPI::dataReceived, network, &DataAPI::deleteLater);
|
|
network->startRequest();
|
|
}
|
|
}
|
|
//-----------------------------------------------------------------------------------------
|
|
|
|
void DataAPI::parse(const QByteArray& p_data){
|
|
QVector<QMultiMap<QString,QString> > parsedData;
|
|
QString statusText;
|
|
if(!p_data.isEmpty()) {
|
|
QJsonDocument doc = QJsonDocument::fromJson(p_data);
|
|
QJsonObject responses = doc.object();
|
|
QString status = responses["status"].toString();
|
|
QString comment = responses["comment"].toString();
|
|
if( responses.size() == 0){
|
|
statusText = "Contacts are not in Json format.";
|
|
}else if( status != "OK"){
|
|
statusText = status;
|
|
if( statusText.isEmpty())
|
|
statusText = "Cannot parse the request: The URL may not be valid.";
|
|
if(!comment.isEmpty())
|
|
statusText += " "+comment;
|
|
if( mInputFields[CONTACTS].contains("Key")){
|
|
QVariantMap newInputs = mInputFields[CONTACTS];
|
|
newInputs.remove("Key");// Reset key on error
|
|
setInputFields(CONTACTS, newInputs);
|
|
}
|
|
}else{
|
|
if( responses.contains("key")){
|
|
QVariantMap newInputs = mInputFields[CONTACTS];
|
|
newInputs["Key"] = responses["key"].toString();
|
|
setInputFields(CONTACTS, newInputs);
|
|
}
|
|
if( responses.contains("contacts")){
|
|
QJsonArray contacts = responses["contacts"].toArray();
|
|
int contactCount = 0;
|
|
for(int i = 0 ; i < contacts.size() ; ++i){
|
|
QMultiMap<QString, QString> cardData;
|
|
QJsonObject contact = contacts[i].toObject();
|
|
QString phoneNumber = contact["number"].toString();
|
|
QStringList name;
|
|
bool haveData = false;
|
|
QString company = contact["company"].toString();
|
|
|
|
|
|
if( contact.contains("firstname") && contact["firstname"].toString() != "")
|
|
name << contact["firstname"].toString();
|
|
if( contact.contains("surname") && contact["surname"].toString() != "")
|
|
name << contact["surname"].toString();
|
|
|
|
if(name.size() > 0){
|
|
QString username = name.join(" ");
|
|
cardData.insert("displayName", username);
|
|
}
|
|
if(!phoneNumber.isEmpty()) {
|
|
cardData.insert("phoneNumber", phoneNumber);
|
|
cardData.insert("sipUsername", phoneNumber);
|
|
haveData = true;
|
|
}
|
|
if(!company.isEmpty())
|
|
cardData.insert("organization", company);
|
|
if( haveData){
|
|
cardData.insert("sipDomain", mInputFields[CONTACTS]["SIP_Domain"].toString());
|
|
parsedData.push_back(cardData);
|
|
++contactCount;
|
|
}
|
|
}
|
|
QString messageStatus = QString::number(contactCount) +" contact"+(contactCount>1?"s":"")+" have been synchronized at "+QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
|
|
emit message(QtInfoMsg, messageStatus);
|
|
qInfo() << messageStatus;
|
|
}
|
|
}
|
|
}else
|
|
statusText = "Cannot parse the request: The URL may not be valid.";
|
|
if( !statusText.isEmpty())
|
|
emit message(QtWarningMsg, statusText);
|
|
emit dataReceived(PluginDataAPI::CONTACTS, parsedData);
|
|
}
|
|
|
|
|