OAuth and bugfixes

This commit is contained in:
LubuWest 2023-05-24 21:40:26 +02:00
parent e58a1f69dc
commit d43c18bb76
65 changed files with 1681 additions and 1494 deletions

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
CMakeLists.txt.user*
friendiqa.pro.user*
IJPSvd.json

View file

@ -1,3 +1,9 @@
## v0.6.8
* OAuth
* New translation: netherland
## v0.6.7
* Upload multiple images for post and add image descriptions
@ -27,7 +33,6 @@
* Removed permissions for new messages due to buggy Contacts API
* Sync all accounts in background (not only active)
## v0.6.3
* Dark theme

View file

@ -1,6 +1,6 @@
--- source-linux/common/filesystem.cpp
+++ source-linux/common/filesystem.cpp
@@ -178,7 +178,7 @@
@@ -165,7 +165,7 @@
QTextStream stream(&file);
stream << "[Desktop Entry]" << Qt::endl;
stream << "Name=Friendiqa" << Qt::endl;

View file

@ -104,7 +104,6 @@ Currently supported:
* Sync home timeline, replies, DM, Events, friend requests; Notify yes/no
* Hide #nsfw
ToDo
* OAuth
@ -121,8 +120,8 @@ ToDo
# Translations
* German, Spanish, Italian, Hungarian
* To contribute translations: Have a look at linux-sources/translations/friendiqa-de.ts and open it with an editor. It's an xml file. Change values and send me the file to thomasschmidt45 at gmx.net / do pull request.
* German, Spanish, Italian, Hungarian, dutch
* To contribute translations: <https://translate.codeberg.org/projects/friendiqa/friendiqa/>
# Install

View file

@ -0,0 +1,96 @@
# TEMPLATE = app
# TARGET = friendiqa
# CONFIG += release
# QT += qml quick gui widgets sql webview dbus webengine
cmake_minimum_required(VERSION 3.1.0)
project(friendiqa VERSION 0.6 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
if(CMAKE_VERSION VERSION_LESS "3.7.0")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
endif()
find_package(Qt5 COMPONENTS Widgets Quick Sql DBus WebView REQUIRED)
#Webview Webengine
set(MOC_SOURCES common/uploadableimage.h
common/xhr.h
common/filesystem.h
common/remoteauthasyncimageprovider.h
common/updatenews.h
common/alarm.h)
set(SOURCES common/friendiqa.cpp
common/uploadableimage.cpp
common/xhr.cpp
common/filesystem.cpp
common/remoteauthasyncimageprovider.cpp
common/updatenews.cpp
common/alarmandroid.cpp)
include_directories(common)
add_executable(friendiqa ${SOURCES} ${MOC_SOURCES} application.qrc)
target_link_libraries(friendiqa Qt::Core)
target_link_libraries(friendiqa Qt::Widgets)
target_link_libraries(friendiqa Qt::Quick)
target_link_libraries(friendiqa Qt::Sql)
target_link_libraries(friendiqa Qt::WebView)
target_link_libraries(friendiqa Qt::DBus)
# target_link_libraries(friendiqa Qt::Webengine)
# qt5_use_modules(friendiqa Core Widgets Quick Sql DBus)
install(TARGETS friendiqa DESTINATION bin)
#RESOURCES = application.qrc
# OTHER_FILES += qml/friendiqa.qml \
# translations/*.ts \
# qml/*.qml
# qml/newsqml/*.qml
# qml/contactqml/*.qml
# qml/photoqml/*.qml
# qml/configqml/*.qml
# js/*.js
#TRANSLATIONS += translations/friendiqa-de.ts \
# translations/friendiqa-es.ts \
# translations/friendiqa-it.ts
# HEADERS += \
# common/uploadableimage.h \
# common/xhr.h \
# common/filesystem.h \
# common/remoteauthasyncimageprovider.h \
# common/updatenews.h \
# common/alarm.h
#DISTFILES += \
# qml/calendarqml/*.qml \
# translations/*.ts \
# translations/*.qm \
# qml/*.qml \
# qml/newsqml/*.qml \
# qml/contactqml/*.qml \
# qml/photoqml/*.qml \
# qml/configqml/*.qml \
# js/*.js \
# target.path=/usr/bin
# desktop.path = /usr/share/applications
# desktop.files = images/de.ma-nic.Friendiqa.desktop
# icon.path = /usr/share/icons/hicolor/scalable/apps
# icon.files = images/Friendiqa.svg
# INSTALLS+=target desktop icon

View file

@ -1,5 +1,5 @@
<?xml version="1.0"?>
<manifest package="org.qtproject.friendiqa" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="0.6.7" android:versionCode="33" android:installLocation="auto">
<manifest package="org.qtproject.friendiqa" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="0.6.8" android:versionCode="34" android:installLocation="auto">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="31"/>
<!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.

View file

@ -1,7 +1,4 @@
# androidBuildToolsVersion=25.0.3
# androidCompileSdkVersion=26
buildDir=.build
# qt5AndroidDir=/home/pankraz/Qt/5.11.1/android_armv7/src/android/java
android.useAndroidX=true
android.enableJetifier=true
android.enforceUniquePackageName=false

View file

@ -16,7 +16,7 @@ public class FriendiqaStopService extends JobService{
@Override
public boolean onStartJob(JobParameters params) {
//Log.d(TAG,"Friendiqa JobServiceStop");
Log.d(TAG,"Friendiqa JobServiceStop");
Context context = this.getApplicationContext();
AndroidNativeService fs = new AndroidNativeService();
fs.stopQtService(context);

View file

@ -36,6 +36,7 @@
#include "xhr.h"
#include "updatenews.h"
#include "filesystem.h"
#include "oauth.h"
#include "remoteauthasyncimageprovider.h"
#include "AndroidNative/systemdispatcher.h"
@ -54,9 +55,7 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) {
Q_DECL_EXPORT int main(int argc, char *argv[]) {
//if (argc>1){qDebug()<< "argc Friendiqa"<< argc <<" argv1" <<argv[1];}
if ((argc>1) && (qstrcmp(argv[1],"-service")==0)){
//qDebug()<<"FriendiqaMain Service";
QAndroidService app(argc, argv);
UPDATENEWS* updatenews= UPDATENEWS::instance();
updatenews->setDatabase();
@ -69,7 +68,6 @@ Q_DECL_EXPORT int main(int argc, char *argv[]) {
else{
QApplication app(argc, argv);
QQmlApplicationEngine view;
//qDebug()<<"FriendiqaMain started";
QTranslator qtTranslator;
qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations");
app.installTranslator(&qtTranslator);
@ -84,6 +82,8 @@ Q_DECL_EXPORT int main(int argc, char *argv[]) {
view.rootContext()->setContextProperty("alarm", alarm);
UPDATENEWS* updatenews = UPDATENEWS::instance();
view.rootContext()->setContextProperty("updatenews", updatenews);
OAuthWrapper* oauth2 = OAuthWrapper::instance();
view.rootContext()->setContextProperty("oauth2", oauth2);
view.load(QUrl("qrc:/qml/friendiqa.qml"));
view.connect(view.rootContext()->engine(), SIGNAL(quit()), &app, SLOT(quit()));

View file

@ -0,0 +1 @@
/home/pankraz/ownCloud/clientsync/Friendiqa/v0.6/source-linux/common/oauth.cpp

View file

@ -0,0 +1 @@
/home/pankraz/ownCloud/clientsync/Friendiqa/v0.6/source-linux/common/oauth.h

View file

@ -13,7 +13,7 @@
TEMPLATE = app
TARGET = friendiqa
CONFIG += release
QT += core core-private qml quick gui widgets sql androidextras #webengine webview
QT += core core-private qml quick gui widgets sql androidextras network networkauth #webengine webview
include(androidnative.pri/androidnative.pri)
@ -23,7 +23,8 @@ SOURCES += common/friendiqa.cpp \
common/filesystemandroid.cpp \
common/remoteauthasyncimageprovider.cpp \
common/updatenews.cpp \
common/alarmandroid.cpp
common/alarmandroid.cpp \
common/oauth.cpp
lupdate_only{
SOURCES = qml/friendiqa.qml \
qml/*.qml
@ -38,7 +39,6 @@ SOURCES += common/friendiqa.cpp \
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
RESOURCES = application.qrc
OTHER_FILES += qml/friendiqa.qml \
@ -53,7 +53,8 @@ OTHER_FILES += qml/friendiqa.qml \
TRANSLATIONS += translations/friendiqa-de.ts \
translations/friendiqa-es.ts \
translations/friendiqa-it.ts \
translations/friendiqa-hu.ts
translations/friendiqa-hu.ts \
translations/friendiqa-nl.ts
HEADERS += \
common/uploadableimage.h \
@ -61,7 +62,8 @@ HEADERS += \
common/filesystem.h \
common/remoteauthasyncimageprovider.h \
common/updatenews.h \
common/alarm.h
common/alarm.h \
common/oauth.h
DISTFILES += \
android/gradle.properties \

View file

@ -78,7 +78,6 @@ ApplicationWindow{
function onLoginChanged(login){
if(login==""){rootstackView.push("qrc:/qml/configqml/AccountPage.qml")}
else{
if (login.newsViewType!="" || login.newsViewType!=null){newstab.newstabstatus=login.newsViewType;}
Newsjs.getCurrentContacts(login,db,function(contacts){
contactlist=contacts})}
}

View file

@ -13,14 +13,15 @@ if(CMAKE_VERSION VERSION_LESS "3.7.0")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
endif()
find_package(Qt5 COMPONENTS Widgets Quick Sql DBus REQUIRED)
find_package(Qt5 COMPONENTS Widgets Quick Sql DBus NetworkAuth REQUIRED)
set(MOC_SOURCES common/uploadableimage.h
common/xhr.h
common/filesystem.h
common/remoteauthasyncimageprovider.h
common/updatenews.h
common/alarm.h)
common/alarm.h
common/oauth.h)
set(SOURCES common/friendiqa.cpp
common/uploadableimage.cpp
@ -28,7 +29,8 @@ set(SOURCES common/friendiqa.cpp
common/filesystem.cpp
common/remoteauthasyncimageprovider.cpp
common/updatenews.cpp
common/alarmlinux.cpp)
common/alarmlinux.cpp
common/oauth.cpp)
include_directories(common)
@ -39,6 +41,7 @@ target_link_libraries(friendiqa Qt::Widgets)
target_link_libraries(friendiqa Qt::Quick)
target_link_libraries(friendiqa Qt::Sql)
target_link_libraries(friendiqa Qt::DBus)
target_link_libraries(friendiqa Qt::NetworkAuth)
install(TARGETS friendiqa DESTINATION ${CMAKE_INSTALL_BINDIR})
install(FILES images/de.manic.Friendiqa.desktop DESTINATION share/applications)

View file

@ -42,8 +42,6 @@
<file>qml/configqml/OSSettingsAndroid.qml</file>
<file>qml/configqml/OSSettingsLinux.qml</file>
<file>js/image.js</file>
<file>js/yplayer.html</file>
<file>js/layout.js</file>
<file>js/photoworker.js</file>
<file>js/service.js</file>
<file>js/news.js</file>
@ -256,5 +254,7 @@
<file>qml/newsqml/ReportUser.qml</file>
<file>qml/newsqml/MessageImageUploadDialog.qml</file>
<file>qml/configqml/AcceptRules.qml</file>
<file>translations/friendiqa-nl.qm</file>
<file>translations/friendiqa-nl.ts</file>
</qresource>
</RCC>

View file

@ -68,10 +68,7 @@ bool FILESYSTEM::Visibility()
QString FILESYSTEM::homePath() const
{
//QDir dir(m_Directory);
//
QString homeDir=QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);;
//qDebug(homeDir);
return homeDir;
}
@ -96,11 +93,9 @@ void FILESYSTEM::makeDir(QString name)
{
QDir dir(m_Directory);
if (dir.mkdir(name)){
//qDebug() << "makedir success" <<name;
emit success(name);
}
else {
qDebug() << "makedir error" <<name;
emit error(name,1);
}
}
@ -109,7 +104,6 @@ void FILESYSTEM::makePath(QString name)
{
QDir dir(m_Directory);
if (dir.mkpath(name)){
//qDebug() << "makepath success" <<name;
emit success(name);
}
else {
@ -120,7 +114,6 @@ void FILESYSTEM::makePath(QString name)
void FILESYSTEM::rmDir()
{
QDir dir(m_Directory);
//qDebug()<<m_Directory;
if (dir.removeRecursively()){
emit success(m_Directory);
}
@ -130,8 +123,6 @@ void FILESYSTEM::rmDir()
void FILESYSTEM::rmFile(QString name)
{
QDir dir(m_Directory);
//qDebug()<<m_Directory;
//qDebug(name);
if(dir.remove(name)){
emit success(name);
}
@ -144,8 +135,6 @@ QFileInfoList FILESYSTEM::fileList()
filters << "*.png" <<"*.PNG" << "*.jpg" << "*.JPG" << "*.JPEG";
dir.setNameFilters(filters);
dir.setSorting(QDir::Time | QDir::Reversed);
//QStringList m_Filelist=dir.entryInfoList();
//qDebug() << "filelist " << m_Filelist;
return dir.entryInfoList();
}
@ -185,3 +174,13 @@ void FILESYSTEM::setAutostart(bool autostart) {
}
}
}
QString FILESYSTEM::osType() const
{
return QSysInfo::productType();
}
QString FILESYSTEM::hostname() const
{
return QSysInfo::machineHostName();
}

View file

@ -35,7 +35,7 @@
#include <QDir>
#include <QObject>
#include <QStandardPaths>
#include <QSysInfo>
//#include <QtAndroidExtras>
//#include <QAndroidActivityResultReceiver>
@ -47,6 +47,8 @@ class FILESYSTEM : public QObject//, public QAndroidActivityResultReceiver
//Q_PROPERTY(bool direxist READ direxist)
Q_PROPERTY(QString homePath READ homePath)
Q_PROPERTY(bool isAutostart READ isAutostart)
Q_PROPERTY(QString osType READ osType CONSTANT)
Q_PROPERTY(QString hostname READ hostname CONSTANT)
//Q_PROPERTY(QString cameraPath READ cameraPath)
@ -61,7 +63,8 @@ public:
QString homePath() const;
bool Visibility();
bool isAutostart();
QString osType() const;
QString hostname() const;
//QString cameraPath() const;
// virtual void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data);

View file

@ -158,3 +158,13 @@ void FILESYSTEM::setAutostart(bool autostart) {
}
}
}
QString FILESYSTEM::osType() const
{
return QSysInfo::productType();
}
QString FILESYSTEM::hostname() const
{
return QSysInfo::machineHostName();
}

View file

@ -40,6 +40,7 @@
#include "filesystem.h"
#include "remoteauthasyncimageprovider.h"
#include "alarm.h"
#include "oauth.h"
//#include "AndroidNative/systemdispatcher.h"
//#include "AndroidNative/environment.h"
//#include "AndroidNative/debug.h"
@ -107,6 +108,9 @@ int main(int argc, char *argv[]) {
UPDATENEWS* updatenews = UPDATENEWS::instance();
view.rootContext()->setContextProperty("updatenews", updatenews);
OAuthWrapper* oauth2 = OAuthWrapper::instance();
view.rootContext()->setContextProperty("oauth2", oauth2);
qmlRegisterType<QSystemTrayIcon>("QSystemTrayIcon", 1, 0, "QSystemTrayIcon");
qRegisterMetaType<QSystemTrayIcon::ActivationReason>("ActivationReason");
view.rootContext()->setContextProperty("iconTray", QIcon(":/images/Friendica_monochrome.png"));

View file

@ -0,0 +1,88 @@
// This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa
// Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
//
// 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 <http://www.gnu.org/licenses/>.
#include "oauth.h"
#include <QtGui>
#include <QtCore>
#include <QtNetworkAuth>
OAuthWrapper *OAuthWrapper::instance()
{
static OAuthWrapper oa2;
return &oa2;
}
OAuthWrapper::OAuthWrapper(QObject *parent) : QObject(parent)
{
auto replyHandler = new QOAuthHttpServerReplyHandler(1337, this);
oauth2.setReplyHandler(replyHandler);
oauth2.setScope("read+write+follow+push");
connect(&oauth2, &QOAuth2AuthorizationCodeFlow::statusChanged, [=](
QAbstractOAuth::Status status) {
if (status == QAbstractOAuth::Status::Granted){
QMapIterator<QString, QVariant> i(oauth2.extraTokens());
while (i.hasNext()) {
i.next();
//qDebug() << i.key() << ": " << i.value() << Qt::endl;
}
emit success(oauth2.token());
}
});
connect(&oauth2, &QOAuth2AuthorizationCodeFlow::authorizeWithBrowser,
&QDesktopServices::openUrl);
}
void OAuthWrapper::setClientId(QString clientid)
{
m_clientid = clientid;
}
void OAuthWrapper::setServer(QString server)
{
m_server = server;
}
void OAuthWrapper::setClientSecret(QString clientsecret)
{
m_clientsecret = clientsecret;
}
void OAuthWrapper::grant()
{
oauth2.setClientIdentifier(m_clientid);
oauth2.setAuthorizationUrl(QUrl(m_server + "/oauth/authorize"));
oauth2.setAccessTokenUrl(QUrl(m_server + "/oauth/token"));
oauth2.setClientIdentifierSharedKey(m_clientsecret);
oauth2.grant();
}

View file

@ -0,0 +1,71 @@
// This file is part of Friendiqa
// https://github.com/lubuwest/Friendiqa
// Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
//
// 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 <http://www.gnu.org/licenses/>.
#ifndef OAUTH_H
#define OAUTH_H
#include <QtCore>
#include <QtNetwork>
#include <QOAuth2AuthorizationCodeFlow>
class OAuthWrapper : public QObject//, public QAndroidActivityResultReceiver
{
Q_OBJECT
public:
OAuthWrapper(QObject *parent = nullptr);;
OAuthWrapper(const QString &clientIdentifier, QObject *parent = nullptr);
static OAuthWrapper *instance();
// bool isPermanent() const;
// void setPermanent(bool value);
signals:
void success(QString token);
void error(QString error);
public slots:
void grant();
void setServer(QString server);
void setClientId(QString clientid);
void setClientSecret(QString clientsecret);
private:
QOAuth2AuthorizationCodeFlow oauth2;
// bool permanent = false;
QString m_clientid;
QString m_clientsecret;
QString m_server;
};
#endif //OAuthWrapper

View file

@ -59,14 +59,14 @@ 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::setUrl(QString url)
//{
// if (url!=m_url) {
// m_url = url;
// xhr.setUrl(url);
// emit urlChanged(m_url);
// }
//}
void UPDATENEWS::setSyncAll(bool syncAll)
{
@ -77,8 +77,11 @@ 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());
if (!m_db.open())
{
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(QUrl("file://"+db_url+".sqlite").toLocalFile());
}
if (!m_db.open())
{
@ -87,9 +90,46 @@ void UPDATENEWS::setDatabase()
}
QJsonArray UPDATENEWS::getAccounts(QString filtername, QString filtervalue){
QString filterstring="";
if (filtername!=""){
bool ok;
int filternumber = filtervalue.toInt(&ok, 10);
if(ok){
filterstring=" WHERE " + filtername + " = " + filtervalue;
}
else{
filterstring=" WHERE " + filtername + " = '" + filtervalue +"'";
}
}
QSqlQuery query("SELECT * FROM config" + filterstring + " ORDER BY isActive ASC, username ASC",m_db);
QJsonArray accountlist;
while(query.next()){
{
QJsonObject accountData;
accountData.insert("server",query.value(0).toString());
accountData.insert("username",query.value(1).toString());
accountData.insert("password",query.value(2).toString());
accountData.insert("imagestore",query.value(3).toString());
accountData.insert("isActive",query.value(7).toString());
QJsonArray m_permissions=query.value(7).toJsonArray();
accountData.insert("permissions",m_permissions);
accountData.insert("token",QString(QByteArray::fromBase64(query.value(10).toByteArray())));
QJsonDocument m_client;
if(query.value(12).toByteArray()!=""){
m_client=QJsonDocument::fromJson(QByteArray::fromBase64(query.value(12).toByteArray()));
}
accountData.insert("client",m_client.object());
accountlist.append(accountData);
}
}
query.clear();
return accountlist;
}
void UPDATENEWS::login()
{
QSqlQuery syncquery("SELECT * FROM globaloptions",m_db);
m_updateInterval=0;
syncindex=0;
@ -100,11 +140,9 @@ void UPDATENEWS::login()
}
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() << " " <<syncquery.value(1).toString();
}
if (syncquery.value(0).toString().left(7)=="notify_" && syncquery.value(1).toInt()==1){
notifylist.append(syncquery.value(0).toString());
//qDebug() << " notify " << syncquery.value(0).toString() << " " <<syncquery.value(1).toString();
}
}
@ -117,28 +155,17 @@ void UPDATENEWS::login()
if(!(synctimequery3.exec())) {qDebug() << " synctimequery3 " << synctimequery3.lastError();}
}
QSqlQuery query("SELECT * FROM config ORDER BY isActive ASC, username ASC",m_db);
query.last();
usernamelength=query.at()+1;
if (query.isActive()&&(usernameindex<usernamelength))
{ query.seek(usernameindex);
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();
QJsonArray acc=getAccounts();
usernamelength=acc.size();
if (usernameindex<usernamelength){
QJsonObject currentAccount =acc[usernameindex].toObject();
xhr.setAccount(currentAccount.toVariantMap());
username = currentAccount["username"].toString();
}
}
void UPDATENEWS::startsync()
{ //qDebug()<<"Friendiqa start syncing "<<syncindex <<" of "<<synclist.length() << " m_login "<<m_login;
{
if (syncindex<synclist.length()){
if (synclist[syncindex]=="sync_Timeline"){
timeline();
@ -179,7 +206,7 @@ void UPDATENEWS::timeline()
{
m_api="/api/statuses/friends_timeline";
xhr.clearParams();
xhr.setUrl(m_url);
//xhr.setUrl(m_url);
xhr.setApi(m_api);
QSqlQuery query("SELECT status_id FROM news WHERE messagetype=0 AND username='"+ username +"' ORDER BY status_id DESC LIMIT 1",m_db);
if (query.isActive() && query.isSelect()){
@ -199,7 +226,6 @@ void UPDATENEWS::replies()
{
m_api="/api/statuses/replies";
xhr.clearParams();
xhr.setUrl(m_url);
xhr.setApi(m_api);
QSqlQuery query("SELECT status_id FROM news WHERE messagetype=3 AND username='"+ username +"' ORDER BY status_id DESC LIMIT 1",m_db);
if (query.isActive() && query.isSelect()){
@ -219,7 +245,6 @@ void UPDATENEWS::directmessages()
{
m_api="/api/direct_messages/all";
xhr.clearParams();
xhr.setUrl(m_url);
xhr.setApi(m_api);
QSqlQuery query("SELECT status_id FROM news WHERE messagetype=1 AND username='"+ username +"' ORDER BY status_id DESC LIMIT 1",m_db);
if (query.isActive() && query.isSelect()){
@ -238,7 +263,6 @@ void UPDATENEWS::notifications()
{
m_api="/api/friendica/notification";
xhr.clearParams();
xhr.setUrl(m_url);
xhr.setApi(m_api);
xhr.get();
QObject::connect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(store(QByteArray,QString)));
@ -249,7 +273,6 @@ void UPDATENEWS::notifications()
void UPDATENEWS::events()
{ m_api="/api/friendica/events";
xhr.clearParams();
xhr.setUrl(m_url);
xhr.setApi(m_api);
QSqlQuery query("SELECT id FROM events WHERE username='"+ username +"' ORDER BY id DESC LIMIT 1",m_db);
if (query.isActive() && query.isSelect()){
@ -268,7 +291,6 @@ void UPDATENEWS::events()
void UPDATENEWS::friendrequests()
{ m_api="/api/v1/follow_requests";
xhr.clearParams();
xhr.setUrl(m_url);
xhr.setApi(m_api);
xhr.get();
QObject::disconnect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(store(QByteArray,QString)));
@ -282,7 +304,6 @@ void UPDATENEWS::friendrequests()
void UPDATENEWS::store(QByteArray serverreply,QString apiname)
{ if (apiname!=m_api || xhr.downloadtype()!=""){} else {
QJsonDocument news;
//qDebug()<<apiname;
QJsonParseError jsonerror;
news=QJsonDocument::fromJson(serverreply,&jsonerror);
if (news.isArray()){
@ -421,7 +442,7 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname)
}
}
else {
qDebug()<< "Friendiqa updatenews error " << serverreply;
qDebug()<< m_api << "Friendiqa updatenews error " << serverreply <<username ;
//emit this->error(m_api,QTextCodec::codecForName("utf-8")->toUnicode(serverreply));
emit this->error(m_api,QString(serverreply));
if(m_syncAll){
@ -436,13 +457,11 @@ void UPDATENEWS::store(QByteArray serverreply,QString apiname)
void UPDATENEWS::updateImageLocation(QString downloadtype,QString imageurl, QString filename, int index){
//qDebug()<< "update Imagelocation " << downloadtype << " " << imageurl << " " << filename;
if (downloadtype=="contactlist"){
QSqlQuery testquery("SELECT profile_image FROM contacts WHERE profile_image_url ='"+imageurl+ "' AND username = '" +username+"'",m_db);
testquery.first();
QSqlQuery query("UPDATE contacts SET profile_image='"+ filename +"' WHERE profile_image_url ='"+imageurl+ "' AND username = '" +username+"'",m_db);
if(!(query.exec())) {qDebug()<< "updateImagelocation " << query.lastError();}
//qDebug()<< "index " << index << " " << newcontactnames.length()-1 << " " << m_syncAll;
if (index==(newcontactnames.length()-1)){
newcontactnames.clear();
newcontactimagelinks.clear();
@ -469,7 +488,6 @@ void UPDATENEWS::updateImageLocation(QString downloadtype,QString imageurl, QStr
}
QJsonObject UPDATENEWS::findNotificationContact(QString contacturl){
//qDebug()<< "findNotificationContact "<<contacturl;
QSqlQuery query("SELECT id,url FROM contacts WHERE url='"+contacturl+"' AND username='"+ username+"'",m_db);
query.first();
QJsonObject contact{
@ -806,23 +824,16 @@ void UPDATENEWS::storeEvents(QByteArray serverreply,QString apiname)
QObject::disconnect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(storeEvents(QByteArray,QString)));
}
QString UPDATENEWS::url() const
{
return m_url;
}
void UPDATENEWS::startImagedownload(QString downloadtype)
{
xhr.setDownloadtype(downloadtype );
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) && m_syncAll){

View file

@ -34,6 +34,7 @@
#include <QObject>
#include <QJsonObject>
#include <QJsonArray>
#include <QSqlDatabase>
#include "xhr.h"
#include "alarm.h"
@ -42,25 +43,18 @@
class UPDATENEWS : public QObject
{
Q_OBJECT
Q_PROPERTY(QString url READ url WRITE setUrl NOTIFY urlChanged)
// Q_PROPERTY(QString login READ login NOTIFY loginChanged)
public:
static UPDATENEWS *instance();
explicit UPDATENEWS(QObject *parent = 0);
QString url() const;
//QString login() const;
signals:
void urlChanged(QString url);
void success(QString api);
void error(QString api, QString content);
void quitapp();
public slots:
void setUrl(QString url);
void setSyncAll(bool syncAll);
void setDatabase();
void login();
@ -71,19 +65,16 @@ public slots:
void notifications();
void friendrequests();
void events();
//void startservice(QString type,QVariantMap map);
void startImagedownload(QString downloadtype);
void updateImageLocation(QString downloadtype,QString imageurl, QString filename, int index);
void store(QByteArray serverreply,QString apiname);
void storeFriendrequests(QByteArray serverreply,QString apiname);
void storeEvents(QByteArray serverreply,QString apiname);
void showError(QString data, QString url,QString api, int code);
QJsonArray getAccounts(QString filtername="",QString filtervalue="");
private:
QString m_url;
QString m_api;
QString m_imagedir;
QString m_login;
QString username;
bool m_syncAll;
int syncindex;
@ -95,8 +86,6 @@ private:
QList<QJsonValue> findNewContacts(QJsonDocument news);
QJsonObject findNotificationContact(QString imagelink);
int m_updateInterval;
//void timeline();
//void store(QByteArray serverreply,QString apiname);
void updateContacts(QList<QJsonValue> contacts);
XHR xhr;

View file

@ -54,65 +54,90 @@ XHR::XHR(QObject *parent) : QObject(parent)
void XHR::setUrl(QString url)
{
if (url!=m_url) {
m_url = url;
emit urlChanged();
}
if (url!=m_url) {
m_url = url;
emit urlChanged();
}
}
void XHR::setApi(QString api)
{
if (api!=m_api) {
m_api = api;
emit apiChanged();
}
if (api!=m_api) {
m_api = api;
emit apiChanged();
}
}
void XHR::setLogin(QString login)
{
if (login!=m_login) {
m_login = login;
emit loginChanged();
}
if (login!=m_login) {
m_login = login;
m_token="";
emit loginChanged();
}
}
void XHR::setAccount(QVariantMap account)
{
clearParams();
if (account["password"].toString() !=""){
setLogin(account["username"].toString()+":"+QByteArray::fromBase64(account["password"].toByteArray()));
}
else if (account["token"].toString() !="" && !account["token"].isNull()){
setToken(account["token"].toString());
}
setUrl(account["server"].toString());
setImagedir(account["imagestore"].toString());
m_account = account;
emit accountChanged();
}
void XHR::setToken(QString token)
{
if (token!=m_token) {
m_token = token;
m_login="";
emit tokenChanged();
}
}
void XHR::setFilename(QString filename)
{
if (filename!=m_filename) {
m_filename = filename;
emit filenameChanged();
}
if (filename!=m_filename) {
m_filename = filename;
emit filenameChanged();
}
}
void XHR::setContactlist(QList<QString> contactlist)
{
if (contactlist!=m_contactlist) {
m_contactlist = contactlist;
emit contactlistChanged();
}
if (contactlist!=m_contactlist) {
m_contactlist = contactlist;
emit contactlistChanged();
}
}
void XHR::setFilelist(QList<QString> filelist)
{
if (filelist!=m_filelist) {
m_filelist = filelist;
emit filelistChanged();
}
if (filelist!=m_filelist) {
m_filelist = filelist;
emit filelistChanged();
}
}
void XHR::setImagedir(QString imagedir)
{
if (imagedir!=m_imagedir) {
m_imagedir = imagedir;
emit imagedirChanged();
}
if (imagedir!=m_imagedir) {
m_imagedir = imagedir;
emit imagedirChanged();
}
}
void XHR::setDownloadtype(QString downloadtype)
{
if (downloadtype!=m_downloadtype) {
m_downloadtype = downloadtype;
emit downloadtypeChanged();
}
if (downloadtype!=m_downloadtype) {
m_downloadtype = downloadtype;
emit downloadtypeChanged();
}
}
QString XHR::url() const
@ -130,6 +155,16 @@ QString XHR::login() const
return m_login;
}
QString XHR::token() const
{
return m_token;
}
QVariantMap XHR::account() const
{
return m_account;
}
QString XHR::filename() const
{
return m_filename;
@ -176,9 +211,14 @@ void XHR::download()
QUrl requrl(m_url);
QNetworkRequest request;
if(m_downloadtype=="picturelist"){
QByteArray loginData = m_login.toLocal8Bit().toBase64();
QString headerData = "Basic " + loginData;
request.setRawHeader("Authorization", headerData.toLocal8Bit());
if(m_login!=""){
QByteArray loginData = m_login.toLocal8Bit().toBase64();
QString headerData = "Basic " + loginData;
request.setRawHeader("Authorization", headerData.toLocal8Bit());
} else{
QString headerData = "Bearer " + m_token;
request.setRawHeader("Authorization", headerData.toLocal8Bit());
}
}
request.setUrl(requrl);
reply = manager.get(request);
@ -198,20 +238,22 @@ void XHR::get()
while(i.hasNext()) {
i.next();
query.addQueryItem(i.key(), i.value());
//qDebug()<<i.key() << " value "<< i.value();
}
QUrl requrl(m_url+m_api);
//qDebug() << "API "<< requrl<<m_api;
requrl.setQuery(query);
QByteArray loginData = m_login.toLocal8Bit().toBase64();
QString headerData = "Basic " + loginData;
QNetworkRequest request;
request.setRawHeader("Authorization", headerData.toLocal8Bit());
if(m_login!=""){
QByteArray loginData = m_login.toLocal8Bit().toBase64();
QString headerData = "Basic " + loginData;
request.setRawHeader("Authorization", headerData.toLocal8Bit());
} else if (m_token!=""){
QString headerData = "Bearer " + m_token;
request.setRawHeader("Authorization", headerData.toLocal8Bit());
}
request.setUrl(requrl);
reply = manager.get(request);
connect(reply, &QNetworkReply::finished, this, &XHR::onReplySuccess);
//connect(reply,SIGNAL(downloadProgress(qint64,qint64)), this,SLOT(updateDownloadProgress(qint64,qint64)));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError)));
connect(reply, &QNetworkReply::readyRead, this, &XHR::onReadyRead);
connect(reply, &QNetworkReply::sslErrors, this, &XHR::onSSLError);
@ -221,7 +263,8 @@ void XHR::getlist()
{
if(dlindex < m_filelist.size()) {
QString cleanfilename;
if (m_downloadtype=="contactlist" || m_downloadtype=="friendrequests" ){cleanfilename = m_contactlist.at(dlindex)+"-"+ m_filelist.at(dlindex).section('/',-1).section('?',0,0);
if (m_downloadtype=="contactlist" || m_downloadtype=="friendrequests" ){
cleanfilename = m_contactlist.at(dlindex)+"-"+ m_filelist.at(dlindex).section('/',-1).section('?',0,0);
XHR::setFilename(imagedir()+"contacts/"+cleanfilename);
XHR::setUrl(m_filelist.at(dlindex));}
else {
@ -234,7 +277,6 @@ void XHR::getlist()
void XHR::post()
{
//qDebug() << "start post to " << m_url;
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHashIterator<QString, QString> iparams(params);
@ -250,7 +292,6 @@ void XHR::post()
if (files.contains("media")){
uimg.setAngle(files.value("angle").toInt());
uimg.setSource(files.value("media"));
//qDebug() << "\t add media " << files.value("media") << " : " << files.value("angle").toInt();
QHttpPart imagePart;
imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(uimg.mimetype()));
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"media\"; filename=\""+uimg.filename()+"\""));
@ -258,10 +299,15 @@ void XHR::post()
multiPart->append(imagePart);
}
QByteArray loginData = m_login.toLocal8Bit().toBase64();
QString headerData = "Basic " + loginData;
QNetworkRequest request;
request.setRawHeader(QByteArray("Authorization"), headerData.toLocal8Bit());
if(m_login!=""){
QByteArray loginData = m_login.toLocal8Bit().toBase64();
QString headerData = "Basic " + loginData;
request.setRawHeader("Authorization", headerData.toLocal8Bit());
} else if (m_token!=""){
QString headerData = "Bearer " + m_token;
request.setRawHeader("Authorization", headerData.toLocal8Bit());
}
request.setUrl(m_url+m_api);
reply = manager.post(request, multiPart);
qDebug() << "\t request sent";
@ -269,17 +315,21 @@ void XHR::post()
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError)));
connect(reply, &QNetworkReply::readyRead, this, &XHR::onReadyRead);
connect(reply, &QNetworkReply::sslErrors, this, &XHR::onSSLError);
qDebug() << "\t reply signals connected";
}
void XHR::postJSON()
{
if (params.contains("JSON")){
QByteArray mJSON=params.value("JSON").toUtf8();
QByteArray loginData = m_login.toLocal8Bit().toBase64();
QString headerData = "Basic " + loginData;
QNetworkRequest request;
request.setRawHeader(QByteArray("Authorization"), headerData.toLocal8Bit());
if(m_login!=""){
QByteArray loginData = m_login.toLocal8Bit().toBase64();
QString headerData = "Basic " + loginData;
request.setRawHeader("Authorization", headerData.toLocal8Bit());
} else if (m_token!=""){
QString headerData = "Bearer " + m_token;
request.setRawHeader("Authorization", headerData.toLocal8Bit());
}
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json; charset=UTF-8");
request.setUrl(m_url+m_api);
reply = manager.post(request, mJSON);
@ -306,7 +356,7 @@ void XHR::onReplySuccess()
qDebug() << "!";
emit this->success(buffer, m_api);
buffer.clear();
// reply->deleteLater();
// reply->deleteLater();
}
void XHR::onRequestFinished()
@ -317,7 +367,7 @@ void XHR::onRequestFinished()
else if (m_downloadtype=="picturelist") {
QJsonDocument jsonResponse = QJsonDocument::fromJson(buffer);
QJsonObject jsonObject = jsonResponse.object();
int arraystart=buffer.indexOf('{"data":"')+8;
int arraystart=buffer.indexOf("{\"data\":\"")+8;
int arraylength=buffer.indexOf('"',9)-arraystart;
QByteArray b64=buffer.mid(arraystart,arraylength);
QString helpfilename=jsonObject["filename"].toString();
@ -352,7 +402,7 @@ void XHR::onRequestFinished()
emit this->downloaded(m_downloadtype,m_url,m_filename,dlindex);
if(downloadtype()=="contactlist" || downloadtype()=="friendrequests"){dlindex=dlindex+1;XHR::getlist();}
//reply->deleteLater();
//reply->deleteLater();
}
}

View file

@ -44,6 +44,8 @@ class XHR : public QObject
Q_OBJECT
Q_PROPERTY(QString url READ url WRITE setUrl NOTIFY urlChanged)
Q_PROPERTY(QString login READ login WRITE setLogin NOTIFY loginChanged)
Q_PROPERTY(QString token READ token WRITE setToken NOTIFY tokenChanged)
Q_PROPERTY(QVariantMap account READ account WRITE setAccount NOTIFY accountChanged)
Q_PROPERTY(QString filename READ filename WRITE setFilename NOTIFY filenameChanged)
Q_PROPERTY(QString imagedir READ imagedir WRITE setImagedir NOTIFY imagedirChanged)
Q_PROPERTY(QList<QString> contactlist READ contactlist WRITE setContactlist NOTIFY contactlistChanged)
@ -60,6 +62,8 @@ public:
QString url() const;
QString api() const;
QString login() const;
QString token() const;
QVariantMap account() const;
QString filename() const;
QList<QString> contactlist() const;
QList<QString> filelist() const;
@ -71,6 +75,8 @@ signals:
void urlChanged();
void apiChanged();
void loginChanged();
void tokenChanged();
void accountChanged();
void filenameChanged();
void contactlistChanged();
void filelistChanged();
@ -86,6 +92,8 @@ public slots:
void setUrl(QString url);
void setApi(QString api);
void setLogin(QString login);
void setToken(QString token);
void setAccount(QVariantMap account);
void setDownloadtype(QString downloadtype);
void setFilename(QString filename);
void setContactlist(QList<QString> filename);
@ -115,6 +123,8 @@ private:
QString m_url;
QString m_api;
QString m_login;
QString m_token;
QVariantMap m_account;
QString m_filename;
QString m_downloadtype;
// QString m_networktype;

View file

@ -34,7 +34,6 @@ WorkerScript.onMessage = function(msg) {
if (msg.albums[j]) {
var albumobject=msg.albums[j];
var data=({"albumobject": albumobject,"foreignPicture": msg.foreignPicture})}
// print("Albums:"+j+msg.albums.length+JSON.stringify(data));
msg.model.append(data);}
if (j==msg.albums.length){
msg.model.sync()

View file

@ -41,7 +41,6 @@ function friendicaRequest(login,api,rootwindow,callback) {
callback(xhrequest.responseText)
}else{print("xhrequest.status "+xhrequest.status)
callback(xhrequest.responseText)
//showMessage("Error","API:\n" +login.server+api+"\n NO RESPONSE"+xhrequest.statusText,rootwindow);
}
}
catch (e){
@ -49,30 +48,39 @@ function friendicaRequest(login,api,rootwindow,callback) {
}
}
}
xhrequest.open("GET", login.server+api,true,login.username,Qt.atob(login.password));
if (login.password==""){
xhrequest.open("GET", login.server+api,true);
xhrequest.setRequestHeader("Authorization","Bearer "+login.token);
}
else{
xhrequest.open("GET", login.server+api,true,login.username,Qt.atob(login.password));
}
xhrequest.send();
}
function friendicaPostRequest(login,api,data,method,rootwindow,callback) {
var xhrequest= new XMLHttpRequest();
xhrequest.onreadystatechange = function() {
//print(api+JSON.stringify(login)+Qt.atob(login.password));
if (xhrequest.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
} else if(xhrequest.readyState === XMLHttpRequest.DONE) {
try{ if (xhrequest.responseText!=""){//print (xhrequest.responseText)
callback(xhrequest.responseText)
}else{//print("API:\n" +api+" NO RESPONSE");
//showMessage("Error","API:\n" +api+" NO RESPONSE",rootwindow)
}else{
callback(xhrequest.responseText)
}
}
catch (e){
print("API:\n" + api+" "+e+"\n Return:"+xhrequest.responseText);
//showMessage("Error", "API:\n" + api+" "+e+"\n Return:"+xhrequest.responseText,rootwindow)
}
}
}
xhrequest.open(method, login.server+api,true,login.username,Qt.atob(login.password));
if (login.password==""){
xhrequest.open(method, login.server+api,true);
xhrequest.setRequestHeader("Authorization","Bearer "+login.token);
}
else{
xhrequest.open(method, login.server+api,true,login.username,Qt.atob(login.password));
}
xhrequest.send(data);
}
@ -86,32 +94,6 @@ function getCount(database,login,table,field,countvalue){
return count
}
function friendicaWebRequest(url,rootwindow,callback) {
var xhrequest = new XMLHttpRequest();
xhrequest.onreadystatechange = function() {
if (xhrequest.readyState === XMLHttpRequest.HEADERS_RECEIVED) {}
else if(xhrequest.readyState === XMLHttpRequest.DONE) {
try{callback(xhrequest.responseText)}
catch (e){showMessage("Error","API:\n" +url+" "+e+"\n Return: "+xhrequest.responseText, rootwindow)}
}
}
xhrequest.open("GET", url,true);
xhrequest.send();
}
function friendicaXmlRequest(url,rootwindow,callback) {
var xhrequest = new XMLHttpRequest();
xhrequest.onreadystatechange = function() {
if (xhrequest.readyState === XMLHttpRequest.HEADERS_RECEIVED) {}
else if(xhrequest.readyState === XMLHttpRequest.DONE) {
try{callback(xhrequest.responseXML)}
catch (e){showMessage("Error","API:\n" +url+" "+e+"\n Return: "+xhrequest.responseText, rootwindow)}
}
}
xhrequest.open("GET", url);
xhrequest.responseType ="document";
xhrequest.send();
}
function friendicaRemoteAuthRequest(login,url,c_url,rootwindow,callback) {
var xhrequest = new XMLHttpRequest();
@ -142,7 +124,6 @@ function readData(database,table,username,callback,filter,filtervalue, sort) { /
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
if(!db) { return; }
db.transaction( function(tx) {
//print('select * from '+table+user+where+sortparam);
var rsArray=[];
var rs = tx.executeSql('select * from '+table+user+where+sortparam);
for(var i = 0; i < rs.rows.length; i++) {
@ -161,7 +142,6 @@ var where = " AND "+ filter +" = '" + filtervalue+"'";
db.transaction( function(tx) {
//print('... read from database ' + field)
var rsArray=[];
//print('select DISTINCT '+field+' from '+table+' WHERE username="'+username+'"'+where+' ORDER BY '+field+' ASC');
var rs = tx.executeSql('select DISTINCT '+field+' from '+table+' WHERE username="'+username+'"'+where+' ORDER BY '+field+' ASC');
for(var i = 0; i < rs.rows.length; i++) {
rsArray.push(rs.rows.item(i)[field])

View file

@ -55,7 +55,7 @@ function dataRequest(login,photo,database,xhr,rootwindow) {
Helperjs.friendicaRequest(login,"/api/friendica/photo?photo_id="+photo.id, rootwindow, function (image){
if(image=="" || typeof(image)=="undefined"){currentimageno=currentimageno+1}else{
try{print("image "+ image)
try{
var obj = JSON.parse(image);
if (obj.hasOwnProperty('status')){
var helpfilename=photo.filename.substring(0,photo.filename.lastIndexOf("."));
@ -69,7 +69,8 @@ function dataRequest(login,photo,database,xhr,rootwindow) {
else{photo.filename=helpfilename+filesuffix}
var link="";
xhr.setUrl(Qt.resolvedUrl(photo.thumb));
xhr.setLogin(login.username+":"+Qt.atob(login.password));
if(login.password!=""){xhr.setLogin(login.username+":"+Qt.atob(login.password));}
else{xhr.setToken(login.token)}
xhr.setFilename(login.imagestore+'albums/'+photo.album+"/"+photo["filename"]);
xhr.setDownloadtype("picture");
xhr.download();
@ -95,7 +96,8 @@ function dataRequest(login,photo,database,xhr,rootwindow) {
var link="";
if(obj["link"][0]){link=obj["link"][0]} else{link=obj["link"]["4"]}
xhr.setUrl(Qt.resolvedUrl(link));
xhr.setLogin(login.username+":"+Qt.atob(login.password));
if(login.password!=""){xhr.setLogin(login.username+":"+Qt.atob(login.password));}
else{xhr.setToken(login.token)}
xhr.setFilename(login.imagestore+'albums/'+obj.album+"/"+obj["filename"]);
xhr.setDownloadtype("picture");
xhr.download();
@ -120,7 +122,8 @@ function dataRequest(login,photo,database,xhr,rootwindow) {
else{photo.filename=helpfilename+filesuffix}
var link="";
xhr.setUrl(Qt.resolvedUrl(photo.thumb));
xhr.setLogin(login.username+":"+Qt.atob(login.password));
if(login.password!=""){xhr.setLogin(login.username+":"+Qt.atob(login.password));}
else{xhr.setToken(login.token)}
xhr.setFilename(login.imagestore+'albums/'+photo.album+"/"+photo["filename"]);
xhr.setDownloadtype("picture");
xhr.download();
@ -154,7 +157,6 @@ function deleteImage(database,login,type,location,filesystem,rootwindow,callback
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
var rsfilename=location.substring(location.lastIndexOf("/")+1,location.length);
var rslocation=location.substring(0,location.lastIndexOf("/")+1);
//print(type+" Name "+ rsfilename+" Location: "+rslocation)
db.transaction( function(tx) {
if (type=='image'){
var rs= tx.executeSql('SELECT * FROM imageData WHERE filename="'+rsfilename+'" AND location="'+rslocation+'"')
@ -211,47 +213,13 @@ function deleteContacts(database,user,callback) { // does nothing useful at the
callback(result)})
}
//function requestFriendsAlbumPictures(login,friend,rootwindow,callback){
//// screenscraping of albums page of contact without user and password
// Helperjs.friendicaWebRequest(friend.url.replace("profile","photos"),rootwindow,function(photohtml){
// //print(photohtml);
// var photoarray=[];
// var arr = photohtml.split("sidebar-photos-albums-li");
// for (var i=2;i<arr.length;i++){
// var albumlink = arr[i].substring(arr[i].indexOf('http'),arr[i].indexOf('class')-2);
// var albumname=arr[i].substring(arr[i].indexOf('/span')+6,arr[i].indexOf('</a>')-1);
// var album={'link':albumlink,'name':albumname}
// photoarray.push(album);
// }
// callback(photoarray)
// })
//}
function newRequestFriendsAlbumPictures(login,friend,rootwindow,callback){//print("newRequestFriendsAlbumPictures");
// screenscraping of albums page of contact with remoteAuth
//commented out for broken remoteauth
Helperjs.friendicaRemoteAuthRequest(login,friend.url.replace("profile","photos"),friend.url,rootwindow,function(photohtml){
//Helperjs.friendicaWebRequest(friend.url.replace("profile","photos"),rootwindow,function(photohtml){
try {var obj=JSON.parse(photohtml);//print ("Photohtml: "+photohtml)
if (obj.hasOwnProperty('status')){
Helperjs.friendicaWebRequest(friend.url.replace("profile","photos"),rootwindow,function(photohtml){
getAlbumFromHtml(photohtml,false,rootwindow,callback)})
}}
catch (e){
//getAlbumFromHtml(photohtml,true,rootwindow,callback)
getAlbumFromHtml(photohtml,false,rootwindow,callback)
}
})
}
function getAlbumFromHtml(photohtml,remoteAuthBool,rootwindow,callback){
//print(photohtml);
var photoarray=[];
var arr = photohtml.split("sidebar-photos-albums-li");
for (var i=2;i<arr.length;i++){
var albumlink = arr[i].substring(arr[i].indexOf('http'),arr[i].indexOf('class')-2);
var albumname=arr[i].substring(arr[i].indexOf('/span')+6,arr[i].indexOf('</a>')-1);
var album={'link':albumlink,'name':albumname}//print(albumlink+" "+albumname);
var album={'link':albumlink,'name':albumname}
photoarray.push(album);
}
callback(photoarray,remoteAuthBool)
@ -269,13 +237,6 @@ function newRequestFriendsPictures(login,link,friend,remoteAuthBool,remoteauth,r
callback(photoarray)
})
})}
else{
Helperjs.friendicaWebRequest(link,rootwindow,function(photohtml){
getPictureFromHtml(photohtml,remoteAuthBool,function(photoarray){
callback(photoarray)
})
})
}
}
function getPictureFromHtml(photohtml,remoteAuthBool,callback){
@ -290,10 +251,6 @@ function getPictureFromHtml(photohtml,remoteAuthBool,callback){
if (photohtml.indexOf("photo-album-wrapper")>-1){ //theme 2
var photoarea=photohtml.substring(photohtml.indexOf("photo-album-wrapper"),photohtml.indexOf("photo-album-end"))
var arr = photoarea.split("</a>");}
//print("Url: "+login.server+ "Contacturl: "+friend.url)
// remoteauth.setUrl(login.server);
// remoteauth.setLogin(login.username+":"+Qt.atob(login.password));
// remoteauth.setContacturl(friend.url);
for (var i=0;i<arr.length-1;i++){
var photoname=arr[i].substring(arr[i].lastIndexOf('alt')+5,arr[i].lastIndexOf('title')-2);
var thumblink=arr[i].substring(arr[i].lastIndexOf('<img')+10,arr[i].lastIndexOf('alt')-2);
@ -305,41 +262,8 @@ function getPictureFromHtml(photohtml,remoteAuthBool,callback){
thumblink="image://remoteauthimage/"+thumblink;
photolink="image://remoteauthimage/"+photolink;
}
//Helperjs.friendicaRemoteAuthRequest(login,thumblink,friend.url,rootwindow,function(thumbimage){thumbbase64=QT.btoa(thumbimage)});
//thumblink="image://remoteauthimage/"+login.username+":"+Qt.atob(login.password)+"@"+login.server+"/api/friendica/remoteauth?c_url="+friend.url+"&url="+thumblink;
var photo={'link':photolink,'name':photoname,'thumb':thumblink}
photoarray.push(photo);
}
callback(photoarray)
}
function requestFriendsPictures(link,rootwindow,callback){
// screenscraping of pictures page for given album
Helperjs.friendicaWebRequest(link,rootwindow,function(photohtml){
var photoarray=[];
var basehtml=photohtml.substring(photohtml.indexOf('<base')+12,photohtml.indexOf('/>',photohtml.indexOf('<base'))-2);
// old theme
if (photohtml.indexOf("photo-album-image-wrapper-end")>-1){ //theme 1
var arr = photohtml.split("photo-album-image-wrapper-end");}
// other themes
if (photohtml.indexOf("photo-album-wrapper")>-1){ //theme 2
var photoarea=photohtml.substring(photohtml.indexOf("photo-album-wrapper"),photohtml.indexOf("photo-album-end"))
var arr = photoarea.split("</a>");}
for (var i=0;i<arr.length-1;i++){
var photoname=arr[i].substring(arr[i].lastIndexOf('alt')+5,arr[i].lastIndexOf('title')-2);
var thumblink=arr[i].substring(arr[i].lastIndexOf('<img')+10,arr[i].lastIndexOf('alt')-2);
var imagetype=thumblink.substring(thumblink.lastIndexOf("."));
var photolink=thumblink.substring(0,thumblink.length-imagetype.length-2)+"-0"+imagetype
if(thumblink.substring(0,4)!=="http"){thumblink=basehtml+thumblink}
if(photolink.substring(0,4)!=="http"){photolink=basehtml+photolink}
var photo={'link':photolink,'name':photoname,'thumb':thumblink}
photoarray.push(photo);
}
callback(photoarray)
})
}

View file

@ -1,76 +0,0 @@
// This file is part of Friendiqa
// https://git.friendi.ca/lubuwest/Friendiqa
// Copyright (C) 2020 Marco R. <thomasschmidt45@gmx.net>
//
// 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 <http://www.gnu.org/licenses/>.
function showFriends(db) {
Service.readActiveConfig(db,function(login){
Service.requestFriends(login.url,login.user,login.password,displayFriends);
});
}
function displayFriends(obj){
for (var i=0; i<obj.length; i++){
//print(obj[i]);
if (obj[i]) {friendsModel.append({"friendName": obj[i]});
};
}}
function ensureVisibility(c,f)
{
if (f.contentX >= c.x)
f.contentX = c.x;
else if (f.contentX+f.width <= c.x+c.width)
f.contentX = c.x+c.width-f.width;
if (f.contentY >= c.y)
f.contentY = c.y;
else if (f.contentY+f.height <= c.y+c.height)
f.contentY = c.y+c.height-f.height;
}
function createObject(objectQml,qmlParameters,parentitem,callback) {
var component = Qt.createComponent(objectQml);
if (component.status === Component.Ready || component.status === Component.Error)
finishCreation(component,qmlParameters,parentitem,callback);
else
component.statusChanged.connect(finishCreation(qmlParameters));
}
function finishCreation(component,qmlParameters,parentitem,callback) {
if (component.status === Component.Ready) {
var createdObject = component.createObject(parentitem, qmlParameters);
if (createdObject === null)
print("Error creating image"); }
else if (component.status === Component.Error)
print("Error loading component:"+component.errorString());
else {print("created")}
//callback(createdObject);
}

View file

@ -279,7 +279,6 @@ function storeNews(login,database,news,rootwindow){
db.transaction( function(tx) {
var result = tx.executeSql('SELECT * from news where username="'+login.username+'" AND status_id = "'+news[i].id+'" AND messagetype='+news[i].messagetype); // check for news id
if(result.rows.length === 1) {// use update
//print(news[i].id +' news exists, update it'+'UPDATE news SET username="'+login.username+'", messagetype=0, text="'+Qt.btoa(news[i].text)+'", created_at="'+Date.parse(cleanDate(news[i].created_at))+'", in_reply_to_status_id="'+news[i].in_reply_to_status_id+'", source="'+news[i].source+'", status_id="'+news[i].id+'", in_reply_to_user_id="'+news[i].in_reply_to_user_id+'", geo="'+news[i].geo+'", favorited="'+news[i].favorited+'", uid="'+news[i].user.id+'", statusnet_html="'+Qt.btoa(news[i].status_html)+'", statusnet_conversation_id="'+news[i].statusnet_conversation_id+'",friendica_activities="'+Qt.btoa(JSON.stringify(friendica_activities))+'",attachments="'+attachments+'",friendica_owner="'+news[i].friendica_owner.url+'" where username="'+login.username+'" AND status_id="'+news[i].status_id+'" AND messagetype=0')
result = tx.executeSql('UPDATE news SET username="'+login.username+'", messagetype='+news[i].messagetype+', text="'+Qt.btoa(news[i].text)+'", created_at="'+news[i].created_at+'", in_reply_to_status_id="'+news[i].in_reply_to_status_id+'", source="'+news[i].source+'", status_id="'+news[i].id+'", in_reply_to_user_id="'+news[i].in_reply_to_user_id+'", geo="'+news[i].geo+'", favorited="'+news[i].favorited+'", uid="'+news[i].user.id+'", statusnet_html="'+Qt.btoa(news[i].statusnet_html)+'", statusnet_conversation_id="'+news[i].statusnet_conversation_id+'",friendica_activities="'+Qt.btoa(JSON.stringify(friendica_activities))+'",attachments="'+attachments+'",friendica_owner="'+news[i].friendica_author.url+'" where username="'+login.username+'" AND status_id="'+news[i].status_id+'" AND messagetype=0');
} else {// use insert
result = tx.executeSql('INSERT INTO news (username,messagetype,text,created_at,in_reply_to_status_id,source,status_id,in_reply_to_user_id,geo,favorited,uid,statusnet_html,statusnet_conversation_id,friendica_activities,friendica_activities_self,attachments,friendica_owner) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [login.username,news[i].messagetype,Qt.btoa(news[i].text),news[i].created_at, news[i].in_reply_to_status_id, news[i].source, news[i].id,news[i].in_reply_to_user_id,news[i].geo,news[i].favorited, news[i].user.id,Qt.btoa(news[i].statusnet_html),news[i].statusnet_conversation_id, Qt.btoa(JSON.stringify(friendica_activities)),"[]",attachments,news[i].friendica_author.url])}})
@ -308,7 +307,6 @@ function newsfromdb(database,login,messagetype,callback,contact,stop_time){
else{var stop="<"+stop_time}
var contactfilter="";if(contact){contactfilter=" AND (uid='"+contact+"' OR friendica_owner='"+contact+"')"}
if (messagetype=="0"){messagetype="0,5"}
//print('select * from news WHERE username="'+login.username+'" AND messagetype IN ( '+messagetype+' ) AND created_at'+stop+contactfilter+' ORDER BY created_at DESC LIMIT 20');
var newsrs=tx.executeSql('select * from news WHERE username="'+login.username+'" AND messagetype IN ( '+messagetype+' ) AND created_at'+stop+contactfilter+' ORDER BY created_at DESC LIMIT 20');
var newsArray=[];
var allcontacts=getAllContacts(database,login.username);
@ -326,7 +324,7 @@ function newsfromdb(database,login,messagetype,callback,contact,stop_time){
}
function fetchUsersForNews(database,username,news,allcontacts){//print("fetchusers "+JSON.stringify(news))
function fetchUsersForNews(database,username,news,allcontacts){//print("fetchusers "+JSON.stringify(news));
news.user=objFromArray(allcontacts,"id",news.uid);
if(news.in_reply_to_user_id){news.reply_user=objFromArray(allcontacts,"id",news.in_reply_to_user_id)}
//news.friendica_owner_object=objFromArray(allcontacts,"url",news.friendica_owner);
@ -382,7 +380,6 @@ function likerequest(login,database,verb,newsid,rootwindow){
db.transaction( function(tx) {
var currentActivities_rs=tx.executeSql('select friendica_activities_self from news WHERE username="'+login.username+'" AND status_id='+newsid) ;
var currentActivities=JSON.parse(currentActivities_rs.rows.item(0).friendica_activities_self);
//print(verb+"currentActivities "+JSON.stringify(currentActivities));
if ((verb=="like")&&(currentActivities.indexOf(1)==-1)){ currentActivities.push(1);
if (currentActivities.indexOf(2)!=-1){currentActivities.splice(currentActivities.indexOf(2),1)}
}
@ -391,7 +388,6 @@ function likerequest(login,database,verb,newsid,rootwindow){
}
if (verb=="unlike"){ if (currentActivities.indexOf(1)!=-1){currentActivities.splice(currentActivities.indexOf(1),1)}}
if (verb=="undislike"){ if (currentActivities.indexOf(2)!=-1){currentActivities.splice(currentActivities.indexOf(2),1)}}
//print(JSON.stringify(currentActivities));
var result = tx.executeSql('UPDATE news SET friendica_activities_self ="'+JSON.stringify(currentActivities)+'" where username="'+login.username+'" AND status_id ='+newsid);
})}
else{}})
@ -408,7 +404,6 @@ function like(login,database,toggle,verb,newsid,rootwindow){
function attend(login,database,attend,newsid,rootwindow,callback){
Helperjs.friendicaPostRequest(login,"/api/friendica/activity/attend"+attend+"?id="+newsid, "","POST",rootwindow,function (obj){
//print("attend: "+attend+obj);
if (obj=='"ok"')
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
db.transaction( function(tx) {
@ -418,7 +413,6 @@ function attend(login,database,attend,newsid,rootwindow,callback){
currentActivities.push(3);
if (currentActivities.indexOf(4)!=-1){currentActivities.splice(currentActivities.indexOf(4),1)}
if (currentActivities.indexOf(5)!=-1){currentActivities.splice(currentActivities.indexOf(5),1)}
//print(JSON.stringify(currentActivities));
}
if ((attend=="no")&&(currentActivities.indexOf(4)==-1)){
currentActivities.push(4);
@ -443,26 +437,8 @@ function requestConversation(login,database,newsid,contacts,rootwindow,callback)
callback(news,newContacts)
})}
//function conversationfromdb(database,user,conversationId,callback){
// var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
// db.transaction( function(tx) {
// var newsrs=tx.executeSql('select * from news WHERE username="'+user+'" AND statusnet_conversation_id="'+conversationId+'" ORDER BY created_at ASC');
// var newsArray=[];
// var allcontacts=getAllContacts(database,user);
// for(var i = 0; i < newsrs.rows.length; i++) {
// newsArray.push(newsrs.rows.item(i));
// newsArray[i].statusnet_html=Qt.atob(newsArray[i].statusnet_html);
// newsArray[i].text=Qt.atob(newsArray[i].text);
// newsArray[i].id=newsArray[i].status_id;
// newsArray[i]=fetchUsersForNews(database,user,newsArray[i],allcontacts);
// if (helpernews.attachments!="" && newsArray[i].attachments!==null){newsArray[i].attachments=JSON.parse(Qt.atob(newsArray[i].attachments))};
// }
// callback(newsArray)})
//}
function requestFavorites(login,database,contacts,rootwindow,callback){
Helperjs.friendicaRequest(login,"/api/favorites",rootwindow, function (obj){
//print(obj+JSON.stringify(obj));
var news=JSON.parse(obj);
var newContacts=findNewContacts(news,contacts);
// storeNews(login,database,news,rootwindow,callback)
@ -494,7 +470,6 @@ function chatsfromdb(database,login,messagetype,currentconversations,callback,st
for(var j = 0; j< conversations.length; j++) {
var newsrs=tx.executeSql('select * from news WHERE username="'+login.username+'" AND statusnet_conversation_id="'+conversations[j] +'" AND messagetype="'+messagetype+'" ORDER BY created_at ASC');
//print(JSON.stringify(newsrs.rows.item(0))+JSON.stringify(newsrs.rows.item(1)))
var helpernews=newsrs.rows.item(0);
helpernews=cleanhelpernews(database,login.username,helpernews,allcontacts)
helpernews.currentconversation=[];
@ -532,17 +507,18 @@ function allchatsfromdb(database,user,callback){
for(var j = 0; j< conversationIds.length; j++) {
var newsrs=tx.executeSql('select * from news WHERE username="'+user+'" AND statusnet_conversation_id="'+conversationIds[j] +'" ORDER BY created_at ASC');
var helpernews=newsrs.rows.item(0);
var helpernews=cleanhelpernews(database,user,helpernews,allcontacts)
helpernews.currentconversation=[];
for (var h = 0;h<newsrs.rows.length;h++){
var helpernews2=newsrs.rows.item(h);
if(helpernews.id!=helpernews2.status_id){
helpernews2.newscount=0;
helpernews2=cleanhelpernews(database,user,helpernews2,allcontacts)
helpernews.currentconversation.push(helpernews2)
if (helpernews){
var helpernews=cleanhelpernews(database,user,helpernews,allcontacts)
helpernews.currentconversation=[];
for (var h = 0;h<newsrs.rows.length;h++){
var helpernews2=newsrs.rows.item(h);
if(helpernews.id!=helpernews2.status_id){
helpernews2.newscount=0;
helpernews2=cleanhelpernews(database,user,helpernews2,allcontacts)
helpernews.currentconversation.push(helpernews2)
}
}
}
newsArray.push(helpernews);
countArray.push(newsrs.rows.length)
}
@ -557,16 +533,10 @@ function allchatsfromdb(database,user,callback){
function oldchatfromdb(database,user,conversationId,lastpost,allcontacts,callback){
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
db.transaction( function(tx) {
// var newsArray=[];
// var countArray=[];
//var allcontacts=getAllContacts(database,user);
var newsrs=tx.executeSql('select * from news WHERE username="'+user+'" AND statusnet_conversation_id="'+conversationId +'" AND status_id<'+lastpost+' ORDER BY created_at ASC');
let conversation=[];
var helpernews={currentconversation:conversation}
if(newsrs.rows.length>0){
//helpernews=newsrs.rows.item(0);
//helpernews=cleanhelpernews(database,user,helpernews,allcontacts)
//helpernews.currentconversation=[];
for (var h = 0;h<newsrs.rows.length;h++){
var helpernews2=newsrs.rows.item(h);
if(helpernews.id!=helpernews2.status_id){
@ -579,8 +549,6 @@ function oldchatfromdb(database,user,conversationId,lastpost,allcontacts,callbac
}
var newscount=newsrs.rows.length;
callback(helpernews,newscount);
// var conversationobject={news:helpernews,newscount:newscount};
// return conversationobject;
})
}
@ -595,7 +563,6 @@ function cleanhelpernews(database,user,helpernews,allcontacts){
return helpernews
}
function getAllContacts(database,user){
var allcontacts=[];
Helperjs.readData(database,"contacts",user,function(obj){

View file

@ -32,14 +32,14 @@
WorkerScript.onMessage = function(msg) {
if (msg.firstalbum==0){msg.model.clear();}
var contact={}; try{contact=msg.friend}catch(e){print(e)}
var limit=0; if (msg.albums.length-msg.firstalbum<20){limit=msg.albums.length} else{limit=msg.firstalbum+20}
var limit=0; if (msg.albums.length-msg.firstalbum<20){limit=msg.albums.length} else{limit=msg.firstalbum+20}
for (var j=msg.firstalbum;j<limit;j++){
if (msg.albums[msg.firstalbum]) {
// print("album"+msg.albums[j].name);
if(msg.foreignPicture){
var albumname=msg.albums[j].name.trim();var albumlink=msg.albums[j].link
}else{
var albumname=msg.albums[j].toString();var albumlink=""}
var albumname=msg.albums[j].name;var albumlink=""
}
msg.model.append({"albumlink":albumlink,"foreignPicture":msg.foreignPicture,"albumname":albumname,"friend":contact});
msg.model.sync()
};

View file

@ -62,27 +62,6 @@ function cleanPermissions(oldperms){
return (newpermArray)
}
function getEvents(database,login,rootwindow,callback){
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
Helperjs.friendicaWebRequest(login.server+"/cal/"+login.username+"/json",rootwindow,function(obj){
//Helperjs.friendicaRemoteAuthRequest(login,login.server+"/cal/"+login.username+"/json",login.server+"/profile/"+login.username,rootwindow,function(obj){
var events = JSON.parse(obj);
db.transaction( function(tx) {
for (var i=0;i<events.length;i++){
var permissions=[];
permissions.push(cleanPermissions(events[i].item.allow_cid));
permissions.push(cleanPermissions(events[i].item.allow_gid));
permissions.push(cleanPermissions(events[i].item.deny_cid));
permissions.push(cleanPermissions(events[i].item.deny_gid));
var result = tx.executeSql('SELECT * from events where username="'+login.username+'" AND id = '+events[i].id); // check for news id
if(result.rows.length === 1) {// use update
result = tx.executeSql('UPDATE events SET username="'+login.username+'", start="'+Date.parse(events[i].start)+'", end="'+Date.parse(events[i].end)+'", allday="'+Number(events[i].allday)+'", title="'+events[i].title+'", j="'+events[i].j+'", d="'+events[i].d+ '", isFirst="'+Number(events[i].isFirst)+'", uid="'+events[i].item.uid+'", cid="'+events[i].item.cid+'", uri="'+events[i].item.uri+'", created="'+ Date.parse(events[i].item.created)+'", edited="'+ Date.parse(events[i].item.edited)+'", desc="'+events[i].item.desc+'", location="'+events[i].item.location+'", type="'+events[i].item.type+'", nofinish="'+events[i].item.nofinish+'", adjust ="'+events[i].item.adjust+'", ignore="'+events[i].item.ignore+'", permissions="'+ JSON.stringify(permissions)+'", guid="'+events[i].item.guid+'", itemid="'+events[i].item.itemid+ '", plink="'+events[i].item.plink+ '", authorName="'+events[i].item["author-name"]+ '", authorAvatar="'+events[i].item["author-avatar"]+ '", authorLink="'+events[i].item["author-link"]+ '", html="'+Qt.btoa(events[i].html)+'" where username="'+login.username+'" AND id='+events[i].id);
} else {// use insert
result = tx.executeSql('INSERT INTO events (username,id,start,end,allday,title,j,d,isFirst,uid,cid,uri,created,edited,desc,location,type,nofinish,adjust,ignore,permissions,guid,itemid,plink,authorName,authorAvatar,authorLink,html) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [login.username, events[i].id, Date.parse(events[i].start), Date.parse(events[i].end), events[i].allday, events[i].title, events[i].j, events[i].d, events[i].isFirst, events[i].item.uid, events[i].item.cid, events[i].item.uri, Date.parse(events[i].item.created), Date.parse(events[i].item.edited), events[i].item.desc, events[i].item.location, events[i].item.type, events[i].item.nofinish, events[i].item.adjust, events[i].item.ignore, JSON.stringify(permissions), events[i].item.guid, events[i].item.itemid, events[i].item.plink, events[i].item["author-name"], events[i].item["author-avatar"], events[i].item["author-link"], Qt.btoa(events[i].html)])}
callback()
}
})})}
function newscount(database, callback){
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
db.transaction( function(tx) {
@ -115,84 +94,6 @@ function eventsfromdb(database, username,callback){
callback(eventArray,dayArray)});
}
function requestFriendsEvents(login,friend,rootwindow,callback){
// get calendar JSON object of contact without user and password
Helperjs.friendicaWebRequest(friend.replace("profile","cal")+"/json",rootwindow,function(calhtml){
//print(calhtml);
var eventarray=[];var eventdays=[];
var events=JSON.parse(calhtml);
for (var i=0;i<events.length;i++){
var permissions=[];
permissions.push(cleanPermissions(events[i].item.allow_cid));
permissions.push(cleanPermissions(events[i].item.allow_gid));
permissions.push(cleanPermissions(events[i].item.deny_cid));
permissions.push(cleanPermissions(events[i].item.deny_gid));
var event ={}
event.start=Date.parse(events[i].start);event.end=Date.parse(events[i].end);
event.allday=events[i].allday; event.title=events[i].title; event.j=events[i].j;
event.d=events[i].d; event.isFirst=events[i].isFirst; event.uid=events[i].item.uid;
event.cid=events[i].item.cid; event.uri=events[i].item.uri;
event.created=Date.parse(events[i].item.created); event.edited=Date.parse(events[i].item.edited);
event.desc=events[i].item.desc; event.location=events[i].item.location; event.type=events[i].item.type;
event.nofinish=events[i].item.nofinish; event.adjust =events[i].item.adjust; event.ignore=events[i].item.ignore;
event.permissions=JSON.stringify(permissions); event.guid=events[i].item.guid;
event.itemid=events[i].item.itemid; event.plink=events[i].plink; event.authorName=events[i].item["author-name"];
event.authorAvatar=events[i].item["author-avatar"]; event. authorLink=events[i].item["author-link"];
event.html=Qt.btoa(events[i].html);
eventarray.push(event);
// var offsetTime = new Date().getTimezoneOffset() * 60 * 1000;print(new Date(event.start).toLocaleString()+"Zeitverschiebung:"+offsetTime)
// var time = event.start - offsetTime;
eventdays.push(Math.floor(event.start/(24*60*60*1000)))
}
//print(JSON.stringify(eventarray));
callback(eventarray,eventdays)
})
}
function newRequestFriendsEvents(login,friend,rootwindow,callback){
// get calendar JSON object of contact with remoteAuth or without user and password
if(friend.isFriend==1){
Helperjs.friendicaRemoteAuthRequest(login,friend.url.replace("profile","cal")+"/json",friend.url,rootwindow,function(calhtml){
getEventsFromHtml(calhtml,rootwindow,callback)})
}
else{
Helperjs.friendicaWebRequest(friend.url.replace("profile","cal")+"/json",rootwindow,function(calhtml){
getEventsFromHtml(calhtml,rootwindow,callback)})
}
}
function getEventsFromHtml(calhtml,rootwindow,callback){
var eventarray=[];var eventdays=[];
var events=JSON.parse(calhtml);
for (var i=0;i<events.length;i++){
var permissions=[];
permissions.push(cleanPermissions(events[i].item.allow_cid));
permissions.push(cleanPermissions(events[i].item.allow_gid));
permissions.push(cleanPermissions(events[i].item.deny_cid));
permissions.push(cleanPermissions(events[i].item.deny_gid));
var event ={}
event.start=Date.parse(events[i].start);event.end=Date.parse(events[i].end);
event.allday=events[i].allday; event.title=events[i].title; event.j=events[i].j;
event.d=events[i].d; event.isFirst=events[i].isFirst; event.uid=events[i].item.uid;
event.cid=events[i].item.cid; event.uri=events[i].item.uri;
event.created=Date.parse(events[i].item.created); event.edited=Date.parse(events[i].item.edited);
event.desc=events[i].item.desc; event.location=events[i].item.location; event.type=events[i].item.type;
event.nofinish=events[i].item.nofinish; event.adjust =events[i].item.adjust; event.ignore=events[i].item.ignore;
event.permissions=JSON.stringify(permissions); event.guid=events[i].item.guid;
event.itemid=events[i].item.itemid; event.plink=events[i].plink; event.authorName=events[i].item["author-name"];
event.authorAvatar=events[i].item["author-avatar"]; event. authorLink=events[i].item["author-link"];
event.html=Qt.btoa(events[i].html);
eventarray.push(event);
// var offsetTime = new Date().getTimezoneOffset() * 60 * 1000;print(new Date(event.start).toLocaleString()+"Zeitverschiebung:"+offsetTime)
// var time = event.start - offsetTime;
eventdays.push(Math.floor(event.start/(24*60*60*1000)))
}
//print(JSON.stringify(eventarray));
callback(eventarray,eventdays)
}
function savePermissions(database,obj) { // stores config to DB
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
var permissions=JSON.stringify(obj)
@ -207,34 +108,14 @@ function storeConfig(database,obj) { // stores config to DB
//print(JSON.stringify(obj));
var result = tx.executeSql('SELECT * from config WHERE username="'+obj.username+'"');
if(result.rows.length === 1) {// use update
var result2 = tx.executeSql('UPDATE config SET server="'+obj.server+'",password="'+obj.password+'", imagestore="'+obj.imagestore+'", maxnews="'+obj.accountId+'", timerInterval=0, newsViewType="'+obj.newsViewType+'", isActive=0 WHERE username="'+obj.username +'"');
var result2 = tx.executeSql('UPDATE config SET server="'+obj.server+'",password="'+obj.password+'", imagestore="'+obj.imagestore+'", maxnews="'+obj.accountId+'", timerInterval=0, newsViewType="'+obj.newsViewType+'", isActive=0, APIVersion="'+Qt.btoa(obj.token)+'", addons="'+obj.client + '" WHERE username="'+obj.username +'"');
var result3 = tx.executeSql('UPDATE config SET isActive=1 WHERE username !="'+obj.username +'"');
} else {// use insert print('... does not exists, create it')
var result2 = tx.executeSql('INSERT INTO config VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)', [obj.server, obj.username, obj.password, obj.imagestore, obj.accountId, 0,obj.newsViewType,0,"[[],[],[],[]]",0,"","",""]);
var result2 = tx.executeSql('INSERT INTO config VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)', [obj.server, obj.username, obj.password, obj.imagestore, obj.accountId, 0,obj.newsViewType,0,"[[],[],[],[]]",0,Qt.btoa(obj.token),"",obj.client]);
var result3 = tx.executeSql('UPDATE config SET isActive=1 WHERE username !="'+obj.username +'"');
}
})}
function showServerConfig(url,rootwindow,callback){
Helperjs.friendicaWebRequest(url+"/api/statusnet/config",rootwindow, function (obj){
var serverconfig = JSON.parse(obj);
var serverConfigString="import QtQuick 2.0; import QtQuick.Dialogs 1.2; MessageDialog{ visible: true; title:'Server';standardButtons: StandardButton.Ok;text: 'Name: "+serverconfig.site.name+"\nLanguage: "+serverconfig.site.language+
"\nEmail: "+serverconfig.site.email+"\nTimezone: "+serverconfig.site.timezone+"\nClosed: "+serverconfig.site.closed+
"\nText limit: "+serverconfig.site.textlimit+"\nShort Url length: "+serverconfig.site.shorturllength+
"\nFriendica version: "+serverconfig.site.friendica.FRIENDICA_VERSION+"\nDFRN version: "+serverconfig.site.friendica.DFRN_PROTOCOL_VERSION +
"\nDB Update version: "+serverconfig.site.friendica.DB_UPDATE_VERSION+"'}";
callback(serverConfigString)
})}
//function checkLogin(login,rootwindow,callback){
// // check server with given credentials
// try {Helperjs.friendicaRequest(login,"/api/account/verify_credentials",rootwindow, function (obj){
// var account = JSON.parse(obj);
// callback(account)
// })}
// catch(e){}
//}
function requestProfile(login,database,rootwindow,callback){
// return profile data
Helperjs.friendicaRequest(login,"/api/friendica/profile/show", rootwindow,function (obj){
@ -256,41 +137,15 @@ function requestProfile(login,database,rootwindow,callback){
});
}
function getServerConfig(database,login,rootwindow,callback){
// check server with given credentials
try {Helperjs.friendicaRequest(login,"/api/statusnet/config",rootwindow, function (obj){
var serverconfig = JSON.parse(obj);
var serverconfigString="import QtQuick 2.0; import QtQuick.Dialogs 1.2; MessageDialog{ visible: true; title:'Server';standardButtons: StandardButton.Ok;text: 'SUCCESS! \nName: "+serverconfig.site.name+"\nLanguage: "+serverconfig.site.language+
"\nEmail: "+serverconfig.site.email+"\nTimezone: "+serverconfig.site.timezone+"\nClosed: "+serverconfig.site.closed+
"\nText limit: "+serverconfig.site.textlimit+"\nShort Url length: "+serverconfig.site.shorturllength+
"\nFriendica version: "+serverconfig.site.friendica.FRIENDICA_VERSION+"\nDFRN version: "+serverconfig.site.friendica.DFRN_PROTOCOL_VERSION +
"\nDB Update version: "+serverconfig.site.friendica.DB_UPDATE_VERSION+"'}";
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
db.transaction( function(tx) {
var result = tx.executeSql('UPDATE config SET APIVersion="'+ serverconfig.site.friendica.FRIENDICA_VERSION+'" WHERE username="'+login.username +'"')})
callback(serverconfigString);
})}
catch (e){callback (e);
}}
function readConfig(database,callback,filter,filtervalue) { // reads config
if (filter){var where = " WHERE "+ filter +" = '" + filtervalue+"'"} else { var where=""}
//print("readConfig");
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3],initDatabase(database));
db.transaction( function(tx) {
var tables = tx.executeSql("SELECT * FROM sqlite_master WHERE type='table'");
if (tables.rows.length==0){print("no database");callback("")} else {
var rs = tx.executeSql('select * from config'+where);
var rsArray=[];
if (rs.rows.length>0){
for(var i = 0; i < rs.rows.length; i++) {
rsArray.push(rs.rows.item(i))
}
var rsObject={server:rsArray[0].server,username:rsArray[0].username, password:rsArray[0].password,imagestore:rsArray[0].imagestore,isActive:rsArray[0].isActive, newsViewType:rsArray[0].newsViewType,accountId:rsArray[0].maxnews,permissions:JSON.parse(rsArray[0].permissions),maxContactAge:rsArray[0].maxContactAge,APIVersion:rsArray[0].APIVersion,addons:rsArray[0].addons};
if (rsObject.newsViewType!="" && rsObject.newsViewType!=null &&!typeof(rsObject.newsViewType)=='undefined'){updateNewsviewtype(database,rsObject.newsViewType)}
} else {var rsObject=""}
updatenews.setDatabase();
let rsArray=updatenews.getAccounts(filter,filtervalue);
let rsObject=rsArray[0];
callback(rsObject)}}
)
}
@ -300,14 +155,8 @@ function readAllLogins(database,callback) { // reads config
db.transaction( function(tx) {
var tables = tx.executeSql("SELECT * FROM sqlite_master WHERE type='table'");
if (tables.rows.length==0){print("no database");callback("")} else {
var rs = tx.executeSql('select * from config');
var rsArray=[];
if (rs.rows.length>0){
for(var i = 0; i < rs.rows.length; i++) {
rsArray.push(rs.rows.item(i));
rsArray[i].permissions=JSON.parse(rsArray[i].permissions)
}
}
updatenews.setDatabase();
var rsArray=updatenews.getAccounts();
}
callback(rsArray)}
)
@ -326,7 +175,6 @@ function setDefaultOptions(database){
})
}
function readGlobaloptions(database,callback){
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
var go=({});
@ -368,7 +216,7 @@ function deleteConfig(database,userobj,callback) { // delete user data from DB
var rs3 = tx.executeSql("delete from contacts WHERE username='"+ userobj.username+"'");
var rs4 = tx.executeSql("delete from imageData WHERE username='"+ userobj.username+"'");
var rs5 = tx.executeSql("delete from groups WHERE username='"+ userobj.username+"'");
var rs5 = tx.executeSql("delete from events WHERE username='"+ userobj.username+"'");
var rs6 = tx.executeSql("delete from events WHERE username='"+ userobj.username+"'");
callback();
})
}
@ -379,11 +227,9 @@ function updateNewsviewtype(database, newsViewtype){
db.transaction( function(tx) {
var rs1 = tx.executeSql('INSERT INTO globaloptions (k,v) VALUES (?,?)', ["newsViewType",newsViewtype])
var rs2 = tx.executeSql('UPDATE config SET newsViewType=""');
//Helperjs.showMessage(qsTr("Changelog"),qsTr("Setting view type of news has moved from account page to config page."),root)
})
}
function cleanNews(database,callback){
var db=Sql.LocalStorage.openDatabaseSync(database[0],database[1],database[2],database[3]);
db.transaction( function(tx) {
@ -448,7 +294,7 @@ function updateContactInDB(login,database,isFriend,contact){// for newstab and f
});
}
function processNews(api,data){//print("processnews "+ " api "+ api + " data "+data);
function processNews(api,data){
try{var newslist=JSON.parse(data)} catch(e){print("processnews "+e+ " api "+ api + " data "+data);newsBusy.running=false;};
if (api=="/api/users/show"){
var usermessages=[];
@ -618,7 +464,6 @@ function processNews(api,data){//print("processnews "+ " api "+ api + " data "+d
}
}
function cleanUser(user){
user.created_at=Date.parse(Newsjs.cleanDate(user.created_at));
var imagehelper1=user.profile_image_url.split("?");
@ -628,78 +473,11 @@ function cleanUser(user){
return user
}
function updateView(viewtype){//print("lastnews "+lastnews);
function updateView(viewtype,lastnews=0){
//messageSend.state="";
//newsBusy.running=true;
//downloadNotice.text="xhr start "+Date.now()
switch(viewtype){
case "Conversations":
Newsjs.getLastNews(login,db,function(lastnews){
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setApi("/api/statuses/friends_timeline");
xhr.clearParams();
xhr.setParam("since_id",lastnews);
xhr.setParam("count",50)});
break;
case "Timeline":
var lastnews=Newsjs.getLastNews(login,db,function(lastnews){
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setApi("/api/statuses/friends_timeline");
xhr.clearParams();
xhr.setParam("since_id",lastnews);
xhr.setParam("count",50)
});
break;
case "Search":
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setApi("/api/search");
break;
case "Notifications":
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setApi("/api/friendica/notification");
xhr.clearParams();
break;
case "Direct Messages":
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setApi("/api/direct_messages/all");
xhr.clearParams();
break;
case "Public Timeline":
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setApi("/api/statuses/public_timeline");
xhr.clearParams();
break;
case "Favorites":
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setApi("/api/favorites");
xhr.clearParams();
break;
case "Replies":
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setApi("/api/statuses/replies");
xhr.clearParams();
break;
default:
Newsjs.getLastNews(login,db,function(lastnews){
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setApi("/api/statuses/friends_timeline");
xhr.clearParams();
xhr.setParam("since_id",lastnews);
xhr.setParam("count",50)
newstab.newstabstatus="Conversations";
});
}
xhr.get();
if (viewtype==="Conversations"){Newsjs.allchatsfromdb(db,login.username,function(temp){
newsStack.allchats=temp
})}
@ -707,6 +485,44 @@ function updateView(viewtype){//print("lastnews "+lastnews);
//alarm.setAlarm(root.globaloptions.syncinterval);
setBackgroundsync()
}
xhr.setAccount(login);
switch(viewtype){
case "Conversations":
xhr.setApi("/api/statuses/friends_timeline");
xhr.setParam("since_id",lastnews);
xhr.setParam("count",50);
break;
case "Timeline":
xhr.setApi("/api/statuses/friends_timeline");
xhr.setParam("since_id",lastnews);
xhr.setParam("count",50)
break;
case "Search":
xhr.setApi("/api/search");
break;
case "Notifications":
xhr.setApi("/api/friendica/notification");
break;
case "Direct Messages":
xhr.setApi("/api/direct_messages/all");
break;
case "Public Timeline":
xhr.setApi("/api/statuses/public_timeline");
break;
case "Favorites":
xhr.setApi("/api/favorites");
break;
case "Replies":
xhr.setApi("/api/statuses/replies");
break;
default:
xhr.setApi("/api/statuses/friends_timeline");
xhr.setParam("since_id",lastnews);
xhr.setParam("count",50)
newstab.newstabstatus="Conversations";
}
xhr.get();
}
function showGroups(){
@ -732,10 +548,8 @@ function setBackgroundsync(){
function getGroupnews(list){
newstab.newstabstatus="Group news";
newsBusy.running=true;
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setAccount(login);
xhr.setApi("/api/lists/statuses");
xhr.clearParams();
xhr.setParam("list_id",list)
xhr.get();
}

View file

@ -82,12 +82,23 @@ var html=[//Smileys
'\ud83d\ude4E',
'\ud83d\ude4F',
'\ud83e\udd2F',
'\uD83E\uDD17',
'\uD83E\uDD14',
'\uD83E\uDD73',
'\uD83E\uDD21',
'\uD83D\uDC4D',
'\uD83D\uDC94',
'\u2764\uFE0F',
'\uD83D\uDCA9',
'\uD83D\uDC2D',
'\uD83D\uDC2E',
'\uD83D\uDC31',
'\uD83D\uDCAF',
'\uD83C\uDF82',
'\uD83C\uDF89',
'\uD83C\uDF81',
'\uD83C\uDF08',
'\uD83D\uDC80',
'\u2639',
'\u263B',
//Weather

View file

@ -1,47 +0,0 @@
<html>
<head>
<title>-1</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
</head>
<body bgcolor="black" marginwidth="0" marginheight="0">
<div id="player"></div>
<script>
function getVideoId() {
return window.location.href.slice(window.location.href.indexOf('?') + 1);
}
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var player;
function onYouTubeIframeAPIReady() {
console.log("Videoid: "+getVideoId());
player = new YT.Player('player', {
playerVars: { 'html5': 1, 'iv_load_policy': 3, 'autoplay': 1 },
frameborder: '0',
height: '100%',
width: '100%',
videoId: getVideoId(),
events: {
'onReady': onPlayerReady,
'onStateChange': onPlayerStateChange
}
});
}
function onPlayerReady(event) {
document.title = 0;
event.target.playVideo();
}
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.PLAYING) {
document.title = 1;
} else if (event.data == YT.PlayerState.ENDED || event.data == YT.PlayerState.PAUSED) {
document.title = 2;
}
}
</script>
</body>
</html>

View file

@ -68,7 +68,7 @@ Rectangle {
eventdays=dayArray;
calBusy.running=false
var currentevents=events;
var currentevents=events.filter(event=>(currentTime<=event.end));
currentevents=events.filter(event=>(currentTime<=event.end));
for (var i=0; i<Math.min(5,currentevents.length);i++){
var liststate="";
eventModel.append({"event":currentevents[i],"eventstatus":liststate});
@ -155,10 +155,8 @@ Rectangle {
standardButtons: Dialog.Ok | Dialog.Cancel
modal: true
onAccepted: {
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setAccount(login);
xhr.setApi("/api/friendica/event_delete");
xhr.clearParams();
xhr.setParam("id",eventid);
xhr.post();
}

View file

@ -350,10 +350,8 @@ Flickable{
let startdatetext=textStartDate.getText(0,textStartDate.length);
let startdate=new Date(startdatetext.substring(6,10)+"-"+startdatetext.substring(3,5)+"-"+startdatetext.substring(0,2)+"T"+textStartTime.text)
eventCreateBusy.running=true;
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setAccount(login);
xhr.setApi("/api/friendica/event_create");
xhr.clearParams();
xhr.setParam("name", titleField.text);
xhr.setParam("start_time",startdate.toISOString())
if(!checkNoEndTime.checked){

View file

@ -74,10 +74,8 @@ Rectangle{
standardButtons: Dialog.Ok | Dialog.Cancel
modal: true
onAccepted: {
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setAccount(login);
xhr.setApi("/api/friendica/event_delete");
xhr.clearParams();
xhr.setParam("id",eventid);
xhr.post();
}

View file

@ -43,10 +43,11 @@ Dialog {
standardButtons: Dialog.Yes | Dialog.No
modal: true
onAccepted: {
username.visible=true;
password.visible=true;
// username.visible=true;
// password.visible=true;
ruleButton.visible=false;
confirmation.visible=true
// confirmation.visible=true
accountPage.state="oauth"
}
onRejected: {close()}
ScrollView{

View file

@ -35,7 +35,6 @@ import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import QtQml.Models 2.15
import "qrc:/js/service.js" as Service
import "qrc:/js/layout.js" as Layoutjs
import "qrc:/js/helper.js" as Helperjs
import "qrc:/qml/configqml"
import "qrc:/qml/genericqml"
@ -47,18 +46,56 @@ Page{
property var users:[]
property var userdata: ({})
property string imagestoredir: ""
property var appdata: ({})
function setServericon(server){
if ((server!=null) && (server!="")){
try {Helperjs.friendicaWebRequest(server+"/api/statusnet/config",accountPage, function (obj){
var serverdata = JSON.parse(obj);
servericon.visible=true;
servericon.source=serverdata.site.logo})
} catch(e){print(e)}
xhr.setUrl(server);
xhr.setApi("/api/statusnet/config");
xhr.clearParams();
xhr.get();
}
}
function verify(userconfig){
Helperjs.friendicaRequest(userconfig,"/api/v1/accounts/verify_credentials",root,function(obj){
accountBusy.running=false;
try{var credentials=JSON.parse(obj);
if (credentials.hasOwnProperty('error')){
Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root)
}
else{
if (users.length==0){Service.setDefaultOptions(db);}
if (userconfig.APIVersion!=""){userconfig.password=""}
if (imagestoredir==""){imagestoredir=filesystem.homePath+"/"+credentials.username+"/";
userconfig.imagestore=imagestoredir}
if(userconfig.imagestore == filesystem.homePath+"/"+username.text+"/")
{filesystem.makePath(filesystem.homePath+"/"+username.text);}
filesystem.Directory=imagestoredir;
filesystem.makeDir("contacts");
filesystem.makeDir("albums");
userconfig.accountId=credentials.id;
userconfig.username=credentials.username;
Service.storeConfig(db,userconfig);
Service.readConfig(db,function(userconfig){
Helperjs.readData(db,"config","",function(storedUsers){
storedUsers.sort(function(obj1, obj2) {
return obj1.isActive - obj2.isActive;
});
accountPage.users=storedUsers});
//reset values
login=userconfig;
news=[];
contactlist=[];
rootstack.currentIndex=0;
newstypeSignal("refresh");
},"isActive",0);
Helperjs.showMessage(qsTr("Success"),qsTr("Name")+": "+credentials.display_name+"\nScreen Name: "+credentials.username,root)
rootstackView.pop()
}
}catch(e){Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root)};
})}
MButton{
id:userButton
text:qsTr("User")
@ -82,6 +119,8 @@ Page{
imagestore.text=obj.imagestore;
imagestoredir=obj.imagestore;
if( obj.isActive==0){userButton.font.bold='true'} else {userButton.font.bold='false'}
if(obj.password!=''){accountPage.state='password'}
else if (obj.token!=''){accountPage.state='oauth'}
},'username','"+ accountPage.users[i].username+"')}}"
}
var menuString="import QtQuick.Controls 2.12;import 'qrc:/js/service.js' as Service;"+
@ -96,11 +135,18 @@ Page{
width:2.5*root.fontFactor*osSettings.bigFontSize; height: 2.5*root.fontFactor*osSettings.bigFontSize
visible: false
source:""
property var serverconfig:({})
MouseArea{
anchors.fill:parent
onClicked:{
Service.showServerConfig(servername.text, accountPage, function(configString){
var serverconfigObject=Qt.createQmlObject(configString,accountPage,"serverconfigOutput");})
let serverConfigString="import QtQuick 2.0; import QtQuick.Dialogs 1.2; MessageDialog{ visible: true; title:'Server';standardButtons: StandardButton.Ok;text: 'Name: "+
servericon.serverconfig.site.name+"\nLanguage: "+servericon.serverconfig.site.language+
"\nEmail: "+servericon.serverconfig.site.email+"\nTimezone: "+servericon.serverconfig.site.timezone+"\nClosed: "+servericon.serverconfig.site.closed+
"\nText limit: "+servericon.serverconfig.site.textlimit+"\nShort Url length: "+servericon.serverconfig.site.shorturllength+
"\nFriendica version: "+servericon.serverconfig.site.friendica.FRIENDICA_VERSION+
"\nDB Update version: "+servericon.serverconfig.site.friendica.DB_UPDATE_VERSION+"'}";
var serverconfigObject=Qt.createQmlObject(serverConfigString,accountPage,"serverconfigOutput");
}
}
}
@ -180,22 +226,23 @@ Page{
}
ListModel{id:serverModel
ListElement{text:"https://anonsys.net"}
ListElement{text:"https://asaps-sm.lafayettegroup.com"}
ListElement{text:"https://f.freinetz.ch"}
ListElement{text:"https://friendica.chilemasto.casa"}
ListElement{text:"https://friendica.eskimo.com"}
ListElement{text:"https://friendica.me"}
ListElement{text:"https://friendica.opensocial.space"}
ListElement{text:"https://friendica.utzer.de"}
ListElement{text:"https://friendica.vrije-mens.org"}
ListElement{text:"https://friendicarg.nsupdate.info.de"}
ListElement{text:"https://friends.nogafam.es"}
ListElement{text:"https://libranet.de"}
ListElement{text:"https://loma.ml"}
ListElement{text:"https://social.trom.tf"}
ListElement{text:"https://motley.club"}
ListElement{text:"https://nerdica.net"}
ListElement{text:"https://noovi.org"}
ListElement{text:"https://nsfw.wnymathguy.com"}
ListElement{text:"https://opensocial.at"}
ListElement{text:"https://poliverso.org"}
ListElement{text:"https://social.isurf.ca"}
ListElement{text:"https://social.trom.tf"}
ListElement{text:"https://squeet.me"}
ListElement{text:"https://venera.social"}
}
@ -208,16 +255,10 @@ Page{
text: qsTr("Instance rules")
font.pointSize: osSettings.bigFontSize
onClicked:{
Helperjs.friendicaWebRequest(servername.text+"/api/v1/instance/rules",root,function(rules){
let rulestext="";
let rulesarray=JSON.parse(rules)
for (let rule in rulesarray){
rulestext=rulestext+rulesarray[rule].text+"\n"
}
var component = Qt.createComponent("qrc:/qml/configqml/AcceptRules.qml");
var rulesdialog = component.createObject(root,{"rules": rulestext});
rulesdialog.open()
})
xhr.setUrl(servername.text);
xhr.setApi("/api/v1/instance/rules");
xhr.clearParams();
xhr.get();
}
}
@ -237,7 +278,6 @@ Page{
}
}
TextField {
id: password
x: root.fontFactor*osSettings.bigFontSize; y: 9*root.fontFactor*osSettings.bigFontSize; width: root.width-9*mm; //height: 5*mm;
@ -298,62 +338,119 @@ Page{
running: false
}
MButton {
id:confirmationOAuth
x: root.fontFactor*osSettings.bigFontSize; y: 16*root.fontFactor*osSettings.bigFontSize
text: qsTr("Connect")
font.pointSize: osSettings.bigFontSize
visible: (osSettings.osType=="Android")?userButton.text!= qsTr("User"):true
onClicked:{
if (servername.text==""){Helperjs.showMessage(qsTr("Error"), qsTr("No server given!"),root)}
else{
xhr.setUrl(servername.text);
xhr.setApi("/api/v1/apps");
xhr.clearParams();
if (osSettings.osType=="Android"){
xhr.setParam("client_name","Friendiqa-Android");
} else {
xhr.setParam("client_name","Friendiqa-"+filesystem.hostname);
}
xhr.setParam("redirect_uris","http://127.0.0.1:1337/");
xhr.setParam("scopes","read write follow push");
xhr.setParam("website","https://friendiqa.ma-nic.de");
xhr.post();
}
}
}
Connections{
target: xhr
function onSuccess(text,api){
if(api=="/api/v1/instance/rules"){
let rulestext="";
let rulesarray=JSON.parse(text)
for (let rule in rulesarray){
rulestext=rulestext+rulesarray[rule].text+"\n"
}
var component = Qt.createComponent("qrc:/qml/configqml/AcceptRules.qml");
var rulesdialog = component.createObject(root,{"rules": rulestext});
rulesdialog.open();
}
else if(api=="/api/statusnet/config"){
try{let serverdata = JSON.parse(text);
servericon.visible=true;
servericon.source=serverdata.site.logo;
servericon.serverconfig=serverdata;
}
catch(e){print(e)}
}
else if (api=="/api/v1/apps"){
let app=JSON.parse(text);
accountPage.appdata=app;
oauth2.setClientId(app.client_id);
oauth2.setClientSecret(app.client_secret);
oauth2.setServer(servername.text);
oauth2.grant();
}
}
function onError(text,api){
print(api + " Error "+ text)
}
}
Connections{
target: oauth2
function onSuccess(text){
var userconfig={server: servername.displayText, username:"", password:"", imagestore: imagestoredir,interval:"",token: text,client:Qt.btoa(JSON.stringify(appdata))}
verify(userconfig)
}
function onError(text){
Helperjs.showMessage(qsTr("Error"), qsTr("Couldn't connect to server"),root)
print ("oauth2 onerror "+text)
}
}
MButton {
id:confirmation
x: root.fontFactor*osSettings.bigFontSize; y: 16*root.fontFactor*osSettings.bigFontSize
text: qsTr("Confirm")
font.pointSize: osSettings.bigFontSize
visible: (osSettings.osType=="Android")?userButton.text!= qsTr("User"):true
visible: false// (osSettings.osType=="Android")?userButton.text!= qsTr("User"):true
onClicked:{
accountBusy.running=true;//servername.displayText
var userconfig={server: servername.displayText, username: username.text, password:Qt.btoa(password.text), imagestore:imagestoredir,interval: ""};
accountBusy.running=true;
var userconfig={server: servername.displayText, username: username.text, password:Qt.btoa(password.text), imagestore:imagestoredir,interval:""};
var errormessage="";
if (servername.text==""){errormessage=qsTr("No server given! ")}
else if (username.text==""){errormessage+=qsTr("No nickname given! ")}
else if (password.text=="") {errormessage+=qsTr("No password given! ")}
else if (imagestoredir=="") {errormessage+=qsTr("No image directory given!")}
else {errormessage=""}
if (errormessage=="") {
Helperjs.friendicaRequest(userconfig,"/api/account/verify_credentials.json?skip_status=true",root,function(obj){
accountBusy.running=false;
try{var credentials=JSON.parse(obj);
if (credentials.hasOwnProperty('error')){
Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root)
}
else{
if (users.length==0){Service.setDefaultOptions(db);}
if(userconfig.imagestore == filesystem.homePath+"/"+username.text+"/")
{
filesystem.makePath(filesystem.homePath+"/"+username.text);
}
filesystem.Directory=imagestoredir
filesystem.makeDir("contacts");
filesystem.makeDir("albums");
userconfig.accountId=credentials.id
Service.storeConfig(db,userconfig);
Service.readConfig(db,function(userconfig){
Helperjs.readData(db,"config","",function(storedUsers){
storedUsers.sort(function(obj1, obj2) {
return obj1.isActive - obj2.isActive;
});
accountPage.users=storedUsers});
//reset values
login=userconfig;
news=[];
contactlist=[];
rootstack.currentIndex=0;
newstypeSignal("refresh");
},"isActive",0);
Helperjs.showMessage(qsTr("Success"),qsTr("Name")+": "+credentials.name+"\nScreen Name: "+credentials.screen_name,root)
rootstackView.pop()
}
}catch(e){Helperjs.showMessage(qsTr("Error"),qsTr("Wrong password or 2FA enabled!"),root)};
})}
else {Helperjs.showMessage(qsTr("Error"), errormessage,root)}
if (errormessage=="") {verify(userconfig)}
else {Helperjs.showMessage(qsTr("Error"), errormessage,root)}
}}
MButton {
id: setDefault
x: 10*root.fontFactor*osSettings.bigFontSize; y: 16*root.fontFactor*osSettings.bigFontSize
text: qsTr("Set as default")
font.pointSize: osSettings.bigFontSize
visible: false
onClicked:{
accountBusy.running=true;
let users=updatenews.getAccounts("username",username.text)
Service.storeConfig(db,users[0]);
Service.readConfig(db,function(userconfig){
//reset values
login=userconfig;
news=[];
contactlist=[];
rootstack.currentIndex=0;
newstypeSignal("refresh");
},"isActive",0);
Helperjs.showMessage(qsTr("Success"),"Screen Name: "+users[0].username,root)
rootstackView.pop()
}}
Row{
spacing:0.5*mm
@ -368,6 +465,19 @@ Page{
font.pointSize: osSettings.bigFontSize
onClicked:{
var userconfig={server: servername.text, username: username.text, password: Qt.btoa(password.text)};
Service.readConfig(db,function(user){
if(userdata.token!=""){xhr.setUrl(servername.text);
xhr.setApi("/oauth/revoke");
xhr.clearParams();
xhr.setParam("client_id",user.client.client_id);
xhr.setParam("client_secret",user.client.client_secret);
xhr.setParam("token",user.token);
xhr.post();
}
},"username",username.text);
Service.deleteConfig(db,userconfig,function(){
filesystem.Directory=imagestore.text+"contacts";
filesystem.rmDir();
@ -379,15 +489,13 @@ Page{
username.text="";
password.text="";
imagestore.text="";
//maxNews.value=0;
//newsTypeField.text="Conversations";
//messageIntervalSlider.value=30;
userButton.text=qsTr("User");
Helperjs.readData(db,"config","",function(storedUsers){
storedUsers.sort(function(obj1, obj2) {
return obj1.isActive - obj2.isActive;
})
accountPage.users=storedUsers;})
accountPage.state="new_oauth"
})
}}
@ -404,6 +512,7 @@ Page{
password.text=""
imagestore.text=""
userButton.text=qsTr("User")
accountPage.state="new_oauth"
}
}
@ -425,7 +534,31 @@ Page{
}
}
Component.onCompleted: {
states: [
State {
name: "new_oauth"
PropertyChanges { target: username; visible: false }
PropertyChanges { target: password; visible: false}
PropertyChanges { target: ruleButton; visible: true}
},
State {
name:"oauth"
PropertyChanges {target: username; visible: true}
PropertyChanges { target: password; visible: false}
PropertyChanges {target: confirmationOAuth; visible: true}
PropertyChanges {target: setDefault; visible: true}
PropertyChanges { target: confirmation; visible: false}
},
State{
name:"password"
PropertyChanges { target: username; visible: true }
PropertyChanges { target: password; visible: true}
PropertyChanges { target: confirmation; visible: true}
PropertyChanges {target: confirmationOAuth; visible: false}
}
]
Component.onCompleted: { //print("filesystem.osType " +filesystem.osType)
try{Helperjs.readData(db,"config","",function(storedUsers){
storedUsers.sort(function(obj1, obj2) {
return obj1.isActive - obj2.isActive;
@ -441,6 +574,9 @@ Page{
imagestore.text=obj.imagestore;
imagestoredir=obj.imagestore;
if( obj.isActive==0){userButton.font.bold='true'} else {userButton.font.bold='false'}
if(obj.password!=""){accountPage.state="password"}
else if (obj.token!=""){accountPage.state="oauth"}
else {accountPage.state="new_oauth"}
},"isActive",0)
})}
catch (e){//print("onCompleted" +users.count +e)

View file

@ -43,14 +43,13 @@ Page{
font.pointSize: osSettings.systemFontSize
color:Material.primaryTextColor
wrapMode: Text.WrapAtWordBoundaryOrAnywhere
text: "<b>Friendiqa v0.6.7 </b><br>Licensed under GPL 3 with the exception of OpenSSL <br> "+
text: "<b>Friendiqa v0.6.8 </b><br>Licensed under GPL 3 with the exception of OpenSSL <br> "+
"Website <a href='https://friendiqa.ma-nic.de'>https://friendiqa.ma-nic.de</a><br>"+
"Sourcecode: <a href='https://git.friendi.ca/LubuWest/Friendiqa'>https://git.friendi.ca/LubuWest/Friendiqa</a><br>"+
"Privacy Policy: <a href='https://git.friendi.ca/lubuwest/Friendiqa/src/branch/master/PrivacyPolicy.md'>http://git.friendi.ca/lubuwest/Friendiqa/src/branch/master/PrivacyPolicy.md</a><br>"+
"Code by <a href='https://freunde.ma-nic.de/profile/pankraz'>Marco</a><br>"+
"Qt Framework <a href='https://www.qt.io'>www.qt.io</a><br>"+
"Icons by <a href='http://fontawesome.io'>FontAwesome</a><br>"+
"Folder Icon by <a href='https://github.com/KDE/breeze-icons'>KDE Breeze Icons</a><br>"+
"AndroidNative by <a href='https://github.com/benlau/androidnative.pri'>Ben Lau</a><br>"+
"This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (<a href='http://www.openssl.org/'>http://www.openssl.org/</a>)"
onLinkActivated:{

View file

@ -47,9 +47,7 @@ Page{
function search(term){
contactSearchBusy.running=true;
try {contactsSearchModel.clear()} catch(e){};
xhr.clearParams();
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setAccount(login);
xhr.setApi("/api/v1/accounts/search");
xhr.setParam("q",term);
xhr.setParam("limit",99)

View file

@ -53,10 +53,8 @@ Item{
// update groups
var api="";
if (group.new){api="/api/friendica/group_create.json?name="+group.name}else{api="/api/friendica/group_update.json?gid="+group.id}
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setAccount(login);
xhr.setApi(api);
xhr.clearParams();
xhr.setParam("gid",group.id);
xhr.setParam("name",group.name);
xhr.setParam("user", group.user);

View file

@ -45,10 +45,8 @@ Rectangle {
property var createdAtDate: new Date(profile.friendica_owner.created_at)
function updateProfileImage(){
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setAccount(login);
xhr.setApi("/api/account/update_profile_image.json");
xhr.clearParams();
xhr.setImageFileParam("image", photoImage.source );
xhr.post();
}

View file

@ -82,8 +82,8 @@ ApplicationWindow{
function onLoginChanged(login){
if(login==""){rootstackView.push("qrc:/qml/configqml/AccountPage.qml")}
else{
if (login.newsViewType!="" || login.newsViewType!=null){
newstab.newstabstatus=login.newsViewType;}
// if (login.newsViewType!="" || login.newsViewType!=null){
// newstab.newstabstatus=login.newsViewType;}
Newsjs.getCurrentContacts(login,db,function(contacts){
contactlist=contacts})
}
@ -214,6 +214,8 @@ ApplicationWindow{
anchors.fill: parent
color: Material.backgroundDimColor
}
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Posts")
onDoubleClicked: {newstypeSignal("refresh")}
}
TabButton {
@ -222,6 +224,8 @@ ApplicationWindow{
anchors.fill: parent
color: Material.backgroundDimColor
}
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Contacts")
}
TabButton {
text: "\uf03e"
@ -229,6 +233,8 @@ ApplicationWindow{
anchors.fill: parent
color: Material.backgroundDimColor
}
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Photos")
}
TabButton {
text: "\uf073"
@ -236,6 +242,8 @@ ApplicationWindow{
anchors.fill: parent
color: Material.backgroundDimColor
}
ToolTip.visible: pressed || hovered
ToolTip.text: qsTr("Calendar")
}
}
}

View file

@ -65,6 +65,7 @@ Item {
login=account;
if(!wideScreen){leftDrawerAndroid.close()}
friendsTabView.currentIndex=0;
friendsbar.currentIndex=0;
profileLoader.source="";
profileLoader.source="qrc:/qml/contactqml/ProfileTab.qml"
}
@ -82,7 +83,8 @@ Item {
onClicked:{
login=account;
if(!wideScreen){leftDrawerAndroid.close()}
friendsTabView.currentIndex=1
friendsTabView.currentIndex=1;
friendsbar.currentIndex=1;
friendsListLoader.source="";
friendsListLoader.source="qrc:/qml/contactqml/FriendsListTab.qml"
}
@ -93,14 +95,15 @@ Item {
y:5*root.fontFactor*osSettings.bigFontSize
width:parent.width
font.pointSize: osSettings.systemFontSize
font.bold: account.username==login.username && friendsTabView.currentIndex==3
font.bold: account.username==login.username && friendsTabView.currentIndex==2
text: " "+qsTr("Groups")
MouseArea{
anchors.fill:parent
onClicked:{
login=account;
if(!wideScreen){leftDrawerAndroid.close()}
friendsTabView.currentIndex=2
friendsTabView.currentIndex=2;
friendsbar.currentIndex=2;
}
}
}

View file

@ -206,21 +206,21 @@ Rectangle{
}
}
Component.onCompleted:{
Helperjs.readData(db,"contacts",login.username,function(contacts){
for (var name in contacts){
var contactstatus="neutral";
if (contact_allow.indexOf(contacts[name].cid)>-1){contactstatus="positive"}
else if (contact_deny.indexOf(contacts[name].cid)>-1){contactstatus="negative"}
contactModel.append({"contact":contacts[name],"contactstatus":contactstatus})
}},"isFriend",1,"name");
// Component.onCompleted:{
// Helperjs.readData(db,"contacts",login.username,function(contacts){
// for (var name in contacts){
// var contactstatus="neutral";
// if (contact_allow.indexOf(contacts[name].cid)>-1){contactstatus="positive"}
// else if (contact_deny.indexOf(contacts[name].cid)>-1){contactstatus="negative"}
// contactModel.append({"contact":contacts[name],"contactstatus":contactstatus})
// }},"isFriend",1,"name");
Helperjs.readData(db,"groups",login.username,function(owngroups){
for (var number in owngroups){
var groupstatus= "neutral";
if (group_allow.indexOf(owngroups[number].gid)>-1){groupstatus="positive"}
else if (group_deny.indexOf(owngroups[number].gid)>-1){groupstatus="negative"}
groupModel.append({"group":owngroups[number],"groupstatus":groupstatus})
}});
}
// Helperjs.readData(db,"groups",login.username,function(owngroups){
// for (var number in owngroups){
// var groupstatus= "neutral";
// if (group_allow.indexOf(owngroups[number].gid)>-1){groupstatus="positive"}
// else if (group_deny.indexOf(owngroups[number].gid)>-1){groupstatus="negative"}
// groupModel.append({"group":owngroups[number],"groupstatus":groupstatus})
// }});
// }
}

View file

@ -44,10 +44,8 @@ Dialog {
modal: true
onAccepted: {
Helperjs.updateData(root.db,"contacts",login.username,"statusnet_blocking", true,function(){},"id",newsitem.user.id)
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setAccount(login);
xhr.setApi("/api/v1/accounts/" + newsitem.user.id + "/block");
xhr.clearParams();
xhr.post();
}
onRejected: {close()}

View file

@ -89,18 +89,13 @@ Page {
}
function showConversation(conversationIndex,newsitemobject){
xhr.setAccount(login);
if(newsitemobject.messagetype==0 || newsitemobject.messagetype==3){
xhr.clearParams();
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setApi("/api/conversation/show");
xhr.setParam("id",newsitemobject.id)
xhr.get();
}
else{
xhr.clearParams();
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setApi("/api/direct_messages/conversation");
xhr.setParam("uri",newsitemobject.statusnet_conversation_id)
xhr.get();
@ -218,11 +213,10 @@ Page {
height: 6*mm
text:qsTr("Approve")
onClicked:{
Helperjs.friendicaPostRequest(login,"/api/v1/follow_requests/" + contact.id + "/authorize",'',"POST",root,function(returnvalue){
})
xhr.setAccount(login);
xhr.setApi("/api/v1/follow_requests/" + contact.id + "/authorize");
xhr.post();
Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){},"id", contact.id)
//if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop()
}
@ -233,11 +227,10 @@ Page {
height: 6*mm
text:qsTr("Reject")
onClicked:{
Helperjs.friendicaPostRequest(login,"/api/v1/follow_requests/" + contact.id + "/reject",'',"POST",root,function(returnvalue){
})
xhr.setAccount(login);
xhr.setApi("/api/v1/follow_requests/" + contact.id + "/authorize");
xhr.post();
Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){},"id", contact.id)
//if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop()
}
@ -248,11 +241,10 @@ Page {
height: 6*mm
text:qsTr("Ignore")
onClicked:{
Helperjs.friendicaPostRequest(login,"/api/v1/follow_requests/" + contact.id + "/ignore",'',"POST",root,function(returnvalue){
});
xhr.setAccount(login);
xhr.setApi("/api/v1/follow_requests/" + contact.id + "/ignore");
xhr.post();
Helperjs.deleteData(root.db,"friendshiprequests",root.login.username,function(){},"id", contact.id)
//if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop()
}
@ -264,12 +256,11 @@ Page {
text:qsTr("Follow")
onClicked:{
contactBusy.running=true;
Helperjs.friendicaPostRequest(login,"/api/v1/accounts/" + contact.id + "/follow",'',"POST",root,function(returnvalue){
});
xhr.setAccount(login);
xhr.setApi("/api/v1/accounts/" + contact.id + "/follow");
xhr.post();
Helperjs.updateData(root.db,"contacts",root.login.username,"isFriend",1,function(){},"id",contact.id)
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
//if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
rootstackView.pop()
}
}
@ -281,11 +272,9 @@ Page {
text:qsTr("Unfollow")
onClicked:{
contactBusy.running=true;
Helperjs.friendicaPostRequest(login,"/api/v1/accounts/" + contact.id + "/unfollow",'',"POST",root,function(returnvalue){
});
xhr.setApi("/api/v1/accounts/" + contact.id + "/unfollow");
xhr.post();
Helperjs.updateData(root.db,"contacts",root.login.username,"isFriend",0,function(){},"id",contact.id)
//if (rootstack.currentIndex==1){root.friendsSignal(login.username)}
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop()
}
@ -299,8 +288,9 @@ Page {
onClicked:{
contactBusy.running=true;
Helperjs.updateData(root.db,"contacts",root.login.username,"statusnet_blocking",true,function(){},"id",contact.id)
Helperjs.friendicaPostRequest(login,"/api/v1/accounts/" + contact.id + "/block",'',"POST",root,function(returnvalue){
});
xhr.setAccount(login);
xhr.setApi("/api/v1/accounts/" + contact.id + "/block");
xhr.post();
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop()
}
@ -314,8 +304,9 @@ Page {
onClicked:{
contactBusy.running=true;
Helperjs.updateData(root.db,"contacts",root.login.username,"statusnet_blocking",false,function(){},"id",contact.id)
Helperjs.friendicaPostRequest(login,"/api/v1/accounts/" + contact.id + "/unblock",'',"POST",root,function(returnvalue){
});
xhr.setAccount(login);
xhr.setApi("/api/v1/accounts/" + contact.id + "/unblock");
xhr.post();
try{root.contactRefreshSignal();}catch(e){print("root.refreshSignal"+e)}
rootstackView.pop()
}
@ -368,6 +359,10 @@ Page {
if (api=="/api/statuses/user_timeline"){
Service.processNews(api,data)
}
else if (api=="/api/statuses/user_timeline"){
Service.processNews(api,data)
}
}
}
@ -402,9 +397,7 @@ Page {
}
}
Component.onCompleted: {
xhr.clearParams();
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setAccount(login);
xhr.setApi("/api/statuses/user_timeline")
xhr.setParam("user_id",contact.id)
xhr.get();

View file

@ -38,12 +38,12 @@ import "qrc:/qml/genericqml"
Page{
id:imageDialog
property var attachImageURLs: []
// property var contacts: []
// property var groups: []
// property var contact_allow:login.permissions[0]
// property var contact_deny:login.permissions[1]
// property var group_allow:login.permissions[2]
// property var group_deny:login.permissions[3]
// property var contacts: []
// property var groups: []
// property var contact_allow:login.permissions[0]
// property var contact_deny:login.permissions[1]
// property var group_allow:login.permissions[2]
// property var group_deny:login.permissions[3]
property int imageNo: 0
function uploadImage(imageid){
@ -53,10 +53,8 @@ Page{
uploadImage(imageNo);
}
} else{
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setAccount(login);
xhr.setApi("/api/media/upload");
xhr.clearParams();
//if (group_allow.length>0) {xhr.setParam("group_allow", Helperjs.cleanArray(group_allow))};
//if (group_deny.length>0) {xhr.setParam("group_deny", Helperjs.cleanArray(group_deny))};
//if (contact_allow.length>0) {xhr.setParam("contact_allow", Helperjs.cleanArray(contact_allow))};
@ -67,12 +65,9 @@ Page{
}
}
function updateAltText(imageid, media){print("media "+media + " alt_text "+imageUploadModel.get(imageid).description)
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
function updateAltText(imageid, media){
xhr.setAccount(login);
xhr.setApi("/api/media/metadata/create");
xhr.clearParams();
xhr.setParam("JSON",JSON.stringify({media_id:media,alt_text:{text:imageUploadModel.get(imageid).description}}));
xhr.postJSON();
}
@ -80,9 +75,9 @@ Page{
function attach(){
imagePicking=true;
var imagePicker = Qt.createQmlObject('import QtQuick 2.0; import "qrc:/qml/genericqml";'+
osSettings.imagePickQml+'{multiple : false;onReady: {'+
'attachImage(imageUrl)}}',imageDialog,"imagePicker");
imagePicker.pickImage()
osSettings.imagePickQml+'{multiple : false;onReady: {'+
'attachImage(imageUrl)}}',imageDialog,"imagePicker");
imagePicker.pickImage()
}
function attachImage(url){
@ -111,7 +106,7 @@ Page{
print("error "+data);
}
function onSuccess(data,api){
if (api=="/api/media/upload" ){print("data "+data);
if (api=="/api/media/upload" ){
let obj=JSON.parse(data);
messageSend.media_ids.push(obj.media_id);
if(imageUploadModel.get(imageNo).description!==""){
@ -164,13 +159,13 @@ Page{
}
BusyIndicator{
id: uploadBusy
running: false
anchors.horizontalCenter: imageUploadView.horizontalCenter
anchors.top:imageUploadView.top
anchors.topMargin: root.fontFactor*osSettings.bigFontSize
width: 2.5*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
id: uploadBusy
running: false
anchors.horizontalCenter: imageUploadView.horizontalCenter
anchors.top:imageUploadView.top
anchors.topMargin: root.fontFactor*osSettings.bigFontSize
width: 2.5*root.fontFactor*osSettings.bigFontSize
height: 2.5*root.fontFactor*osSettings.bigFontSize
}
ListModel{
@ -268,6 +263,7 @@ Page{
width: 5*root.fontFactor*osSettings.bigFontSize
height:imageUploadView.height-3*root.fontFactor*osSettings.bigFontSize
color: Material.backgroundColor
border.color: "transparent"
text:"\u002b"
fontSize: 3*osSettings.bigFontSize
onClicked:{attach()}
@ -287,7 +283,7 @@ Page{
{newimageProgress.visible=true;
if (imageUploadModel.count>0){
uploadImage(imageNo)
}}
}}
}
}
ProgressBar{

View file

@ -90,31 +90,28 @@ Rectangle{
function statusUpdate(title,status,in_reply_to_status_id) {
//xhr.url= login.server + "/api/statuses/update.json";
try{newsBusy.running=true;conversationBusy.running=true}catch(e){}
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setAccount(login);
xhr.setApi("/api/statuses/update");
xhr.clearParams();
xhr.setParam("source", "Friendiqa");
xhr.setParam("htmlstatus", status);
if (parentId!="") {xhr.setParam("in_reply_to_status_id", parentId)};
if (title!=="") {xhr.setParam("title", title)};
if (group_allow.length>0) {xhr.setParam("group_allow", Helperjs.cleanArray(group_allow))};
if (group_deny.length>0) {xhr.setParam("group_deny", Helperjs.cleanArray(group_deny))};
if (contact_allow.length>0) {xhr.setParam("contact_allow", Helperjs.cleanArray(contact_allow))};
if (contact_deny.length>0) {xhr.setParam("contact_deny", Helperjs.cleanArray(contact_deny))};
// if (group_allow.length>0) {xhr.setParam("group_allow", Helperjs.cleanArray(group_allow))};
// if (group_deny.length>0) {xhr.setParam("group_deny", Helperjs.cleanArray(group_deny))};
// if (contact_allow.length>0) {xhr.setParam("contact_allow", Helperjs.cleanArray(contact_allow))};
// if (contact_deny.length>0) {xhr.setParam("contact_deny", Helperjs.cleanArray(contact_deny))};
if (media_ids.length>0) {
xhr.setParam("media_ids", media_ids.join());
}
xhr.post();
Newsjs.storeHashtags(login,db,status,root)
Newsjs.storeHashtags(login,db,status,root);
media_ids=[]
}
function dmUpdate(title,text,replyto,screen_name) {
newsBusy.running=true;
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setAccount(login);
xhr.setApi("/api/direct_messages/new");
xhr.clearParams();
xhr.setParam("text", text);
xhr.setParam("screen_name", screen_name);
if (parentId!="") {xhr.setParam("replyto", replyto)};
@ -127,7 +124,7 @@ Rectangle{
messageSend.reply_to_user=newsitemobject.user.screen_name;
messageSend.parentId=newsitemobject.id
} else {
messageSend.state=null;
messageSend.state="";
messageSend.reply_to_user="";
messageSend.parentId="";
bodyField.text="";
@ -206,7 +203,7 @@ Rectangle{
height:stackTypeDescription.height
anchors.right: stackTypeDescription.right
anchors.rightMargin: 2*root.fontFactor*osSettings.bigFontSize
visible: newsSwipeview.currentIndex!=newsSwipeview.length-1
visible: newsSwipeview.currentIndex!=newsSwipeview.count-1
text:"\uf054"
fontColor: Material.hintTextColor
border.color: "transparent"

View file

@ -50,6 +50,7 @@ Page{
anchors.fill: parent
orientation: Qt.Horizontal
highlightRangeMode: ListView.StrictlyEnforceRange; snapMode: ListView.SnapOneItem
spacing: root.fontFactor*osSettings.systemFontSize
model:photolistModel
delegate: photoWrapper
}

View file

@ -60,7 +60,7 @@ Rectangle{
function newstypeHandling(newstype){
try{newsBusy.running=true}catch(e){print(e)};
replySignal("");
root.replySignal("");
switch(newstype){
case "timeline":
newstab.newstabstatus="Timeline";
@ -158,10 +158,8 @@ Rectangle{
newstabstatus="Search";
newsBusy.running=true;
newsStack.updateMethodNews="refresh";
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setAccount(login);
xhr.setApi("/api/search");
xhr.clearParams();
xhr.setParam("q",term)
xhr.get();}
newsView.anchors.topMargin=mm
@ -242,7 +240,7 @@ Rectangle{
];
if(newsApiArray.includes(api)){
Service.processNews(api,data)
replySignal("")
root.replySignal("")
}
}
}
@ -267,7 +265,7 @@ Rectangle{
else if (newsSwipeview.stacktype=="Replies"){
Service.updateView("Replies")
}
replySignal("")
root.replySignal("")
}
}
}
@ -365,7 +363,6 @@ Rectangle{
if (newsSwipeview.stacktype=="Home"){
Newsjs.getLastNews(root.login,root.db,function(currentlastnews){
//print("currentlastnews "+currentlastnews+ " lastnewsid "+lastnewsid)
if (currentlastnews>lastnewsid){
if(currentnewstabstatus=="Timeline"){
try{ Newsjs.newsfromdb(root.db,root.login,0, function(dbnews,lastid){
@ -379,7 +376,7 @@ Rectangle{
showNews(news)});
}
} else {
Service.updateView(currentnewstabstatus)
Service.updateView(currentnewstabstatus,currentlastnews)
}
});
}

View file

@ -52,18 +52,14 @@ Rectangle{
function showConversation(conversationIndex,newsitemobject){
if(newsitemobject.messagetype==0 || newsitemobject.messagetype==3){
xhr.clearParams();
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setAccount(login);
xhr.setApi("/api/conversation/show");
xhr.setParam("id",newsitemobject.id)
xhr.setParam("count","200")
xhr.get();
}
else{
xhr.clearParams();
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setUrl(login.server);
xhr.setAccount(login);
xhr.setApi("/api/direct_messages/conversation");
xhr.setParam("uri",newsitemobject.statusnet_conversation_id)
xhr.get();

View file

@ -53,7 +53,8 @@ Page{
visible: video.playbackState!=MediaPlayer.PlayingState
}
Video {id:video;
Video {
id:video;
anchors.fill:parent
property string mimetype:""
onErrorChanged:{noticeText.font.pointSize=osSettings.bigFontSize;noticeText.text=errorString;}
@ -61,12 +62,6 @@ Page{
autoLoad: true
autoPlay: true
audioRole: MediaPlayer.VideoRole
// MouseArea {
// anchors.fill:parent;
// onClicked:{
// rootstackView.pop()
// }
// }
}
ProgressBar{
@ -110,12 +105,13 @@ Page{
}
// Slider{ id: videoSlider
// width: parent.width
// height: 3*mm
// anchors.top: video.bottom
// visible:video.playbackState!=MediaPlayer.StoppedState && video.seekable
// value: video.position/video.duration
// onPressed:video.seek(value*video.duration)
// }
Slider{
id: videoSlider
width: parent.width
height: 3*mm
anchors.top: video.bottom
visible:video.playbackState!=MediaPlayer.StoppedState && video.seekable
value: video.position/video.duration
onMoved: video.seek(value*video.duration)
}
}

View file

@ -38,8 +38,8 @@ import "qrc:/qml/genericqml"
Item {
id: newsitem
width: newsitemobject.hasOwnProperty("indent")&&newsitemobject.indent>0?parent.width:newsitem.ListView.view.width//parent.width//newsView.width //
height:toprow.height+friendicaActivities.height+controlrow.height+conversationColumn.height+1//Math.max((itemMessage.height+topFlow.height+friendicaActivities.height+4*mm),profileImage.height+user_name.height+mm)
width: newsitemobject.hasOwnProperty("indent")&&newsitemobject.indent>0?parent.width:newsitem.ListView.view.width
height:toprow.height+friendicaActivities.height+controlrow.height+conversationColumn.height+1
property int itemindex: index
property var newsitemobject:model.newsitemobject
property string attending: ""
@ -129,7 +129,6 @@ Item {
font.pointSize: 0.6*osSettings.systemFontSize
font.family: "Noto Sans"
horizontalAlignment: Label.AlignRight
//text: (newsitemobject.in_reply_to_status_id!="null"&&newsitemobject.in_reply_to_status_id!=null)?" \u00B7 "+qsTr("In reply to ")+newsitemobject.reply_user.screen_name:" "
text: (newsitemobject.reply_user!=false&&typeof(newsitemobject.reply_user)!="undefined")?" \u00B7 "+qsTr("In reply to ")+newsitemobject.reply_user.screen_name:" "
}
}
@ -438,11 +437,6 @@ Item {
var component = Qt.createComponent("qrc:/qml/newsqml/BlockUser.qml");
var userblockdialog = component.createObject(root,{"newsitem": newsitemobject});
userblockdialog.open()
// try{
// var msg = {'deleteId': index, 'model': newsitem.ListView.view.model};
// conversationWorker.sendMessage(msg);
// }catch(e){print("block "+e)
// }
}
}
Action {

View file

@ -44,10 +44,8 @@ Dialog {
modal: true
onAccepted: {
let statusArray=[];statusArray.push(newsitem.id.toString());
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setAccount(login);
xhr.setApi("/api/v1/reports");
xhr.clearParams();
xhr.setParam("account_id",newsitem.user.id);
//xhr.setParam("status_ids",JSON.stringify(statusArray));
xhr.setParam("comment",comment.text);

View file

@ -207,7 +207,7 @@ Rectangle{
width:4.5*mm
height: 4.5*mm
textFormat:Text.RichText
font.pointSize: osSettings.osType=="Linux"?1.7*osSettings.systemFontSize:1.2*osSettings.systemFontSize
font.pointSize: osSettings.osType=="Linux"?1.7*osSettings.systemFontSize:1.4*osSettings.systemFontSize
text: emoji
MouseArea{

View file

@ -50,10 +50,8 @@ Page{
property int imageNo: 0
function uploadSelectedImage(inumber){
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setAccount(login);
xhr.setApi("/api/friendica/photo/create.json");
xhr.clearParams();
xhr.setParam("desc",imageUploadModel.get(inumber).description);
if(album.editText!=""){xhr.setParam("album", album.editText)}else{xhr.setParam("album", album.currentText)};
//if (group_allow.length>0) {xhr.setParam("group_allow", Helperjs.cleanArray(group_allow))};
@ -66,10 +64,8 @@ Page{
function updateImage(){
xhr.setUrl(login.server);
xhr.setLogin(login.username+":"+Qt.atob(login.password));
xhr.setAccount(login);
xhr.setApi("/api/friendica/photo/update.json");
xhr.clearParams();
xhr.setParam("desc",imageUploadModel.get(0).description);
xhr.setParam("album", currentAlbum);
xhr.setParam("album_new", album.currentText);

View file

@ -62,7 +62,8 @@ StackView{
}
//Imagejs.dataRequest(login,fotorectangle.newimages[0],db,xhr,fotorectangle);
})
xhr.setLogin(login.username+":"+Qt.atob(login.password));
if(login.password!=""){xhr.setLogin(login.username+":"+Qt.atob(login.password));}
else{xhr.setToken(login.token)}
xhr.setImagedir(login.imagestore);
xhr.setFilelist(ownimagelist);
xhr.setDownloadtype("picturelist");
@ -104,6 +105,13 @@ StackView{
}else{
fotorectangle.currentimageno=fotorectangle.currentimageno+1}
}
function onSuccess(text,api){
if (api=="/api/friendica/photoalbums"){
let albums=JSON.parse(text);
var msg = { 'model': photogroupModel,'albums':albums,'firstalbum':0,'foreignPicture': false};
photoWorker.sendMessage(msg);
}
}
}
// Connections{
// target:filesystem
@ -124,21 +132,24 @@ StackView{
else{
try {photogroupModel.clear()}catch (e){print(e)}
if (friend){
Imagejs.newRequestFriendsAlbumPictures(login,friend,fotorectangle,function(albums,remoteAuthBool){
remoteContact=remoteAuthBool;
var msg = {'model': photogroupModel,'albums':albums,'firstalbum':0,'foreignPicture':true,'friend':friend}
photoWorker.sendMessage(msg);
})
phototabstatusButton.text=friend.screen_name+qsTr("\'s images")
// Imagejs.newRequestFriendsAlbumPictures(login,friend,fotorectangle,function(albums,remoteAuthBool){
// remoteContact=remoteAuthBool;
// var msg = {'model': photogroupModel,'albums':albums,'firstalbum':0,'foreignPicture':true,'friend':friend}
// photoWorker.sendMessage(msg);
// })
// phototabstatusButton.text=friend.screen_name+qsTr("\'s images")
}
else {
Helperjs.readField("album", db, "imageData",login.username,function(albums){
if (albums[0]) {
var msg = { 'model': photogroupModel,'albums':albums,'firstalbum':0,'foreignPicture': false};
photoWorker.sendMessage(msg);
}
})
xhr.setAccount(login);
xhr.setApi("/api/friendica/photoalbums");
xhr.get();
// Helperjs.readField("album", db, "imageData",login.username,function(albums){
// if (albums[0]) {
// var msg = { 'model': photogroupModel,'albums':albums,'firstalbum':0,'foreignPicture': false};
// photoWorker.sendMessage(msg);
// }
// })
}
}
}
@ -291,11 +302,11 @@ StackView{
onClicked:{
var lastalbum_id=photogroupModel.count-1;
if(photogroupModel.get(photogroupModel.count-1).foreignPicture==true){
Imagejs.newRequestFriendsAlbumPictures(login,photogroupModel.get(0).friend,fotorectangle,function(albums,remoteAuthBool){
remoteContact=remoteAuthBool;
var msg = {'model': photogroupModel,'albums':albums,'firstalbum':lastalbum_id+1,'foreignPicture':true,'friend':photogroupModel.get(0).friend}
photoWorker.sendMessage(msg)
})
// Imagejs.newRequestFriendsAlbumPictures(login,photogroupModel.get(0).friend,fotorectangle,function(albums,remoteAuthBool){
// remoteContact=remoteAuthBool;
// var msg = {'model': photogroupModel,'albums':albums,'firstalbum':lastalbum_id+1,'foreignPicture':true,'friend':photogroupModel.get(0).friend}
// photoWorker.sendMessage(msg)
// })
}
else{Helperjs.readField("album",root.db, "imageData",root.login.username,function(albums){
var msg = { 'model': photogroupModel,'albums':albums,'foreignPicture': false,'firstalbum':lastalbum_id+1};

View file

@ -112,14 +112,24 @@ Package {
}
})}
else{
Helperjs.readData(db,"imageData",root.login.username,function(obj){
if (obj) {
for (var k=0;k<obj.length;k++){
if(typeof(obj[k].desc)=="string" && obj[k].desc!=""){var name=obj[k].desc}else{var name=obj[k].filename}
photoModel.append({"imageLocation": obj[k].location+obj[k].filename,"photoDescription":name,"photoLink":obj[k].location+obj[k].filename,"imageId":obj[k].id})
Helperjs.friendicaRequest(login,"/api/friendica/photoalbum?album="+albumname,parent,function(obj){
if(obj){ let albumphotos=JSON.parse(obj);
for (var k=0;k<albumphotos.length;k++){
if(typeof(albumphotos[k].desc)=="string" && albumphotos[k].desc!=""){var name=albumphotos[k].desc}else{var name=albumphotos[k].filename}
photoModel.append({"imageLocation": albumphotos[k].thumb,"photoDescription":name,"photoLink":albumphotos[k].thumb,"imageId":albumphotos[k].id})
}
}
},"album",albumname)}
}
// Helperjs.readData(db,"imageData",root.login.username,function(obj){
// if (obj) {
// for (var k=0;k<obj.length;k++){
// if(typeof(obj[k].desc)=="string" && obj[k].desc!=""){var name=obj[k].desc}else{var name=obj[k].filename}
// photoModel.append({"imageLocation": obj[k].location+obj[k].filename,"photoDescription":name,"photoLink":obj[k].location+obj[k].filename,"imageId":obj[k].id})
// }
// }
// },"album",albumname)
)}
}
MouseArea {

View file

@ -90,6 +90,22 @@
<source>Wrong password or 2FA enabled!</source>
<translation>Falsches Passwort bzw. 2FA eingeschaltet!</translation>
</message>
<message>
<source>Connect</source>
<translation>Anmelden</translation>
</message>
<message>
<source>No server given!</source>
<translation>Kein Server angegeben!</translation>
</message>
<message>
<source>Couldn&apos;t connect to server</source>
<translation>Keine Verbindung zum Server</translation>
</message>
<message>
<source>Set as default</source>
<translation>Als Standard setzen</translation>
</message>
</context>
<context>
<name>BlockUser</name>
@ -1109,7 +1125,7 @@
<name>PhotoTab</name>
<message>
<source>&apos;s images</source>
<translation>s Bilder</translation>
<translation type="vanished">s Bilder</translation>
</message>
<message>
<source>All Images</source>
@ -1431,6 +1447,22 @@ Rechtsklick oder Mittelklick zum Schliessen</translation>
<source>Click to open Friendiqa</source>
<translation>Klicken, um Friendiqa zu öffnen</translation>
</message>
<message>
<source>Posts</source>
<translation>Beiträge</translation>
</message>
<message>
<source>Contacts</source>
<translation>Kontakte</translation>
</message>
<message>
<source>Photos</source>
<translation>Fotos</translation>
</message>
<message>
<source>Calendar</source>
<translation>Kalender</translation>
</message>
</context>
<context>
<name>newsworker</name>

View file

@ -12,13 +12,13 @@
<context>
<name>AccountPage</name>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="64"/>
<location filename="../qml/configqml/AccountPage.qml" line="206"/>
<location filename="../qml/configqml/AccountPage.qml" line="228"/>
<location filename="../qml/configqml/AccountPage.qml" line="245"/>
<location filename="../qml/configqml/AccountPage.qml" line="306"/>
<location filename="../qml/configqml/AccountPage.qml" line="385"/>
<location filename="../qml/configqml/AccountPage.qml" line="406"/>
<location filename="../qml/configqml/AccountPage.qml" line="101"/>
<location filename="../qml/configqml/AccountPage.qml" line="253"/>
<location filename="../qml/configqml/AccountPage.qml" line="269"/>
<location filename="../qml/configqml/AccountPage.qml" line="285"/>
<location filename="../qml/configqml/AccountPage.qml" line="346"/>
<location filename="../qml/configqml/AccountPage.qml" line="488"/>
<location filename="../qml/configqml/AccountPage.qml" line="510"/>
<source>User</source>
<translation>Usuario</translation>
</message>
@ -27,17 +27,17 @@
<translation type="vanished">Servidor</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="229"/>
<location filename="../qml/configqml/AccountPage.qml" line="270"/>
<source>Nickname</source>
<translation>Usuario</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="248"/>
<location filename="../qml/configqml/AccountPage.qml" line="288"/>
<source>Password</source>
<translation>Contraseña</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="255"/>
<location filename="../qml/configqml/AccountPage.qml" line="295"/>
<source>Image dir.</source>
<translation>Dir. de imágenes</translation>
</message>
@ -46,51 +46,73 @@
<translation type="vanished">Noticias como</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="208"/>
<location filename="../qml/configqml/AccountPage.qml" line="255"/>
<source>Instance rules</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="233"/>
<location filename="../qml/configqml/AccountPage.qml" line="322"/>
<location filename="../qml/configqml/AccountPage.qml" line="351"/>
<location filename="../qml/configqml/AccountPage.qml" line="354"/>
<location filename="../qml/configqml/AccountPage.qml" line="65"/>
<location filename="../qml/configqml/AccountPage.qml" line="96"/>
<location filename="../qml/configqml/AccountPage.qml" line="274"/>
<location filename="../qml/configqml/AccountPage.qml" line="348"/>
<location filename="../qml/configqml/AccountPage.qml" line="405"/>
<location filename="../qml/configqml/AccountPage.qml" line="426"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="233"/>
<location filename="../qml/configqml/AccountPage.qml" line="274"/>
<source>Nicknames containing @ symbol currently not supported</source>
<translation>No se admiten los apodos que contienen el símbolo @ actualmente</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="304"/>
<location filename="../qml/configqml/AccountPage.qml" line="344"/>
<source>Connect</source>
<translation type="unfinished">Conectar</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="348"/>
<source>No server given!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="405"/>
<source>Couldn&apos;t connect to server</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="413"/>
<source>Confirm</source>
<translation>Confirmar</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="311"/>
<location filename="../qml/configqml/AccountPage.qml" line="420"/>
<source>No server given! </source>
<translation>¡Servidor no encontrado!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="312"/>
<location filename="../qml/configqml/AccountPage.qml" line="421"/>
<source>No nickname given! </source>
<translation>¡Usuario incorrecto!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="313"/>
<location filename="../qml/configqml/AccountPage.qml" line="422"/>
<source>No password given! </source>
<translation>¡Contraseña incorrecta!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="314"/>
<location filename="../qml/configqml/AccountPage.qml" line="423"/>
<source>No image directory given!</source>
<translation>¡No se ha encontrado el directorio de imágenes!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="322"/>
<location filename="../qml/configqml/AccountPage.qml" line="351"/>
<location filename="../qml/configqml/AccountPage.qml" line="432"/>
<source>Set as default</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="65"/>
<location filename="../qml/configqml/AccountPage.qml" line="96"/>
<source>Wrong password or 2FA enabled!</source>
<translation type="unfinished"></translation>
</message>
@ -99,12 +121,13 @@
<translation type="vanished">¡Contraseña incorrecta!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="348"/>
<location filename="../qml/configqml/AccountPage.qml" line="93"/>
<location filename="../qml/configqml/AccountPage.qml" line="447"/>
<source>Success</source>
<translation>éxito!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="348"/>
<location filename="../qml/configqml/AccountPage.qml" line="93"/>
<source>Name</source>
<translation>Nombre</translation>
</message>
@ -133,12 +156,12 @@
<translation>¿Borrar la cita?</translation>
</message>
<message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="201"/>
<location filename="../qml/calendarqml/CalendarTab.qml" line="199"/>
<source>Events</source>
<translation>Eventos</translation>
</message>
<message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="206"/>
<location filename="../qml/calendarqml/CalendarTab.qml" line="204"/>
<source>Own Calendar</source>
<translation>Calendario propio</translation>
</message>
@ -473,77 +496,77 @@
<translation type="vanished">Conectar</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="219"/>
<location filename="../qml/newsqml/ContactPage.qml" line="214"/>
<source>Approve</source>
<translation>Aprobar</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="234"/>
<location filename="../qml/newsqml/ContactPage.qml" line="228"/>
<source>Reject</source>
<translation>Rechazar</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="249"/>
<location filename="../qml/newsqml/ContactPage.qml" line="242"/>
<source>Ignore</source>
<translation>Ignorar</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="264"/>
<location filename="../qml/newsqml/ContactPage.qml" line="256"/>
<source>Follow</source>
<translation>Seguir</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="281"/>
<location filename="../qml/newsqml/ContactPage.qml" line="272"/>
<source>Unfollow</source>
<translation>Dejar de seguir</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="298"/>
<location filename="../qml/newsqml/ContactPage.qml" line="287"/>
<source>Block</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="313"/>
<location filename="../qml/newsqml/ContactPage.qml" line="303"/>
<source>Unblock</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<location filename="../qml/newsqml/ContactPage.qml" line="341"/>
<source>Description</source>
<translation>Descripción</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<location filename="../qml/newsqml/ContactPage.qml" line="341"/>
<source>Location</source>
<translation>Localización</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<location filename="../qml/newsqml/ContactPage.qml" line="341"/>
<source>Posts</source>
<translation>Mensajes</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="351"/>
<location filename="../qml/newsqml/ContactPage.qml" line="342"/>
<source>URL</source>
<translation>URL</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="352"/>
<location filename="../qml/newsqml/ContactPage.qml" line="343"/>
<source>Created at</source>
<translation>Creado en</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="353"/>
<location filename="../qml/newsqml/ContactPage.qml" line="344"/>
<source>Followers</source>
<translation>Seguidores</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="354"/>
<location filename="../qml/newsqml/ContactPage.qml" line="345"/>
<source>Following</source>
<translation>Siguiente</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="364"/>
<location filename="../qml/newsqml/ContactPage.qml" line="355"/>
<source>Network Error</source>
<translation>Fallo de red</translation>
</message>
@ -551,17 +574,17 @@
<context>
<name>ContactsSearchPage</name>
<message>
<location filename="../qml/contactqml/ContactsSearchPage.qml" line="62"/>
<location filename="../qml/contactqml/ContactsSearchPage.qml" line="60"/>
<source>Network Error</source>
<translation>Fallo de red</translation>
</message>
<message>
<location filename="../qml/contactqml/ContactsSearchPage.qml" line="91"/>
<location filename="../qml/contactqml/ContactsSearchPage.qml" line="89"/>
<source>Forum</source>
<translation>Foro</translation>
</message>
<message>
<location filename="../qml/contactqml/ContactsSearchPage.qml" line="93"/>
<location filename="../qml/contactqml/ContactsSearchPage.qml" line="91"/>
<source>Person</source>
<translation>Persona</translation>
</message>
@ -788,7 +811,7 @@
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="348"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="385"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="383"/>
<source>Error</source>
<translation>Error</translation>
</message>
@ -867,7 +890,7 @@
<context>
<name>ImageUploadDialog</name>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="133"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="129"/>
<source>Upload to album</source>
<translation>Subir álbum</translation>
</message>
@ -880,27 +903,27 @@
<translation type="vanished">imagen</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="277"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="273"/>
<source>Description</source>
<translation>Descripción</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="309"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="305"/>
<source>Upload</source>
<translation>Subir</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="309"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="305"/>
<source>Change</source>
<translation>Cambiar</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="312"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="308"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="312"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="308"/>
<source> No album name given</source>
<translation>¡Nombre del álbum no encontrado!</translation>
</message>
@ -926,12 +949,12 @@
<context>
<name>MessageImageUploadDialog</name>
<message>
<location filename="../qml/newsqml/MessageImageUploadDialog.qml" line="258"/>
<location filename="../qml/newsqml/MessageImageUploadDialog.qml" line="254"/>
<source>Description</source>
<translation type="unfinished">Descripción</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageImageUploadDialog.qml" line="284"/>
<location filename="../qml/newsqml/MessageImageUploadDialog.qml" line="281"/>
<source>Upload</source>
<translation type="unfinished">Subir</translation>
</message>
@ -959,7 +982,7 @@
<translation>¿Qué tienes en mente?</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="431"/>
<location filename="../qml/newsqml/MessageSend.qml" line="433"/>
<source>Error</source>
<translation>Error</translation>
</message>
@ -970,7 +993,7 @@
¡Elimine y deje un archivo adjunto!</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="431"/>
<location filename="../qml/newsqml/MessageSend.qml" line="433"/>
<source>No receiver supplied!</source>
<translation>No se ha suministrado ningún receptor!</translation>
</message>
@ -990,7 +1013,7 @@
<translation type="vanished">Fallo de red</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsStack.qml" line="286"/>
<location filename="../qml/newsqml/NewsStack.qml" line="284"/>
<source>More</source>
<translation>Mas</translation>
</message>
@ -1046,102 +1069,102 @@
<translation type="vanished">Salida</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="75"/>
<location filename="../qml/newsqml/NewsTab.qml" line="71"/>
<source>seconds</source>
<translation>Segundos</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="76"/>
<location filename="../qml/newsqml/NewsTab.qml" line="72"/>
<source>minute</source>
<translation>Minuto</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="77"/>
<location filename="../qml/newsqml/NewsTab.qml" line="73"/>
<source>minutes</source>
<translation>Minutos</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="78"/>
<location filename="../qml/newsqml/NewsTab.qml" line="74"/>
<source>hour</source>
<translation>Hora</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="79"/>
<location filename="../qml/newsqml/NewsTab.qml" line="75"/>
<source>hours</source>
<translation>Horas</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="80"/>
<location filename="../qml/newsqml/NewsTab.qml" line="76"/>
<source>day</source>
<translation>Dia</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="81"/>
<location filename="../qml/newsqml/NewsTab.qml" line="77"/>
<source>days</source>
<translation>Dias</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="82"/>
<location filename="../qml/newsqml/NewsTab.qml" line="78"/>
<source>month</source>
<translation>Mes</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="83"/>
<location filename="../qml/newsqml/NewsTab.qml" line="79"/>
<source>months</source>
<translation>Meses</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="84"/>
<location filename="../qml/newsqml/NewsTab.qml" line="80"/>
<source>years</source>
<translation>Años</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="93"/>
<location filename="../qml/newsqml/NewsTab.qml" line="89"/>
<source>likes this.</source>
<translation>le gusta esto.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="94"/>
<location filename="../qml/newsqml/NewsTab.qml" line="90"/>
<source>like this.</source>
<translation>me gusta esto.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="97"/>
<location filename="../qml/newsqml/NewsTab.qml" line="93"/>
<source>doesn&apos;t like this.</source>
<translation>no de ése.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="98"/>
<location filename="../qml/newsqml/NewsTab.qml" line="94"/>
<source>don&apos;t like this.</source>
<translation>no me gusta.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="101"/>
<location filename="../qml/newsqml/NewsTab.qml" line="97"/>
<source>will attend.</source>
<translation>asistirá.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="102"/>
<location filename="../qml/newsqml/NewsTab.qml" line="98"/>
<source>persons will attend.</source>
<translation>Personas que asistirán.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="105"/>
<location filename="../qml/newsqml/NewsTab.qml" line="101"/>
<source>will not attend.</source>
<translation>no asistirá.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="106"/>
<location filename="../qml/newsqml/NewsTab.qml" line="102"/>
<source>persons will not attend.</source>
<translation>Personas que no asistirán.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="109"/>
<location filename="../qml/newsqml/NewsTab.qml" line="105"/>
<source>may attend.</source>
<translation>Puede asistir.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="110"/>
<location filename="../qml/newsqml/NewsTab.qml" line="106"/>
<source>persons may attend.</source>
<translation>Personas que pueden asistir.</translation>
</message>
@ -1277,28 +1300,27 @@
<context>
<name>PhotoTab</name>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="132"/>
<source>&apos;s images</source>
<translation>s Imágenes</translation>
<translation type="vanished">s Imágenes</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="219"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="230"/>
<source>All Images</source>
<translation>Todas las imagenes</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="225"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="236"/>
<source>Only new</source>
<translation>Solo nueva</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="241"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="246"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="252"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="257"/>
<source>Own Images</source>
<translation>Mis imágenes</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="288"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="299"/>
<source>More</source>
<translation>Mas</translation>
</message>
@ -1306,227 +1328,227 @@
<context>
<name>ProfileComponent</name>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="63"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="61"/>
<source>profile name</source>
<translation>Nombre de perfil</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="64"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="62"/>
<source>is default</source>
<translation>es por defecto</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="65"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="63"/>
<source>hide friends</source>
<translation>ocultar amigos</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="66"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="64"/>
<source>profile photo</source>
<translation>foto de perfil</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="67"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="65"/>
<source>profile thumb</source>
<translation>foto de perfil pequeña</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="68"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="66"/>
<source>publish</source>
<translation>publicar</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="69"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="67"/>
<source>publish in network</source>
<translation>publicar en la red</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="70"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="68"/>
<source>description</source>
<translation>descripción</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="71"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="69"/>
<source>date of birth</source>
<translation>fecha de nacimiento</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="72"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="70"/>
<source>address</source>
<translation>dirección</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="73"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="71"/>
<source>city</source>
<translation>ciudad</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="74"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="72"/>
<source>region</source>
<translation>región</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="75"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="73"/>
<source>postal code</source>
<translation>código postal</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="76"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="74"/>
<source>country</source>
<translation>país</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="77"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="75"/>
<source>hometown</source>
<translation>ciudad natal</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="78"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="76"/>
<source>gender</source>
<translation>género</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="79"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="77"/>
<source>marital status</source>
<translation>estado civil</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="80"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="78"/>
<source>married with</source>
<translation>casado con</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="81"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="79"/>
<source>married since</source>
<translation>casado desde</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="82"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="80"/>
<source>sexual</source>
<translation>orientación sexual</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="83"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="81"/>
<source>politics</source>
<translation>política</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="84"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="82"/>
<source>religion</source>
<translation>religión</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="85"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="83"/>
<source>public keywords</source>
<translation>palabras clave públicas</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="86"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="84"/>
<source>private keywords</source>
<translation>palabras clave privadas</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="87"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="85"/>
<source>likes</source>
<translation>le gusta</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="88"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="86"/>
<source>dislikes</source>
<translation>no le gusta</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="89"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="87"/>
<source>about</source>
<translation>sobre</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="90"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="88"/>
<source>music</source>
<translation>música</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="91"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="89"/>
<source>book</source>
<translation>libro</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="92"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="90"/>
<source>tv</source>
<translation>tv</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="93"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="91"/>
<source>film</source>
<translation>película</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="94"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="92"/>
<source>interest</source>
<translation>interés</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="95"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="93"/>
<source>romance</source>
<translation>romance</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="96"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="94"/>
<source>work</source>
<translation>trabajo</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="97"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="95"/>
<source>education</source>
<translation>educación</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="98"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="96"/>
<source>social networks</source>
<translation>redes sociales</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="99"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="97"/>
<source>homepage</source>
<translation>página web</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="100"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="98"/>
<source>other</source>
<translation>otros</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="193"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="191"/>
<source>Update</source>
<translation>Actualización</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="227"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="225"/>
<source>profile id</source>
<translation>profile id</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="253"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="251"/>
<source>Description</source>
<translation>Descripción</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="253"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="251"/>
<source>Location</source>
<translation>Localización</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="253"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="251"/>
<source>Posts</source>
<translation>Mensajes</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="254"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="252"/>
<source>URL</source>
<translation>URL</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="255"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="253"/>
<source>Created at</source>
<translation>Creado en</translation>
</message>
@ -1539,22 +1561,22 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="65"/>
<location filename="../qml/newsqml/ReportUser.qml" line="63"/>
<source>comment</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<location filename="../qml/newsqml/ReportUser.qml" line="70"/>
<source>illegal</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<location filename="../qml/newsqml/ReportUser.qml" line="70"/>
<source>spam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<location filename="../qml/newsqml/ReportUser.qml" line="70"/>
<source>violation</source>
<translation type="unfinished"></translation>
</message>
@ -1655,14 +1677,34 @@
<translation type="vanished">Salida</translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="177"/>
<location filename="../qml/friendiqa.qml" line="178"/>
<source>Background Sync
Rightclick or Middleclick to Quit</source>
<translation>Sincronización de fondo
Haga clic con el botón derecho del ratón o con el botón central para salir.</translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="294"/>
<location filename="../qml/friendiqa.qml" line="218"/>
<source>Posts</source>
<translation type="unfinished">Mensajes</translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="228"/>
<source>Contacts</source>
<translation type="unfinished">Contactos</translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="237"/>
<source>Photos</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="246"/>
<source>Calendar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="303"/>
<source>Click to open Friendiqa</source>
<translation>Haga clic para abrir Friendiqa</translation>
</message>
@ -1780,12 +1822,12 @@ Haga clic con el botón derecho del ratón o con el botón central para salir.</
<translation type="vanished">La configuración del tipo de vista de las noticias se ha movido de la página de la cuenta a la página de configuración.</translation>
</message>
<message>
<location filename="../js/service.js" line="460"/>
<location filename="../js/service.js" line="307"/>
<source>Undefined Array Error</source>
<translation></translation>
</message>
<message>
<location filename="../js/service.js" line="463"/>
<location filename="../js/service.js" line="310"/>
<source>JSON status Error</source>
<translation></translation>
</message>

View file

@ -12,13 +12,13 @@
<context>
<name>AccountPage</name>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="64"/>
<location filename="../qml/configqml/AccountPage.qml" line="206"/>
<location filename="../qml/configqml/AccountPage.qml" line="228"/>
<location filename="../qml/configqml/AccountPage.qml" line="245"/>
<location filename="../qml/configqml/AccountPage.qml" line="306"/>
<location filename="../qml/configqml/AccountPage.qml" line="385"/>
<location filename="../qml/configqml/AccountPage.qml" line="406"/>
<location filename="../qml/configqml/AccountPage.qml" line="101"/>
<location filename="../qml/configqml/AccountPage.qml" line="253"/>
<location filename="../qml/configqml/AccountPage.qml" line="269"/>
<location filename="../qml/configqml/AccountPage.qml" line="285"/>
<location filename="../qml/configqml/AccountPage.qml" line="346"/>
<location filename="../qml/configqml/AccountPage.qml" line="488"/>
<location filename="../qml/configqml/AccountPage.qml" line="510"/>
<source>User</source>
<translation>Felhasználó</translation>
</message>
@ -27,17 +27,17 @@
<translation type="vanished">Kiszolgáló</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="229"/>
<location filename="../qml/configqml/AccountPage.qml" line="270"/>
<source>Nickname</source>
<translation>Becenév</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="248"/>
<location filename="../qml/configqml/AccountPage.qml" line="288"/>
<source>Password</source>
<translation>Jelszó</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="255"/>
<location filename="../qml/configqml/AccountPage.qml" line="295"/>
<source>Image dir.</source>
<translation>Képkönyvtár</translation>
</message>
@ -46,51 +46,73 @@
<translation type="vanished">Hírek mint</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="208"/>
<location filename="../qml/configqml/AccountPage.qml" line="255"/>
<source>Instance rules</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="233"/>
<location filename="../qml/configqml/AccountPage.qml" line="322"/>
<location filename="../qml/configqml/AccountPage.qml" line="351"/>
<location filename="../qml/configqml/AccountPage.qml" line="354"/>
<location filename="../qml/configqml/AccountPage.qml" line="65"/>
<location filename="../qml/configqml/AccountPage.qml" line="96"/>
<location filename="../qml/configqml/AccountPage.qml" line="274"/>
<location filename="../qml/configqml/AccountPage.qml" line="348"/>
<location filename="../qml/configqml/AccountPage.qml" line="405"/>
<location filename="../qml/configqml/AccountPage.qml" line="426"/>
<source>Error</source>
<translation>Hiba</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="233"/>
<location filename="../qml/configqml/AccountPage.qml" line="274"/>
<source>Nicknames containing @ symbol currently not supported</source>
<translation>A @ szimbólumot tartalmazó becenevek jelenleg nem támogatottak</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="304"/>
<location filename="../qml/configqml/AccountPage.qml" line="344"/>
<source>Connect</source>
<translation type="unfinished">Kapcsolódás</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="348"/>
<source>No server given!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="405"/>
<source>Couldn&apos;t connect to server</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="413"/>
<source>Confirm</source>
<translation>Megerősítés</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="311"/>
<location filename="../qml/configqml/AccountPage.qml" line="420"/>
<source>No server given! </source>
<translation>Nincs kiszolgáló megadva! </translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="312"/>
<location filename="../qml/configqml/AccountPage.qml" line="421"/>
<source>No nickname given! </source>
<translation>Nincs becenév megadva! </translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="313"/>
<location filename="../qml/configqml/AccountPage.qml" line="422"/>
<source>No password given! </source>
<translation>Nincs jelszó megadva! </translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="314"/>
<location filename="../qml/configqml/AccountPage.qml" line="423"/>
<source>No image directory given!</source>
<translation>Nincs képkönyvtár megadva!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="322"/>
<location filename="../qml/configqml/AccountPage.qml" line="351"/>
<location filename="../qml/configqml/AccountPage.qml" line="432"/>
<source>Set as default</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="65"/>
<location filename="../qml/configqml/AccountPage.qml" line="96"/>
<source>Wrong password or 2FA enabled!</source>
<translation type="unfinished"></translation>
</message>
@ -99,12 +121,13 @@
<translation type="vanished">Hibás jelszó!</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="348"/>
<location filename="../qml/configqml/AccountPage.qml" line="93"/>
<location filename="../qml/configqml/AccountPage.qml" line="447"/>
<source>Success</source>
<translation>Sikeres</translation>
</message>
<message>
<location filename="../qml/configqml/AccountPage.qml" line="348"/>
<location filename="../qml/configqml/AccountPage.qml" line="93"/>
<source>Name</source>
<translation>Név</translation>
</message>
@ -133,12 +156,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="201"/>
<location filename="../qml/calendarqml/CalendarTab.qml" line="199"/>
<source>Events</source>
<translation>Események</translation>
</message>
<message>
<location filename="../qml/calendarqml/CalendarTab.qml" line="206"/>
<location filename="../qml/calendarqml/CalendarTab.qml" line="204"/>
<source>Own Calendar</source>
<translation>Saját naptár</translation>
</message>
@ -489,77 +512,77 @@
<translation type="vanished">Kapcsolódás</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="219"/>
<location filename="../qml/newsqml/ContactPage.qml" line="214"/>
<source>Approve</source>
<translation>Jóváhagyás</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="234"/>
<location filename="../qml/newsqml/ContactPage.qml" line="228"/>
<source>Reject</source>
<translation>Visszautasítás</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="249"/>
<location filename="../qml/newsqml/ContactPage.qml" line="242"/>
<source>Ignore</source>
<translation>Mellőzés</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="264"/>
<location filename="../qml/newsqml/ContactPage.qml" line="256"/>
<source>Follow</source>
<translation>Követés</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="281"/>
<location filename="../qml/newsqml/ContactPage.qml" line="272"/>
<source>Unfollow</source>
<translation>Követés megszüntetése</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="298"/>
<location filename="../qml/newsqml/ContactPage.qml" line="287"/>
<source>Block</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="313"/>
<location filename="../qml/newsqml/ContactPage.qml" line="303"/>
<source>Unblock</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<location filename="../qml/newsqml/ContactPage.qml" line="341"/>
<source>Description</source>
<translation>Leírás</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<location filename="../qml/newsqml/ContactPage.qml" line="341"/>
<source>Location</source>
<translation>Hely</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="350"/>
<location filename="../qml/newsqml/ContactPage.qml" line="341"/>
<source>Posts</source>
<translation>Bejegyzések</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="351"/>
<location filename="../qml/newsqml/ContactPage.qml" line="342"/>
<source>URL</source>
<translation>URL</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="352"/>
<location filename="../qml/newsqml/ContactPage.qml" line="343"/>
<source>Created at</source>
<translation>Létrehozva</translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="353"/>
<location filename="../qml/newsqml/ContactPage.qml" line="344"/>
<source>Followers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="354"/>
<location filename="../qml/newsqml/ContactPage.qml" line="345"/>
<source>Following</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ContactPage.qml" line="364"/>
<location filename="../qml/newsqml/ContactPage.qml" line="355"/>
<source>Network Error</source>
<translation>Hálózati hiba</translation>
</message>
@ -567,17 +590,17 @@
<context>
<name>ContactsSearchPage</name>
<message>
<location filename="../qml/contactqml/ContactsSearchPage.qml" line="62"/>
<location filename="../qml/contactqml/ContactsSearchPage.qml" line="60"/>
<source>Network Error</source>
<translation>Hálózati hiba</translation>
</message>
<message>
<location filename="../qml/contactqml/ContactsSearchPage.qml" line="91"/>
<location filename="../qml/contactqml/ContactsSearchPage.qml" line="89"/>
<source>Forum</source>
<translation>fórum</translation>
</message>
<message>
<location filename="../qml/contactqml/ContactsSearchPage.qml" line="93"/>
<location filename="../qml/contactqml/ContactsSearchPage.qml" line="91"/>
<source>Person</source>
<translation>személy</translation>
</message>
@ -804,7 +827,7 @@
</message>
<message>
<location filename="../qml/calendarqml/EventCreate.qml" line="348"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="385"/>
<location filename="../qml/calendarqml/EventCreate.qml" line="383"/>
<source>Error</source>
<translation type="unfinished">Hiba</translation>
</message>
@ -894,7 +917,7 @@
<context>
<name>ImageUploadDialog</name>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="133"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="129"/>
<source>Upload to album</source>
<translation>Feltöltés albumba</translation>
</message>
@ -907,27 +930,27 @@
<translation type="vanished">Kép</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="277"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="273"/>
<source>Description</source>
<translation>Leírás</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="309"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="305"/>
<source>Upload</source>
<translation>Feltöltés</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="309"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="305"/>
<source>Change</source>
<translation>Változtatás</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="312"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="308"/>
<source>Error</source>
<translation>Hiba</translation>
</message>
<message>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="312"/>
<location filename="../qml/photoqml/ImageUploadDialog.qml" line="308"/>
<source> No album name given</source>
<translation> Nincs albumnév megadva</translation>
</message>
@ -953,12 +976,12 @@
<context>
<name>MessageImageUploadDialog</name>
<message>
<location filename="../qml/newsqml/MessageImageUploadDialog.qml" line="258"/>
<location filename="../qml/newsqml/MessageImageUploadDialog.qml" line="254"/>
<source>Description</source>
<translation type="unfinished">Leírás</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageImageUploadDialog.qml" line="284"/>
<location filename="../qml/newsqml/MessageImageUploadDialog.qml" line="281"/>
<source>Upload</source>
<translation type="unfinished">Feltöltés</translation>
</message>
@ -986,7 +1009,7 @@
<translation>Mire gondol?</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="431"/>
<location filename="../qml/newsqml/MessageSend.qml" line="433"/>
<source>Error</source>
<translation>Hiba</translation>
</message>
@ -997,7 +1020,7 @@
Először távolítsa el a másik mellékletet.</translation>
</message>
<message>
<location filename="../qml/newsqml/MessageSend.qml" line="431"/>
<location filename="../qml/newsqml/MessageSend.qml" line="433"/>
<source>No receiver supplied!</source>
<translation>Nincs fogadó megadva!</translation>
</message>
@ -1017,7 +1040,7 @@
<translation type="vanished">Hálózati hiba</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsStack.qml" line="286"/>
<location filename="../qml/newsqml/NewsStack.qml" line="284"/>
<source>More</source>
<translation>Több</translation>
</message>
@ -1077,102 +1100,102 @@
<translation type="vanished">Kilépés</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="75"/>
<location filename="../qml/newsqml/NewsTab.qml" line="71"/>
<source>seconds</source>
<translation>másodperc</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="76"/>
<location filename="../qml/newsqml/NewsTab.qml" line="72"/>
<source>minute</source>
<translation>perc</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="77"/>
<location filename="../qml/newsqml/NewsTab.qml" line="73"/>
<source>minutes</source>
<translation>perc</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="78"/>
<location filename="../qml/newsqml/NewsTab.qml" line="74"/>
<source>hour</source>
<translation>óra</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="79"/>
<location filename="../qml/newsqml/NewsTab.qml" line="75"/>
<source>hours</source>
<translation>óra</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="80"/>
<location filename="../qml/newsqml/NewsTab.qml" line="76"/>
<source>day</source>
<translation>nap</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="81"/>
<location filename="../qml/newsqml/NewsTab.qml" line="77"/>
<source>days</source>
<translation>nap</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="82"/>
<location filename="../qml/newsqml/NewsTab.qml" line="78"/>
<source>month</source>
<translation>hónap</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="83"/>
<location filename="../qml/newsqml/NewsTab.qml" line="79"/>
<source>months</source>
<translation>hónap</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="84"/>
<location filename="../qml/newsqml/NewsTab.qml" line="80"/>
<source>years</source>
<translation>év</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="93"/>
<location filename="../qml/newsqml/NewsTab.qml" line="89"/>
<source>likes this.</source>
<translation>kedveli ezt.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="94"/>
<location filename="../qml/newsqml/NewsTab.qml" line="90"/>
<source>like this.</source>
<translation>kedveli ezt.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="97"/>
<location filename="../qml/newsqml/NewsTab.qml" line="93"/>
<source>doesn&apos;t like this.</source>
<translation>nem kedveli ezt.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="98"/>
<location filename="../qml/newsqml/NewsTab.qml" line="94"/>
<source>don&apos;t like this.</source>
<translation>nem kedveli ezt.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="101"/>
<location filename="../qml/newsqml/NewsTab.qml" line="97"/>
<source>will attend.</source>
<translation>részt vesz.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="102"/>
<location filename="../qml/newsqml/NewsTab.qml" line="98"/>
<source>persons will attend.</source>
<translation>személy részt vesz.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="105"/>
<location filename="../qml/newsqml/NewsTab.qml" line="101"/>
<source>will not attend.</source>
<translation>nem vesz részt.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="106"/>
<location filename="../qml/newsqml/NewsTab.qml" line="102"/>
<source>persons will not attend.</source>
<translation>személy nem vesz részt.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="109"/>
<location filename="../qml/newsqml/NewsTab.qml" line="105"/>
<source>may attend.</source>
<translation>talán részt vesz.</translation>
</message>
<message>
<location filename="../qml/newsqml/NewsTab.qml" line="110"/>
<location filename="../qml/newsqml/NewsTab.qml" line="106"/>
<source>persons may attend.</source>
<translation>személy talán részt vesz.</translation>
</message>
@ -1308,28 +1331,27 @@
<context>
<name>PhotoTab</name>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="132"/>
<source>&apos;s images</source>
<translation> képei</translation>
<translation type="vanished"> képei</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="219"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="230"/>
<source>All Images</source>
<translation>Összes kép</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="225"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="236"/>
<source>Only new</source>
<translation>Csak újak</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="241"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="246"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="252"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="257"/>
<source>Own Images</source>
<translation>Saját képek</translation>
</message>
<message>
<location filename="../qml/photoqml/PhotoTab.qml" line="288"/>
<location filename="../qml/photoqml/PhotoTab.qml" line="299"/>
<source>More</source>
<translation>Több</translation>
</message>
@ -1337,227 +1359,227 @@
<context>
<name>ProfileComponent</name>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="63"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="61"/>
<source>profile name</source>
<translation>profilnév</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="64"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="62"/>
<source>is default</source>
<translation>alapértelmezett</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="65"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="63"/>
<source>hide friends</source>
<translation>ismerősök elrejtése</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="66"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="64"/>
<source>profile photo</source>
<translation>profilfénykép</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="67"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="65"/>
<source>profile thumb</source>
<translation>profilbélyegkép</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="68"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="66"/>
<source>publish</source>
<translation>közzététel</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="69"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="67"/>
<source>publish in network</source>
<translation>közzététel hálózaton</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="70"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="68"/>
<source>description</source>
<translation>leírás</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="71"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="69"/>
<source>date of birth</source>
<translation>születési dátum</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="72"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="70"/>
<source>address</source>
<translation>cím</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="73"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="71"/>
<source>city</source>
<translation>település</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="74"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="72"/>
<source>region</source>
<translation>régió</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="75"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="73"/>
<source>postal code</source>
<translation>irányítószám</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="76"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="74"/>
<source>country</source>
<translation>ország</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="77"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="75"/>
<source>hometown</source>
<translation>szülőváros</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="78"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="76"/>
<source>gender</source>
<translation>nem</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="79"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="77"/>
<source>marital status</source>
<translation>családi állapot</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="80"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="78"/>
<source>married with</source>
<translation>házas vele</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="81"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="79"/>
<source>married since</source>
<translation>házas ekkortól</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="82"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="80"/>
<source>sexual</source>
<translation>szexuális</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="83"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="81"/>
<source>politics</source>
<translation>politika</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="84"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="82"/>
<source>religion</source>
<translation>vallás</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="85"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="83"/>
<source>public keywords</source>
<translation>nyilvános kulcsszavak</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="86"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="84"/>
<source>private keywords</source>
<translation>személyes kulcsszavak</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="87"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="85"/>
<source>likes</source>
<translation>kedvelések</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="88"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="86"/>
<source>dislikes</source>
<translation>nem kedvelések</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="89"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="87"/>
<source>about</source>
<translation>névjegy</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="90"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="88"/>
<source>music</source>
<translation>zene</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="91"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="89"/>
<source>book</source>
<translation>könyv</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="92"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="90"/>
<source>tv</source>
<translation>TV</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="93"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="91"/>
<source>film</source>
<translation>film</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="94"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="92"/>
<source>interest</source>
<translation>érdeklődés</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="95"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="93"/>
<source>romance</source>
<translation>romantika</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="96"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="94"/>
<source>work</source>
<translation>munka</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="97"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="95"/>
<source>education</source>
<translation>oktatás</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="98"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="96"/>
<source>social networks</source>
<translation>közösségi hálózatok</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="99"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="97"/>
<source>homepage</source>
<translation>honlap</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="100"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="98"/>
<source>other</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="193"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="191"/>
<source>Update</source>
<translation>Frissítés</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="227"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="225"/>
<source>profile id</source>
<translation>profilazonosító</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="253"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="251"/>
<source>Description</source>
<translation>Leírás</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="253"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="251"/>
<source>Location</source>
<translation>Hely</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="253"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="251"/>
<source>Posts</source>
<translation>Bejegyzések</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="254"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="252"/>
<source>URL</source>
<translation>URL</translation>
</message>
<message>
<location filename="../qml/contactqml/ProfileComponent.qml" line="255"/>
<location filename="../qml/contactqml/ProfileComponent.qml" line="253"/>
<source>Created at</source>
<translation>Létrehozva</translation>
</message>
@ -1570,22 +1592,22 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="65"/>
<location filename="../qml/newsqml/ReportUser.qml" line="63"/>
<source>comment</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<location filename="../qml/newsqml/ReportUser.qml" line="70"/>
<source>illegal</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<location filename="../qml/newsqml/ReportUser.qml" line="70"/>
<source>spam</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/newsqml/ReportUser.qml" line="72"/>
<location filename="../qml/newsqml/ReportUser.qml" line="70"/>
<source>violation</source>
<translation type="unfinished"></translation>
</message>
@ -1686,14 +1708,34 @@
<translation type="vanished">Kilépés</translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="177"/>
<location filename="../qml/friendiqa.qml" line="178"/>
<source>Background Sync
Rightclick or Middleclick to Quit</source>
<translation>Háttérszinkronizálás
Kilépéshez kattintson a jobb gombbal vagy középső gombbal</translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="294"/>
<location filename="../qml/friendiqa.qml" line="218"/>
<source>Posts</source>
<translation type="unfinished">Bejegyzések</translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="228"/>
<source>Contacts</source>
<translation type="unfinished">Partnerek</translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="237"/>
<source>Photos</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="246"/>
<source>Calendar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/friendiqa.qml" line="303"/>
<source>Click to open Friendiqa</source>
<translation>Kattintson a Friendiqa megnyitásához</translation>
</message>
@ -1811,12 +1853,12 @@ Kilépéshez kattintson a jobb gombbal vagy középső gombbal</translation>
<translation type="vanished">A hírek nézettípusának beállítása át lett helyezve a fiókoldalról a beállítási oldalra.</translation>
</message>
<message>
<location filename="../js/service.js" line="460"/>
<location filename="../js/service.js" line="307"/>
<source>Undefined Array Error</source>
<translation>Meghatározatlan tömbhiba</translation>
</message>
<message>
<location filename="../js/service.js" line="463"/>
<location filename="../js/service.js" line="310"/>
<source>JSON status Error</source>
<translation>JSON-állapothiba</translation>
</message>

File diff suppressed because it is too large Load diff