// This file is part of Friendiqa // https://git.friendi.ca/lubuwest/Friendiqa // Copyright (C) 2017 Marco R. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // In addition, as a special exception, the copyright holders give // permission to link the code of portions of this program with the // OpenSSL library under certain conditions as described in each // individual source file, and distribute linked combinations including // the two. // // You must obey the GNU General Public License in all respects for all // of the code used other than OpenSSL. If you modify file(s) with this // exception, you may extend this exception to your version of the // file(s), but you are not obligated to do so. If you do not wish to do // so, delete this exception statement from your version. If you delete // this exception statement from all source files in the program, then // also delete it here. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "updatenews.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include "AndroidNative/systemdispatcher.h" UPDATENEWS *UPDATENEWS::instance() { static UPDATENEWS udn; return &udn; } UPDATENEWS::UPDATENEWS(QObject *parent) : QObject(parent) { } void UPDATENEWS::setUrl(QString url) { if (url!=m_url) { m_url = url; xhr.setUrl(url); emit urlChanged(m_url); } } void UPDATENEWS::setDatabase() { static QQmlEngine qe; QString db_url=qe.offlineStorageDatabaseFilePath("Friendiqa"); m_db = QSqlDatabase::addDatabase("QSQLITE"); m_db.setDatabaseName(QUrl("file://"+db_url+".sqlite").toLocalFile()); //qDebug() << db_url; if (!m_db.open()) { qDebug() << "Error: connection with database fail " << m_db.lastError(); } } void UPDATENEWS::login() { QSqlQuery query("SELECT * FROM config WHERE isActive=0",m_db); while (query.next()) { username = query.value(1).toString(); QByteArray bpassword=query.value(2).toByteArray(); QString password=QByteArray::fromBase64(bpassword); m_login=username+":"+password ; xhr.setLogin(m_login); m_url=query.value(0).toString(); xhr.setUrl(m_url); m_imagedir=query.value(3).toString(); xhr.setImagedir(m_imagedir); QString isActive=query.value(7).toString(); } //m_updateInterval=query.value(5).toInt(); QSqlQuery syncquery("SELECT * FROM globaloptions",m_db); // QSqlQuery delquery("DELETE FROM globaloptions WHERE k='sync_interval'",m_db); // delquery.exec(); m_updateInterval=0; syncindex=0; synclist.clear(); //QSqlQuery syncquery("SELECT * FROM globaloptions WHERE k like 'sync_%' AND v=1",m_db); while (syncquery.next()){ if (syncquery.value(0).toString()=="syncinterval"){ m_updateInterval=syncquery.value(1).toInt(); } if (syncquery.value(0).toString().left(5)=="sync_" && syncquery.value(1).toInt()==1){ synclist.append(syncquery.value(0).toString()); //qDebug() << " sync " << syncquery.value(0).toString() << " " < newcontacts=findNewContacts(news); //qDebug()<< "new contacts count " << newcontacts.size(); if (newcontacts.size()>0){ updateContacts(newcontacts); startImagedownload(); } else { if(m_updateInterval!=0){ syncindex+=1; startsync(); } } } else { qDebug()<< "Friendiqa updatenews error " << serverreply; emit this->error(m_api,QTextCodec::codecForName("utf-8")->toUnicode(serverreply)); syncindex+=1; startsync(); } } } void UPDATENEWS::updateImageLocation(QString downloadtype,QString imageurl, QString filename, int index){ if (downloadtype=="contactlist"){ QSqlQuery testquery("SELECT profile_image FROM contacts WHERE profile_image_url ='"+imageurl+ "' AND username = '" +username+"'",m_db); testquery.first(); //qDebug()<< "update imageurl for " < UPDATENEWS::findNewContacts(QJsonDocument news){ QSqlQuery query("SELECT profile_image_url FROM contacts",m_db); QList imageurls; while (query.next()){ imageurls.append(query.value(0).toString()); } QList newcontacts; //qDebug()<<"updatenews findcontacts news count "< contacts){ qint64 currentTime =QDateTime::currentMSecsSinceEpoch(); for (int i=0; i < contacts.count();i++){ QJsonValue contact=contacts[i]; QSqlQuery query(m_db); try{ //qDebug() << "updatecontact " << contact["screen_name"]; QSqlQuery testquery("SELECT url FROM contacts WHERE username='"+ username +"' AND url='" + contact["url"].toString() +"'",m_db); if (testquery.first()){ query.prepare("UPDATE contacts SET id=?, name=?, screen_name=?, location=?,imageAge=?," "profile_image_url=?, description=?, protected=?, followers_count=?," "friends_count=?, created_at=?, favourites_count=?, utc_offset=?, time_zone=?, statuses_count=?," "following=?, verified=?, statusnet_blocking=?, notifications=?, statusnet_profile_url=?, cid=?, network=?, timestamp=? " " WHERE username='"+ username +"' AND url='" + contact["url"].toString() +"'"); query.bindValue(0, contact["id"].toInt()); query.bindValue(1, contact["name"].toString().toUtf8().toBase64()); query.bindValue(2, contact["screen_name"]); query.bindValue(3, contact["location"]); query.bindValue(4, currentTime); query.bindValue(5, contact["profile_image_url"].toString().section('?',0,0)); if(contact["description"].isNull() ){query.bindValue(6,"");}else{query.bindValue(6, contact["description"].toString().toUtf8().toBase64());} query.bindValue(7,contact["protected"].toBool()); query.bindValue(8,contact["followers_count"].toInt()); query.bindValue(9,contact["friends_count"].toInt()); QString sourcedate=contact["created_at"].toString(); QString formateddate=sourcedate.mid(0,3)+", "+sourcedate.mid(8,3)+sourcedate.mid(4,3)+sourcedate.mid(25,5)+sourcedate.mid(10,15); query.bindValue(10,QDateTime::fromString(formateddate,Qt::RFC2822Date).toMSecsSinceEpoch() ); query.bindValue(11,contact["favorites_count"].toInt()); query.bindValue(12,contact["utc_offset"].toInt()); query.bindValue(13,contact["time_zone"].toString()); query.bindValue(14,contact["statuses_count"].toInt()); query.bindValue(15,contact["following"].toBool()); query.bindValue(16,contact["verfied"].toBool()); query.bindValue(17,contact["statusnet_blocking"].toBool()); query.bindValue(18,contact["notifications"].toBool()); query.bindValue(19,contact["statusnet_profile_url"]); query.bindValue(20,contact["cid"].toInt()); query.bindValue(21,contact["network"]); qint64 timestamp=0; QString timestamphelper=contact["profile_image_url"].toString(); try {timestamp=timestamphelper.mid(timestamphelper.indexOf("?ts")+4,timestamphelper.length()).toUInt();} catch(...){} query.bindValue(22,timestamp); } else{ query.prepare("INSERT INTO contacts (username, id, name, screen_name, location,imageAge," "profile_image_url, description, profile_image, url, protected, followers_count," "friends_count, created_at, favourites_count, utc_offset, time_zone, statuses_count," "following, verified, statusnet_blocking, notifications, statusnet_profile_url, cid, network, isFriend, timestamp)" "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); query.bindValue(0,username); query.bindValue(1, contact["id"].toInt()); query.bindValue(2, contact["name"].toString().toUtf8().toBase64()); query.bindValue(3, contact["screen_name"]); query.bindValue(4, contact["location"]); query.bindValue(5, currentTime); query.bindValue(6, contact["profile_image_url"].toString().section('?',0,0)); if(contact["description"].isNull() ){query.bindValue(7,"");}else{query.bindValue(7, contact["description"].toString().toUtf8().toBase64());} query.bindValue(8,"none"); query.bindValue(9, contact["url"].toString()); query.bindValue(10,contact["protected"].toBool()); query.bindValue(11,contact["followers_count"].toInt()); query.bindValue(12,contact["friends_count"].toInt()); QString sourcedate=contact["created_at"].toString(); QString formateddate=sourcedate.mid(0,3)+", "+sourcedate.mid(8,3)+sourcedate.mid(4,3)+sourcedate.mid(25,5)+sourcedate.mid(10,15); query.bindValue(13,QDateTime::fromString(formateddate,Qt::RFC2822Date).toMSecsSinceEpoch() ); query.bindValue(14,contact["favorites_count"].toInt()); query.bindValue(15,contact["utc_offset"].toInt()); query.bindValue(16,contact["time_zone"].toString()); query.bindValue(17,contact["statuses_count"].toInt()); query.bindValue(18,contact["following"].toBool()); query.bindValue(19,contact["verfied"].toBool()); query.bindValue(20,contact["statusnet_blocking"].toBool()); query.bindValue(21,contact["notifications"].toBool()); query.bindValue(22,contact["statusnet_profile_url"]); query.bindValue(23,contact["cid"].toInt()); query.bindValue(24,contact["network"]); query.bindValue(25, 0); qint64 timestamp=0; QString timestamphelper=contact["profile_image_url"].toString(); try {timestamp=timestamphelper.mid(timestamphelper.indexOf("?ts")+4,timestamphelper.length()).toUInt();} catch(...){} query.bindValue(26,timestamp); } query.exec() ; } catch(...){ qDebug() << "Friendiqasync Error inserting contact" << contact["screen_name"] << " " << contact.toString(); } } } QString UPDATENEWS::url() const { return m_url; } void UPDATENEWS::startImagedownload() { //qDebug() << "start image download"; xhr.setDownloadtype("contactlist"); xhr.setFilelist(newcontactimagelinks); xhr.setContactlist(newcontactnames); xhr.setImagedir(m_imagedir); xhr.getlist(); } void UPDATENEWS::showError(QString data, QString url,QString api, int code ) { qDebug() << "showerror " << api << " data " << data; emit this->error(api,data); if (api!=m_api || xhr.downloadtype()!=""){} else{ if(m_updateInterval!=0){ syncindex+=1; startsync(); } } }