2017-01-26 21:55:31 +01:00
//.pragma library
. import QtQuick . LocalStorage 2.0 as Sql
. import "qrc:/js/helper.js" as Helperjs
. import "qrc:/js/news.js" as Newsjs
// IMAGE FUNCTIONS
function requestList ( login , database , rootwindow , callback ) {
//get list of own images and call download function
Helperjs . friendicaRequest ( login , "/api/friendica/photos/list" , rootwindow , function ( helperobject ) {
//print("return"+helperobject);
var obj = JSON . parse ( helperobject ) ;
Helperjs . readField ( "id" , database , "imageData" , login . username , function ( AllStoredImages ) {
if ( AllStoredImages . length > 0 ) {
for ( var i = 0 ; i < AllStoredImages . length ; i ++ ) {
var position = Helperjs . inArray ( obj , "resourceID" , AllStoredImages [ i ] ) ;
if ( position > - 1 ) { obj . splice ( position , 1 ) }
//obj.splice(obj.indexOf(AllStoredImages[i]),1);// list of objects instead of list!!!
} }
callback ( obj )
} )
} ) }
function dataRequest ( login , photoID , database , rootwindow ) {
// check if image exist and call download function
Helperjs . friendicaRequest ( login , "/api/friendica/photo?photo_id=" + photoID , rootwindow , function ( image ) {
try { if ( image == "" ) { currentimageno = currentimageno + 1 } else {
var obj = JSON . parse ( image ) ;
var helpfilename = obj . filename . substring ( 0 , obj . filename . lastIndexOf ( "." ) ) ;
var filesuffix = "" ;
if ( obj . type == "image/jpeg" ) { filesuffix = ".jpg" }
else if ( obj . type == "image/png" ) { filesuffix = ".png" }
else { filesuffix = "" }
if ( helpfilename == "" ) { // check if file has any filename
obj . filename = obj [ "id" ] + filesuffix ;
}
else { obj . filename = helpfilename + filesuffix }
var link = "" ;
if ( obj [ "link" ] [ 0 ] ) { link = obj [ "link" ] [ 0 ] } else { link = obj [ "link" ] [ "4" ] }
xhr . setUrl ( Qt . resolvedUrl ( link ) ) ;
xhr . setFilename ( login . imagestore + 'albums/' + obj . album + "/" + obj [ "filename" ] ) ;
xhr . setDownloadtype ( "picture" ) ;
xhr . download ( ) ;
var db = Sql . LocalStorage . openDatabaseSync ( database [ 0 ] , database [ 1 ] , database [ 2 ] , database [ 3 ] ) ;
db . transaction ( function ( tx ) {
var result = tx . executeSql ( 'SELECT * from imageData where id = "' + obj [ "id" ] + '"' ) ;
if ( result . rows . length === 1 ) { // use update
result = tx . executeSql ( 'UPDATE imageData SET username ="' + login . username + '",id="' + obj . id + '", created="' + obj . created + '", edited="' + obj . edited + '", profile="' + obj . profile + '", link="' + obj [ "link" ] [ "4" ] + '", filename="' + obj . filename + '",title="' + obj . title + '", desc="' + obj . desc + '", type="' + obj . type + '", width="' + obj . width + '", height="' + obj . height + '", album="' + obj . album + '", location="file://' + login . imagestore + 'albums/' + obj . album + '/" where id="' + obj [ "id" ] + '"' ) ;
} else { // use insert print('... does not exists, create it')
result = tx . executeSql ( 'INSERT INTO imageData VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)' , [ login . username , obj . id , obj . created , obj . edited , obj . title , obj . desc , obj . album , obj . filename , obj . type , obj . height , obj . width , obj . profile , obj [ "link" ] [ "4" ] , 'file://' + login . imagestore + 'albums/' + obj . album + "/" ] ) ;
}
} ) } }
catch ( e ) { print ( "Data retrieval failure! " + e + obj ) ; }
} ) }
function deleteImageData ( database , user , field , selection , callback ) { // does nothing useful at the moment
var db = Sql . LocalStorage . openDatabaseSync ( database [ 0 ] , database [ 1 ] , database [ 2 ] , database [ 3 ] ) ;
//print(' delete Image Data() for ' + field +"="+selection)
db . transaction ( function ( tx ) {
result = tx . executeSql ( 'UPDATE imageData SET data="" where ' + field + '="' + selection + '"' ) ;
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 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 )
} )
}
// CONFIG FUNCTIONS
function initDatabase ( database ) { // initialize the database object
var db = Sql . LocalStorage . openDatabaseSync ( database [ 0 ] , database [ 1 ] , database [ 2 ] , database [ 3 ] ) ;
print ( 'initDatabase()' + database [ 0 ] + database [ 1 ] + database [ 2 ] + database [ 3 ] )
db . transaction ( function ( tx ) {
tx . executeSql ( 'CREATE TABLE IF NOT EXISTS imageData(username TEXT,id INT, created TEXT,edited TEXT, title TEXT, desc TEXT, album TEXT,filename TEXT, type TEXT, height INT, width INT, profile INT, link TEXT,location TEXT)' ) ;
2017-03-25 23:36:14 +01:00
tx . executeSql ( 'CREATE TABLE IF NOT EXISTS config(server TEXT, username TEXT, password TEXT, imagestore TEXT, maxnews INT, timerInterval INT, newsViewType TEXT,isActive INT, permissions TEXT,maxContactAge INT,APIVersion TEXT,layout TEXT, addons TEXT)' ) ;
tx . executeSql ( 'CREATE TABLE IF NOT EXISTS news(username TEXT, messagetype INT, text TEXT, created_at INT, in_reply_to_status_id INT, source TEXT, status_id INT, in_reply_to_user_id INT, geo TEXT,favorited TEXT, uid INT, statusnet_html TEXT, statusnet_conversation_id TEXT,friendica_activities TEXT, friendica_activities_self TEXT, attachments TEXT, friendica_owner INT)' ) ;
2017-01-26 21:55:31 +01:00
tx . executeSql ( 'CREATE TABLE IF NOT EXISTS contacts(username TEXT, id INT, name TEXT, screen_name TEXT, location TEXT,imageAge INT, profile_image_url TEXT, description TEXT, profile_image BLOB, url TEXT, protected TEXT, followers_count INT, friends_count INT, created_at INT, favourites_count TEXT, utc_offset TEXT, time_zone TEXT, statuses_count INT, following TEXT, verified TEXT, statusnet_blocking TEXT, notifications TEXT, statusnet_profile_url TEXT, cid INT, network TEXT, isFriend INT)' ) ;
tx . executeSql ( 'CREATE TABLE IF NOT EXISTS groups(username TEXT, groupname TEXT, gid INT, members TEXT)' ) ;
} ) }
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 )
db . transaction ( function ( tx ) {
var result = tx . executeSql ( 'UPDATE config SET permissions="' + permissions + '" WHERE username="' + obj . username + '"' ) ;
} )
}
function storeConfig ( database , obj ) { // stores config to DB
var db = Sql . LocalStorage . openDatabaseSync ( database [ 0 ] , database [ 1 ] , database [ 2 ] , database [ 3 ] ) ;
db . transaction ( function ( tx ) {
2017-03-25 23:36:14 +01:00
//print(JSON.stringify(obj));
2017-01-26 21:55:31 +01:00
var result = tx . executeSql ( 'SELECT * from config WHERE username="' + obj . username + '"' ) ;
if ( result . rows . length === 1 ) { // use update
2017-03-25 23:36:14 +01:00
var result2 = tx . executeSql ( 'UPDATE config SET server="' + obj . server + '",password="' + obj . password + '", imagestore="' + obj . imagestore + '", maxnews=' + obj . maxnews + ', timerInterval=' + obj . interval + ', newsViewType="' + obj . newsViewType + '", isActive=0 WHERE username="' + obj . username + '"' ) ;
2017-01-26 21:55:31 +01:00
var result3 = tx . executeSql ( 'UPDATE config SET isActive=1 WHERE username !="' + obj . username + '"' ) ;
var result4 = tx . executeSql ( 'UPDATE config SET maxnews=' + obj . maxnews ) ;
} else { // use insert print('... does not exists, create it')
2017-03-25 23:36:14 +01:00
var result2 = tx . executeSql ( 'INSERT INTO config VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)' , [ obj . server , obj . username , obj . password , obj . imagestore , obj . maxnews , obj . interval , obj . newsViewType , 0 , "[[],[],[],[]]" , 0 , "" , "" , "" ] ) ;
2017-01-26 21:55:31 +01:00
var result3 = tx . executeSql ( 'UPDATE config SET isActive=1 WHERE username !="' + obj . username + '"' ) ;
var result4 = tx . executeSql ( 'UPDATE config SET maxnews=' + obj . maxnews ) ;
}
} ) }
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 + "'}" ;
2017-03-25 23:36:14 +01:00
var db = Sql . LocalStorage . openDatabaseSync ( database [ 0 ] , database [ 1 ] , database [ 2 ] , database [ 3 ] ) ;
2017-01-26 21:55:31 +01:00
db . transaction ( function ( tx ) {
var result = tx . executeSql ( 'UPDATE config SET APIVersion="' + serverconfig . site . friendica . FRIENDICA _VERSION + '" WHERE username="' + login . username + '"' ) } )
2017-03-25 23:36:14 +01:00
Helperjs . friendicaRequest ( login , "/friendica/json" , rootwindow , function ( obj ) {
var serverData = JSON . parse ( obj ) ; var serverAddons = JSON . stringify ( serverData . plugins ) . replace ( /"/g , "" ) ;
db . transaction ( function ( tx ) {
var result = tx . executeSql ( 'UPDATE config SET addons="' + serverAddons + '" WHERE username="' + login . username + '"' ) } )
callback ( serverconfigString ) ;
} ) } ) }
2017-01-26 21:55:31 +01:00
catch ( e ) { callback ( e ) ;
} }
function readConfig ( database , callback , filter , filtervalue ) { // reads config
if ( filter ) { var where = " WHERE " + filter + " = '" + filtervalue + "'" } else { var where = "" }
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 ) )
}
2017-03-25 23:36:14 +01:00
var rsObject = { server : rsArray [ 0 ] . server , username : rsArray [ 0 ] . username , password : rsArray [ 0 ] . password , imagestore : rsArray [ 0 ] . imagestore , maxnews : rsArray [ 0 ] . maxnews , isActive : rsArray [ 0 ] . isActive , timerInterval : rsArray [ 0 ] . timerInterval , newsViewType : rsArray [ 0 ] . newsViewType , permissions : JSON . parse ( rsArray [ 0 ] . permissions ) , maxContactAge : rsArray [ 0 ] . maxContactAge , APIVersion : rsArray [ 0 ] . APIVersion , addons : rsArray [ 0 ] . addons } ;
2017-01-26 21:55:31 +01:00
} else { var rsObject = "" }
callback ( rsObject ) } }
)
}
function readActiveConfig ( database ) {
var obj ;
readConfig ( database , function ( config ) { obj = config } , "isActive" , 0 ) ;
return obj ;
}
function deleteConfig ( database , userobj , callback ) { // delete user data from DB
if ( userobj ) { var where = " WHERE username='" + userobj . username + "' and server='" + userobj . server + "'" ; } else { return "no user selected!" ; }
var db = Sql . LocalStorage . openDatabaseSync ( database [ 0 ] , database [ 1 ] , database [ 2 ] , database [ 3 ] ) ;
if ( ! db ) { return ; }
db . transaction ( function ( tx ) {
var rs = tx . executeSql ( 'delete from config' + where ) ;
callback ( rs ) ;
} )
}
function cleanNews ( database , callback ) {
var db = Sql . LocalStorage . openDatabaseSync ( database [ 0 ] , database [ 1 ] , database [ 2 ] , database [ 3 ] ) ;
db . transaction ( function ( tx ) {
var maxnewsrs = tx . executeSql ( "SELECT DISTINCT maxnews FROM config" ) ;
var maxnews = maxnewsrs . rows . item ( 0 ) . maxnews ;
var newscountrs = tx . executeSql ( 'SELECT COUNT(*) from news' ) ;
var newscount = newscountrs . rows . item ( 0 ) [ "COUNT(*)" ] ;
if ( newscount > maxnews ) { var lastvalidtimers = tx . executeSql ( 'select created_at from news ORDER BY created_at DESC LIMIT ' + ( newscount - maxnews ) ) ;
var lastvalidtime = lastvalidtimers . rows . item ( maxnews ) . created _at ;
var deleters = tx . executeSql ( 'DELETE from news WHERE created_at<=' + lastvalidtime ) }
callback ( )
} )
}
function processNews ( callback ) {
2017-01-29 17:26:09 +01:00
// Newsjs.getCurrentContacts(login,db,function(contacts){
// contactlist=contacts});
2017-01-26 21:55:31 +01:00
if ( contactLoadType == "news" ) {
if ( root . news . length == 0 ) { }
else { // show news
Newsjs . storeNews ( login , db , news , root , function ( dbnews ) {
root . newsSignal ( dbnews ) ;
newstab . newstabstatus = login . newsViewType
} ) }
}
else if ( contactLoadType == "friends" ) { // show friends
root . friendsSignal ( login . username ) ;
Newsjs . getCurrentContacts ( login , db , function ( contacts ) {
contactlist = contacts ;
} ) }
else if ( contactLoadType == "conversation" ) {
var conversationid = news [ 0 ] . statusnet _conversation _id
if ( ! isNaN ( parseInt ( conversationid ) ) ) { //no directmessage conversation
Newsjs . storeNews ( root . login , root . db , news , root , function ( ) {
Newsjs . conversationfromdb ( db , root . login . username , conversationid , function ( newsarray ) {
newstab . conversation = newsarray ;
} )
} ) }
else { newstab . conversation = news } //only DM conversations from database
}
else if ( contactLoadType == "favorites" ) { //show favorited news
Newsjs . storeNews ( root . login , root . db , news , root , function ( ) {
Newsjs . favoritesfromdb ( db , login . username , function ( newsarray ) {
root . newsSignal ( newsarray ) ;
newstab . newstabstatus = "Favorites" ;
} )
} ) }
callback ( )
}
function updateContactInDB ( login , database , isFriend , contact ) { // for newstab and friendstab
2017-03-25 23:36:14 +01:00
// var suffix=contact.profile_image_url.substring(contact.profile_image_url.lastIndexOf("."), contact.profile_image_url.length);
// var imagename=login.imagestore+"contacts/"+contact.screen_name.trim()+suffix;
var imagename = login . imagestore + "contacts/" + contact . screen _name + "-" + contact . profile _image _url . substring ( contact . profile _image _url . lastIndexOf ( "/" ) + 1 , contact . profile _image _url . length ) ;
2017-01-26 21:55:31 +01:00
contacttimer . restart ( ) ;
var currentTime = Date . now ( ) ;
xhr . setUrl ( Qt . resolvedUrl ( contact . profile _image _url ) ) ;
xhr . setFilename ( imagename ) ;
xhr . setDownloadtype ( "contact" ) ;
xhr . download ( ) ;
var db = Sql . LocalStorage . openDatabaseSync ( database [ 0 ] , database [ 1 ] , database [ 2 ] , database [ 3 ] ) ;
var result ;
db . transaction ( function ( tx ) {
2017-03-25 23:36:14 +01:00
result = tx . executeSql ( 'SELECT * from contacts where username="' + login . username + '" AND url = "' + contact . url + '"' ) ; // check for news url
2017-01-26 21:55:31 +01:00
if ( result . rows . length === 1 ) { // use update
2017-03-25 23:36:14 +01:00
result = tx . executeSql ( 'UPDATE contacts SET id=' + contact . id + ', name="' + Qt . btoa ( contact . name ) + '", screen_name="' + contact . screen _name + '", location="' + contact . location + '",imageAge=' + currentTime + ', profile_image_url="' + contact . profile _image _url + '", description="' + Qt . btoa ( contact . description ) + '", profile_image="' + imagename + '", protected="' + contact . protected + '", followers_count=' + contact . followers _count + ', friends_count=' + contact . friends _count + ', created_at="' + Date . parse ( Newsjs . cleanDate ( contact . created _at ) ) + '", favourites_count="' + contact . favorites _count + '", utc_offset="' + contact . utc _offset + '", time_zone="' + contact . time _zone + '", statuses_count=' + contact . statuses _count + ', following="' + contact . following + '", verified ="' + contact . verified + '", statusnet_blocking="' + contact . statusnet _blocking + '", notifications="' + contact . notifictions + '", statusnet_profile_url="' + contact . statusnet _profile _url + '", cid=' + contact . cid + ', network="' + contact . network + '", isFriend=' + isFriend + ' where username="' + login . username + '" AND url="' + contact . url + '"' ) ;
2017-01-26 21:55:31 +01:00
} else { // use insert
result = tx . executeSql ( 'INSERT INTO contacts VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)' , [ login . username , contact . id , Qt . btoa ( contact . name ) , contact . screen _name , contact . location , currentTime , contact . profile _image _url , Qt . btoa ( contact . description ) , imagename , contact . url , contact . protected , contact . followers _count , contact . friends _count , Date . parse ( Newsjs . cleanDate ( contact . created _at ) ) , contact . favorites _count , contact . utc _offset , contact . time _zone , contact . statuses _count , contact . following , contact . verfied , contact . statusnet _blocking , contact . notifications , contact . statusnet _profile _url , contact . cid , contact . network , isFriend ] ) ; }
} ) ;
}