linphone-desktop/plugins/example/src/DataAPI.cpp
Julien Wadel 5eba9a5ece Create a plugin system
- 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
2021-01-13 21:04:23 +01:00

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);
}