From efd14e44651554eff1343729e5805ddeeb213e92 Mon Sep 17 00:00:00 2001 From: Angela Mazzurco Date: Wed, 6 Sep 2017 18:48:51 +0200 Subject: [PATCH 01/58] Fix correct indent style --- .../src/components/emoji/EmojiButton.qml | 36 ++++++++----- .../components/emoji/EmojiCategoryButton.qml | 48 +++++++++++------ .../src/components/emoji/EmojiPicker.qml | 51 ++++++++++++------- 3 files changed, 90 insertions(+), 45 deletions(-) diff --git a/retroshare-qml-app/src/components/emoji/EmojiButton.qml b/retroshare-qml-app/src/components/emoji/EmojiButton.qml index 3720d9f5c..34408b2e2 100644 --- a/retroshare-qml-app/src/components/emoji/EmojiButton.qml +++ b/retroshare-qml-app/src/components/emoji/EmojiButton.qml @@ -1,12 +1,14 @@ import QtQuick 2.7 import QtQuick.Controls.Styles 1.2 -Rectangle { +Rectangle +{ id: emojiButton property var fontName - Text { + Text + { id: emojiText color: "gray" text: qsTr(eCatText) @@ -17,17 +19,22 @@ Rectangle { state: "RELEASED" - states: [ - State { + states: + [ + State + { name: "PRESSED" - PropertyChanges { + PropertyChanges + { target: emojiText font.pixelSize: emojiButton.width - 10 } }, - State { + State + { name: "RELEASED" - PropertyChanges { + PropertyChanges + { target: emojiText font.pixelSize: emojiButton.width - 8 } @@ -35,20 +42,25 @@ Rectangle { ] - MouseArea { + MouseArea + { anchors.fill: parent hoverEnabled: true - onEntered: { + onEntered: + { emojiText.color = "black" } - onExited: { + onExited: + { emojiText.color = "gray" } - onPressedChanged: { + onPressedChanged: + { emojiButton.state = emojiButton.state == "PRESSED" ? "RELEASED" : "PRESSED" } - onClicked: { + onClicked: + { Qt.emojiClickedHandler(emojiText.text) } } diff --git a/retroshare-qml-app/src/components/emoji/EmojiCategoryButton.qml b/retroshare-qml-app/src/components/emoji/EmojiCategoryButton.qml index 12983cf5b..251d8f70e 100644 --- a/retroshare-qml-app/src/components/emoji/EmojiCategoryButton.qml +++ b/retroshare-qml-app/src/components/emoji/EmojiCategoryButton.qml @@ -1,30 +1,37 @@ import QtQuick 2.7 import QtQuick.Controls.Styles 1.2 -Rectangle { +Rectangle +{ id: emojiCategoryButton property string categoryName property var fontName - function completedHandler() { + function completedHandler() + { categoryName = eCatName //initialize - if (parent.currSelEmojiButton === undefined) { + if (parent.currSelEmojiButton === undefined) + { clickedHandler() } } - function pressedHandler() { - if (state != "SELECTED") { + function pressedHandler() + { + if (state != "SELECTED") + { state = state == "PRESSED" ? "RELEASED" : "PRESSED" } } - function clickedHandler() { - if (parent.currSelEmojiButton !== undefined) { + function clickedHandler() + { + if (parent.currSelEmojiButton !== undefined) + { parent.currSelEmojiButton.state = "RELEASED" } @@ -34,7 +41,8 @@ Rectangle { } - Text { + Text + { id: emojiText color: "gray" text: qsTr(eCatText) @@ -45,31 +53,39 @@ Rectangle { state: "RELEASED" - states: [ - State { + states: + [ + State + { name: "PRESSED" - PropertyChanges { + PropertyChanges + { target: emojiText font.pixelSize: emojiCategoryButton.width - 10 } }, - State { + State + { name: "RELEASED" - PropertyChanges { + PropertyChanges + { target: emojiText font.pixelSize: emojiCategoryButton.width - 8 } }, - State { + State + { name: "SELECTED" - PropertyChanges { + PropertyChanges + { target: emojiCategoryButton color: "#ADD6FF" } } ] - MouseArea { + MouseArea + { anchors.fill: parent hoverEnabled: true onEntered: emojiText.color = "black" diff --git a/retroshare-qml-app/src/components/emoji/EmojiPicker.qml b/retroshare-qml-app/src/components/emoji/EmojiPicker.qml index f99d8f444..20c1072d1 100644 --- a/retroshare-qml-app/src/components/emoji/EmojiPicker.qml +++ b/retroshare-qml-app/src/components/emoji/EmojiPicker.qml @@ -2,7 +2,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.0 import "emoji.js" as EmojiJSON -Rectangle { +Rectangle +{ id: emojiPicker property EmojiCategoryButton currSelEmojiButton property variant emojiParsedJson @@ -12,23 +13,27 @@ Rectangle { property var rootFontName: theme.emojiFontName //displays all Emoji of one categroy by modifying the ListModel of emojiGrid - function categoryChangedHandler (newCategoryName){ + function categoryChangedHandler (newCategoryName) + { emojiByCategory.clear() - for (var i = 0; i < emojiParsedJson.emoji_by_category[newCategoryName].length; i++) { + for (var i = 0; i < emojiParsedJson.emoji_by_category[newCategoryName].length; i++) + { var elem = emojiParsedJson.emoji_by_category[newCategoryName][i] emojiByCategory.append({eCatName: newCategoryName, eCatText: elem}) } } //adds the clicked Emoji (and one ' ' if the previous character isn't an Emoji) to textArea - function emojiClickedHandler(selectedEmoji) { + function emojiClickedHandler(selectedEmoji) + { var strAppnd = "" var plainText = textArea.getText(0, textArea.length) if (plainText.length > 0) { var lastChar = plainText[plainText.length-1] - if ((lastChar !== ' ') && (lastChar.charCodeAt(0) < 255)) { + if ((lastChar !== ' ') && (lastChar.charCodeAt(0) < 255)) + { strAppnd = " " } } @@ -38,10 +43,12 @@ Rectangle { } //parses JSON, publishes button handlers and inits textArea - function completedHandler() { + function completedHandler() + { // emojiParsedJson = JSON.parse(EmojiJSON.emoji_json) emojiParsedJson = EmojiJSON.emoji_json - for (var i = 0; i < emojiParsedJson.emoji_categories.length; i++) { + for (var i = 0; i < emojiParsedJson.emoji_categories.length; i++) + { var elem = emojiParsedJson.emoji_categories[i] emojiCategoryButtons.append({eCatName: elem.name, eCatText: elem.emoji_unified}) } @@ -56,21 +63,25 @@ Rectangle { //checks if the previous character is an Emoji and adds a ' ' if that's the case //this is necessary, because Emoji use a bigger font-size, and that font-size is kept using without a ' ' - function keyPressedHandler(event) { + function keyPressedHandler(event) + { var testStr = textArea.getText(textArea.length-2, textArea.length) var ptrn = new RegExp("[\uD800-\uDBFF][\uDC00-\uDFFF]") - if ((event.key !== Qt.Key_Backspace) && (ptrn.test(testStr))) { + if ((event.key !== Qt.Key_Backspace) && (ptrn.test(testStr))) + { textArea.text += " " textArea.cursorPosition = textArea.length } } //all emoji of one category - ListModel { + ListModel + { id: emojiByCategory } - GridView { + GridView + { id: emojiGrid width: parent.width anchors.fill: parent @@ -78,7 +89,8 @@ Rectangle { cellWidth: buttonWidth; cellHeight: buttonWidth model: emojiByCategory - delegate: EmojiButton { + delegate: EmojiButton + { width: buttonWidth height: buttonWidth color: emojiPicker.color @@ -88,13 +100,15 @@ Rectangle { //seperator - Rectangle { + Rectangle + { color: emojiPicker.color anchors.bottom: parent.bottom width: parent.width height: buttonWidth } - Rectangle { + Rectangle + { color: "black" anchors.bottom: parent.bottom anchors.bottomMargin: buttonWidth @@ -103,14 +117,16 @@ Rectangle { } //emoji category selector - ListView { + ListView + { width: parent.width anchors.bottom: parent.bottom anchors.bottomMargin: buttonWidth orientation: ListView.Horizontal model: emojiCategoryButtons - delegate: EmojiCategoryButton { + delegate: EmojiCategoryButton + { width: buttonWidth height: buttonWidth color: emojiPicker.color @@ -118,7 +134,8 @@ Rectangle { } } - ListModel { + ListModel + { id: emojiCategoryButtons } From 9386657955881bbe0b6bf7b531dab6fc0b4ae911 Mon Sep 17 00:00:00 2001 From: Angela Mazzurco Date: Wed, 6 Sep 2017 18:50:20 +0200 Subject: [PATCH 02/58] Fix horizontal scroll on category selection --- .../src/components/emoji/EmojiPicker.qml | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/retroshare-qml-app/src/components/emoji/EmojiPicker.qml b/retroshare-qml-app/src/components/emoji/EmojiPicker.qml index 20c1072d1..e30b84322 100644 --- a/retroshare-qml-app/src/components/emoji/EmojiPicker.qml +++ b/retroshare-qml-app/src/components/emoji/EmojiPicker.qml @@ -100,38 +100,37 @@ Rectangle //seperator + Rectangle + { + color: "black" + anchors.bottom: parent.bottom + anchors.bottomMargin: buttonWidth + width: parent.width + height: 1 + } Rectangle { color: emojiPicker.color anchors.bottom: parent.bottom width: parent.width height: buttonWidth - } - Rectangle - { - color: "black" - anchors.bottom: parent.bottom - anchors.bottomMargin: buttonWidth - width: parent.width - height: 1 - } - //emoji category selector - ListView - { - width: parent.width - anchors.bottom: parent.bottom - anchors.bottomMargin: buttonWidth - orientation: ListView.Horizontal - - model: emojiCategoryButtons - delegate: EmojiCategoryButton + //emoji category selector + ListView { - width: buttonWidth - height: buttonWidth - color: emojiPicker.color - fontName: rootFontName - } + width: parent.width + orientation: ListView.Horizontal + anchors.fill: parent + + model: emojiCategoryButtons + delegate: EmojiCategoryButton + { + width: buttonWidth + height: buttonWidth + color: emojiPicker.color + fontName: rootFontName + } + } } ListModel From cfe44be1287f5ad0f0db0d2efadc8d3e7117786a Mon Sep 17 00:00:00 2001 From: Angela Mazzurco Date: Wed, 6 Sep 2017 20:23:33 +0200 Subject: [PATCH 03/58] Fix close android keyboard when emoji menu is shown --- retroshare-qml-app/src/ChatView.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/retroshare-qml-app/src/ChatView.qml b/retroshare-qml-app/src/ChatView.qml index 8a814545b..e9d87ca6a 100644 --- a/retroshare-qml-app/src/ChatView.qml +++ b/retroshare-qml-app/src/ChatView.qml @@ -284,6 +284,7 @@ Item onClicked: { if (emojiPicker.state == "EMOJI_HIDDEN") { emojiPicker.state = "EMOJI_SHOWN" + Qt.inputMethod.hide(); } else { emojiPicker.state = "EMOJI_HIDDEN" } From f435fcda28d44e45cdd63f654e7b99a6312edd10 Mon Sep 17 00:00:00 2001 From: Angela Mazzurco Date: Thu, 7 Sep 2017 17:59:53 +0200 Subject: [PATCH 04/58] Implement android layout --- .../src/components/emoji/EmojiPicker.qml | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/retroshare-qml-app/src/components/emoji/EmojiPicker.qml b/retroshare-qml-app/src/components/emoji/EmojiPicker.qml index e30b84322..7783eff69 100644 --- a/retroshare-qml-app/src/components/emoji/EmojiPicker.qml +++ b/retroshare-qml-app/src/components/emoji/EmojiPicker.qml @@ -10,6 +10,9 @@ Rectangle property int buttonWidth: 40 property TextArea textArea + property bool androidMode: true // On Desktop appears on top of text field, instead appears in place of virtual keyboard (under text field) + + property var rootFontName: theme.emojiFontName //displays all Emoji of one categroy by modifying the ListModel of emojiGrid @@ -84,9 +87,14 @@ Rectangle { id: emojiGrid width: parent.width - anchors.fill: parent - anchors.bottomMargin: buttonWidth - cellWidth: buttonWidth; cellHeight: buttonWidth + anchors.fill: parent + anchors + { + bottomMargin: if (!androidMode) buttonWidth + topMargin: if (androidMode) buttonWidth + } + + cellWidth: buttonWidth; cellHeight: buttonWidth model: emojiByCategory delegate: EmojiButton @@ -102,19 +110,30 @@ Rectangle //seperator Rectangle { - color: "black" - anchors.bottom: parent.bottom - anchors.bottomMargin: buttonWidth + color: "gray" + anchors + { + bottom: if (!androidMode) parent.bottom + top: if (androidMode) parent.top + bottomMargin: if (!androidMode) buttonWidth + topMargin: if (androidMode) buttonWidth + } + width: parent.width height: 1 } Rectangle { - color: emojiPicker.color - anchors.bottom: parent.bottom + color: emojiPicker.color width: parent.width height: buttonWidth + anchors + { + bottom: if (!androidMode) parent.bottom + top: if (androidMode) parent.top + } + //emoji category selector ListView { From d9804928dc080092fba4e7e184d86847b60a7e36 Mon Sep 17 00:00:00 2001 From: Angela Mazzurco Date: Thu, 7 Sep 2017 18:13:29 +0200 Subject: [PATCH 05/58] Set emoji menu under inferior panel on android mode --- retroshare-qml-app/src/ChatView.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/retroshare-qml-app/src/ChatView.qml b/retroshare-qml-app/src/ChatView.qml index e9d87ca6a..aba028118 100644 --- a/retroshare-qml-app/src/ChatView.qml +++ b/retroshare-qml-app/src/ChatView.qml @@ -100,7 +100,7 @@ Item anchors.fill: parent anchors.topMargin: parent.height / 2 - anchors.bottomMargin: categorySelectorHeight + anchors.bottomMargin: if(!androidMode) categorySelectorHeight property int categorySelectorHeight: 50 @@ -114,6 +114,7 @@ Item name: "EMOJI_HIDDEN" PropertyChanges { target: emojiPicker; anchors.topMargin: parent.height } PropertyChanges { target: emojiPicker; anchors.bottomMargin: -1 } + PropertyChanges { target: emojiPicker; height: 0 } }, State { name: "EMOJI_SHOWN" @@ -132,7 +133,7 @@ Item id: inferiorPanel height: ( msgComposer.height > styles.height)? msgComposer.height: styles.height width: parent.width - anchors.bottom: parent.bottom + anchors.bottom: emojiPicker.androidMode ? emojiPicker.top : parent.bottom Rectangle { From bbd139ae0e2c2853a2a00f33ac1b80b943b9b92b Mon Sep 17 00:00:00 2001 From: Angela Mazzurco Date: Thu, 7 Sep 2017 18:33:57 +0200 Subject: [PATCH 06/58] Disable keyboard close when emojimenu button is pushed --- retroshare-qml-app/src/ChatView.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/retroshare-qml-app/src/ChatView.qml b/retroshare-qml-app/src/ChatView.qml index aba028118..505637274 100644 --- a/retroshare-qml-app/src/ChatView.qml +++ b/retroshare-qml-app/src/ChatView.qml @@ -285,7 +285,6 @@ Item onClicked: { if (emojiPicker.state == "EMOJI_HIDDEN") { emojiPicker.state = "EMOJI_SHOWN" - Qt.inputMethod.hide(); } else { emojiPicker.state = "EMOJI_HIDDEN" } From 404469b0a7aa900ef7a0bb91319ac06e32bb44e3 Mon Sep 17 00:00:00 2001 From: Angela Mazzurco Date: Thu, 7 Sep 2017 18:34:23 +0200 Subject: [PATCH 07/58] Set android mode on android os platforms --- retroshare-qml-app/src/components/emoji/EmojiPicker.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-qml-app/src/components/emoji/EmojiPicker.qml b/retroshare-qml-app/src/components/emoji/EmojiPicker.qml index 7783eff69..844ba60b1 100644 --- a/retroshare-qml-app/src/components/emoji/EmojiPicker.qml +++ b/retroshare-qml-app/src/components/emoji/EmojiPicker.qml @@ -10,7 +10,7 @@ Rectangle property int buttonWidth: 40 property TextArea textArea - property bool androidMode: true // On Desktop appears on top of text field, instead appears in place of virtual keyboard (under text field) + property bool androidMode: Qt.platform.os === "android" // On Desktop appears on top of text field, instead appears in place of virtual keyboard (under text field) property var rootFontName: theme.emojiFontName From 335c1463e60b7687be9d8d7e1bf6320ac6d68ceb Mon Sep 17 00:00:00 2001 From: Angela Mazzurco Date: Thu, 7 Sep 2017 18:47:08 +0200 Subject: [PATCH 08/58] Open own contact details page when click your identity --- retroshare-qml-app/src/GxsIdentityDelegate.qml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/retroshare-qml-app/src/GxsIdentityDelegate.qml b/retroshare-qml-app/src/GxsIdentityDelegate.qml index 650cf6551..6bdbf2524 100644 --- a/retroshare-qml-app/src/GxsIdentityDelegate.qml +++ b/retroshare-qml-app/src/GxsIdentityDelegate.qml @@ -50,7 +50,14 @@ Item console.log("GxsIntentityDelegate onclicked:", model.name, model.gxs_id) contactsView.searching = false - if(model.own) contactsView.own_gxs_id = model.gxs_id + if(model.own) + { + contactsView.own_gxs_id = model.gxs_id + stackView.push( + "qrc:/ContactDetails.qml", + {md: ChatCache.contactsCache.getContactFromGxsId(model.gxs_id)}) + + } else { startDistantChat() From 75180f2a016ddc9eb0948a932a0d042a69cddd62 Mon Sep 17 00:00:00 2001 From: Angela Mazzurco Date: Thu, 7 Sep 2017 20:30:08 +0200 Subject: [PATCH 09/58] Encode base64 via c++ code --- retroshare-qml-app/src/androidimagepicker.h | 60 ++++++++++++++++ retroshare-qml-app/src/components/Faces.qml | 79 +++++++++++---------- 2 files changed, 101 insertions(+), 38 deletions(-) diff --git a/retroshare-qml-app/src/androidimagepicker.h b/retroshare-qml-app/src/androidimagepicker.h index ad5f0e302..4187489de 100644 --- a/retroshare-qml-app/src/androidimagepicker.h +++ b/retroshare-qml-app/src/androidimagepicker.h @@ -9,6 +9,8 @@ #include #include +#include "qpainter.h" + #ifdef __ANDROID__ # include @@ -60,7 +62,65 @@ public slots: qDebug() << "imageToBase64() encoded" ; + return encoded; + } + + static QString faceImage (QVariantList onloads, int size) + { + QImage result(size, size, QImage::Format_ARGB32_Premultiplied); + QPainter painter(&result); + + + int counter = 0; + for (QVariantList::iterator j = onloads.begin(); j != onloads.end(); j++) + { + QString path = (*j).toString(); + QImageReader reader; + reader.setFileName(path); + QImage image = reader.read(); + painter.drawImage(0, 0, image); // xi, yi is the position for imagei +// if (counter == 0) +// { +// base = QImage(bg.size(), QImage::Format_ARGB32_Premultiplied); +// qDebug() << "FIIIRST "; + +// } +// else +// { + +// } + qDebug() << "iterating through QVariantList "; + qDebug() << (*j).toString(); // Print QVariant + counter++; + } + painter.end(); + + // Transform image into PNG format + QByteArray ba; + QBuffer buffer( &ba ); + buffer.open( QIODevice::WriteOnly ); + result.save( &buffer, "png" ); + + // Get Based 64 image string + QString encoded = QString(ba.toBase64()); + + qDebug() << "@@@@@ encoded avatar " << encoded ; + return encoded; } + + QImage getImageFromPath (QString localPath) + { + qDebug() << "getImageFromPath() local path:" << localPath ; + + // Read the image + QImageReader reader; + reader.setFileName(localPath); + QImage image = reader.read(); + return image; + + } + + }; diff --git a/retroshare-qml-app/src/components/Faces.qml b/retroshare-qml-app/src/components/Faces.qml index f814ebb6d..ed60df314 100644 --- a/retroshare-qml-app/src/components/Faces.qml +++ b/retroshare-qml-app/src/components/Faces.qml @@ -19,43 +19,43 @@ Item visible: true } - Canvas - { - id: canvasAvatar - width: height - height: canvasSizes - visible: false +// Canvas +// { +// id: canvasAvatar +// width: height +// height: canvasSizes +// visible: false - renderStrategy: Canvas.Threaded; - renderTarget: Canvas.Image; +// renderStrategy: Canvas.Threaded; +// renderTarget: Canvas.Image; - property var images - property var callback +// property var images +// property var callback - onPaint: - { - var ctx = getContext("2d"); +// onPaint: +// { +// var ctx = getContext("2d"); - if (images) - { - for (y = 0 ; y< nPieces ; y++) - { - ctx.drawImage(images[y], 0, 0, iconSize, iconSize ) - } - } +// if (images) +// { +// for (y = 0 ; y< nPieces ; y++) +// { +// ctx.drawImage(images[y], 0, 0, iconSize, iconSize ) +// } +// } - } +// } - onPainted: - { - if (callback) - { - var data = toDataURL('image/png') - callback(data) - } - } - } +// onPainted: +// { +// if (callback) +// { +// var data = toDataURL('image/png') +// callback(data) +// } +// } +// } Component.onCompleted: { @@ -134,11 +134,14 @@ Item { var url = src(gender, i, data[i+1]) onloads.push(url) - canvasAvatar.loadImage(url) +// canvasAvatar.loadImage(url) } - canvasAvatar.images = onloads - canvasAvatar.callback = callback - canvasAvatar.requestPaint() +// canvasAvatar.images = onloads +// canvasAvatar.callback = callback + var datas = androidImagePicker.faceImage(onloads, iconSize) + console.log("@@@@@@@ url " , datas) + callback("data:image/png;base64,"+datas) +// canvasAvatar.requestPaint() } // Create the identicon @@ -156,17 +159,17 @@ Item { imageAvatar.source = data imageAvatar.visible = true - canvasAvatar.visible = false +// canvasAvatar.visible = false - canvasAvatar.height = 0 +// canvasAvatar.height = 0 imageAvatar.height = iconSize } else { - canvasAvatar.visible = true +// canvasAvatar.visible = true imageAvatar.visible = false - canvasAvatar.height = iconSize +// canvasAvatar.height = iconSize imageAvatar.height = 0 } From 1fdd190fb00c87719dffdbd3634b0a360d4af650 Mon Sep 17 00:00:00 2001 From: Angela Mazzurco Date: Mon, 11 Sep 2017 16:27:16 +0200 Subject: [PATCH 10/58] Set correct qrc path --- retroshare-qml-app/src/androidimagepicker.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-qml-app/src/androidimagepicker.h b/retroshare-qml-app/src/androidimagepicker.h index 4187489de..168e33bdf 100644 --- a/retroshare-qml-app/src/androidimagepicker.h +++ b/retroshare-qml-app/src/androidimagepicker.h @@ -74,7 +74,7 @@ public slots: int counter = 0; for (QVariantList::iterator j = onloads.begin(); j != onloads.end(); j++) { - QString path = (*j).toString(); + QString path = ":/"+(*j).toString(); QImageReader reader; reader.setFileName(path); QImage image = reader.read(); From cd2e18f27b6e83e3ac0aa9306667d487f431b6e2 Mon Sep 17 00:00:00 2001 From: Angela Mazzurco Date: Mon, 11 Sep 2017 16:36:59 +0200 Subject: [PATCH 11/58] Use correct image size --- retroshare-qml-app/src/components/Faces.qml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/retroshare-qml-app/src/components/Faces.qml b/retroshare-qml-app/src/components/Faces.qml index ed60df314..723384219 100644 --- a/retroshare-qml-app/src/components/Faces.qml +++ b/retroshare-qml-app/src/components/Faces.qml @@ -138,9 +138,8 @@ Item } // canvasAvatar.images = onloads // canvasAvatar.callback = callback - var datas = androidImagePicker.faceImage(onloads, iconSize) - console.log("@@@@@@@ url " , datas) - callback("data:image/png;base64,"+datas) + var base64Image = androidImagePicker.faceImage(onloads, canvasSizes) + callback("data:image/png;base64,"+base64Image) // canvasAvatar.requestPaint() } From 4642f2ab2a8c97fd6148d3e9225f815c0a420774 Mon Sep 17 00:00:00 2001 From: Angela Mazzurco Date: Mon, 11 Sep 2017 16:42:29 +0200 Subject: [PATCH 12/58] Clean code --- retroshare-qml-app/src/androidimagepicker.h | 27 +----------- retroshare-qml-app/src/components/Faces.qml | 48 +++++---------------- 2 files changed, 12 insertions(+), 63 deletions(-) diff --git a/retroshare-qml-app/src/androidimagepicker.h b/retroshare-qml-app/src/androidimagepicker.h index 168e33bdf..89759edbc 100644 --- a/retroshare-qml-app/src/androidimagepicker.h +++ b/retroshare-qml-app/src/androidimagepicker.h @@ -79,18 +79,7 @@ public slots: reader.setFileName(path); QImage image = reader.read(); painter.drawImage(0, 0, image); // xi, yi is the position for imagei -// if (counter == 0) -// { -// base = QImage(bg.size(), QImage::Format_ARGB32_Premultiplied); -// qDebug() << "FIIIRST "; - -// } -// else -// { - -// } - qDebug() << "iterating through QVariantList "; - qDebug() << (*j).toString(); // Print QVariant + qDebug() << "Generating face Avatar from: " << (*j).toString(); // Print QVariant counter++; } painter.end(); @@ -104,23 +93,9 @@ public slots: // Get Based 64 image string QString encoded = QString(ba.toBase64()); - qDebug() << "@@@@@ encoded avatar " << encoded ; - return encoded; } - QImage getImageFromPath (QString localPath) - { - qDebug() << "getImageFromPath() local path:" << localPath ; - - // Read the image - QImageReader reader; - reader.setFileName(localPath); - QImage image = reader.read(); - return image; - - } - }; diff --git a/retroshare-qml-app/src/components/Faces.qml b/retroshare-qml-app/src/components/Faces.qml index 723384219..7a1b0d2a1 100644 --- a/retroshare-qml-app/src/components/Faces.qml +++ b/retroshare-qml-app/src/components/Faces.qml @@ -16,7 +16,6 @@ Item id: imageAvatar width: height height: iconSize - visible: true } // Canvas @@ -134,13 +133,9 @@ Item { var url = src(gender, i, data[i+1]) onloads.push(url) -// canvasAvatar.loadImage(url) } -// canvasAvatar.images = onloads -// canvasAvatar.callback = callback var base64Image = androidImagePicker.faceImage(onloads, canvasSizes) callback("data:image/png;base64,"+base64Image) -// canvasAvatar.requestPaint() } // Create the identicon @@ -148,32 +143,11 @@ Item { var iconId = [dataHex, iconSize]; var update = function(data) - { - // This conditions are for solve a bug on an Lg S3. - // On this device the toDataURL() is incompleted. - // So for see the complete avatar at least at first execution we'll show the canvas, - // instead of the image component. - // See issue: https://gitlab.com/angesoc/RetroShare/issues/37 - if (facesCache.iconCache[iconId]) - { - imageAvatar.source = data - imageAvatar.visible = true -// canvasAvatar.visible = false - -// canvasAvatar.height = 0 - imageAvatar.height = iconSize - } - else - { -// canvasAvatar.visible = true - imageAvatar.visible = false - -// canvasAvatar.height = iconSize - imageAvatar.height = 0 - } - - facesCache.iconCache[iconId] = data; - } + { + imageAvatar.source = data + imageAvatar.height = iconSize + facesCache.iconCache[iconId] = data; + } if (facesCache.iconCache.hasOwnProperty(iconId)) { @@ -186,13 +160,13 @@ Item else { var onImageGenerated = function(data) - { + { - facesCache.callbackCache[iconId].forEach(function(callback) - { - callback(data); - }) - } + facesCache.callbackCache[iconId].forEach(function(callback) + { + callback(data); + }) + } facesCache.callbackCache[iconId] = [update]; if (dataHex) From be7c6a966f2956f6289b6f8fc603dcebc0431ccb Mon Sep 17 00:00:00 2001 From: Angela Mazzurco Date: Mon, 11 Sep 2017 16:43:38 +0200 Subject: [PATCH 13/58] Refactor function name --- retroshare-qml-app/src/androidimagepicker.h | 2 +- retroshare-qml-app/src/components/Faces.qml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/retroshare-qml-app/src/androidimagepicker.h b/retroshare-qml-app/src/androidimagepicker.h index 89759edbc..2de4aaabe 100644 --- a/retroshare-qml-app/src/androidimagepicker.h +++ b/retroshare-qml-app/src/androidimagepicker.h @@ -65,7 +65,7 @@ public slots: return encoded; } - static QString faceImage (QVariantList onloads, int size) + static QString base64FaceAvatarGenerator (QVariantList onloads, int size) { QImage result(size, size, QImage::Format_ARGB32_Premultiplied); QPainter painter(&result); diff --git a/retroshare-qml-app/src/components/Faces.qml b/retroshare-qml-app/src/components/Faces.qml index 7a1b0d2a1..ea4fe28dc 100644 --- a/retroshare-qml-app/src/components/Faces.qml +++ b/retroshare-qml-app/src/components/Faces.qml @@ -134,7 +134,7 @@ Item var url = src(gender, i, data[i+1]) onloads.push(url) } - var base64Image = androidImagePicker.faceImage(onloads, canvasSizes) + var base64Image = androidImagePicker.b64AvatarGen(onloads, canvasSizes) callback("data:image/png;base64,"+base64Image) } From 44ffdb97c59f0bc6b3b54e1b220257953e0dfc41 Mon Sep 17 00:00:00 2001 From: Angela Mazzurco Date: Mon, 11 Sep 2017 16:52:15 +0200 Subject: [PATCH 14/58] Refactor and delete repeated code --- retroshare-qml-app/src/androidimagepicker.h | 48 +++++++++------------ 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/retroshare-qml-app/src/androidimagepicker.h b/retroshare-qml-app/src/androidimagepicker.h index 2de4aaabe..06ceade18 100644 --- a/retroshare-qml-app/src/androidimagepicker.h +++ b/retroshare-qml-app/src/androidimagepicker.h @@ -43,30 +43,19 @@ public slots: QString localPath = url.toLocalFile(); qDebug() << "imageToBase64() local path:" << localPath ; - - // Read the image - QImageReader reader; - reader.setFileName(localPath); - QImage image = reader.read(); + QImage image= getImage (localPath); image = image.scaled(96,96,Qt::KeepAspectRatio,Qt::SmoothTransformation); - // Transform image into PNG format - QByteArray ba; - QBuffer buffer( &ba ); - buffer.open( QIODevice::WriteOnly ); - image.save( &buffer, "png" ); + qDebug() << "imageToBase64() encoding" ; - // Get Based 64 image string - QString encoded = QString(ba.toBase64()); - - qDebug() << "imageToBase64() encoded" ; - - return encoded; + return imageToB64(image); } - static QString base64FaceAvatarGenerator (QVariantList onloads, int size) + static QString b64AvatarGen (QVariantList onloads, int size) { + qDebug() << "b64AvatarGen(): Generating face Avatar from"; + QImage result(size, size, QImage::Format_ARGB32_Premultiplied); QPainter painter(&result); @@ -74,27 +63,32 @@ public slots: int counter = 0; for (QVariantList::iterator j = onloads.begin(); j != onloads.end(); j++) { - QString path = ":/"+(*j).toString(); - QImageReader reader; - reader.setFileName(path); - QImage image = reader.read(); + QImage image = getImage (":/"+(*j).toString()); painter.drawImage(0, 0, image); // xi, yi is the position for imagei - qDebug() << "Generating face Avatar from: " << (*j).toString(); // Print QVariant counter++; } painter.end(); + return imageToB64(result); + } + + static QImage getImage (QString const& path) + { + QImageReader reader; + reader.setFileName(path); + return reader.read(); + } + + static QString imageToB64 (QImage image) + { // Transform image into PNG format QByteArray ba; QBuffer buffer( &ba ); buffer.open( QIODevice::WriteOnly ); - result.save( &buffer, "png" ); + image.save( &buffer, "png" ); // Get Based 64 image string - QString encoded = QString(ba.toBase64()); - - return encoded; - + return QString(ba.toBase64()); } From 9ba7b5cf4712c4d3041799e9ec45cae48af09377 Mon Sep 17 00:00:00 2001 From: Gioacchino Mazzurco Date: Sun, 8 Oct 2017 11:44:51 +0200 Subject: [PATCH 15/58] qml-app properly initialize ChatView.gxsInfo Use proper Qml empty object notation instead of string to inistalize property of type var as it is an object not a string, thus fixing the assiciated warning --- retroshare-qml-app/src/ChatView.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/retroshare-qml-app/src/ChatView.qml b/retroshare-qml-app/src/ChatView.qml index 505637274..07b81f9ad 100644 --- a/retroshare-qml-app/src/ChatView.qml +++ b/retroshare-qml-app/src/ChatView.qml @@ -28,7 +28,7 @@ Item { id: chatView property string chatId - property var gxsInfo: "" + property var gxsInfo: ({}) property int token: 0 property string objectName:"chatView" @@ -64,7 +64,7 @@ Item function changeState () { toolBar.state = "CHATVIEW" - gxsInfo= ChatCache.lastMessageCache.getGxsFromChatId(chatView.chatId) + gxsInfo = ChatCache.lastMessageCache.getGxsFromChatId(chatView.chatId) toolBar.gxsSource = gxsInfo.gxs toolBar.titleText = gxsInfo.name } From 69efa07224a35c0bc63b22751690d231087301cf Mon Sep 17 00:00:00 2001 From: Gioacchino Mazzurco Date: Sun, 8 Oct 2017 12:00:07 +0200 Subject: [PATCH 16/58] qml-app removed some dead code --- retroshare-qml-app/src/components/Faces.qml | 47 ++------------------- 1 file changed, 3 insertions(+), 44 deletions(-) diff --git a/retroshare-qml-app/src/components/Faces.qml b/retroshare-qml-app/src/components/Faces.qml index ea4fe28dc..27ba5dab8 100644 --- a/retroshare-qml-app/src/components/Faces.qml +++ b/retroshare-qml-app/src/components/Faces.qml @@ -4,13 +4,11 @@ import "../" // Needed by ChatCache (where stores generated faces) Item { - id: faces property string hash property var facesCache: ChatCache.facesCache - Image { id: imageAvatar @@ -18,49 +16,10 @@ Item height: iconSize } -// Canvas -// { -// id: canvasAvatar -// width: height -// height: canvasSizes -// visible: false - -// renderStrategy: Canvas.Threaded; -// renderTarget: Canvas.Image; - -// property var images -// property var callback - - -// onPaint: -// { -// var ctx = getContext("2d"); - -// if (images) -// { -// for (y = 0 ; y< nPieces ; y++) -// { -// ctx.drawImage(images[y], 0, 0, iconSize, iconSize ) -// } -// } - -// } - -// onPainted: -// { -// if (callback) -// { -// var data = toDataURL('image/png') -// callback(data) -// } -// } -// } - - Component.onCompleted: - { - createFromHex(hash) - } + Component.onCompleted: createFromHex(hash) + /* TODO: Is there a reason why we are using var and not proper type for the + * following properties? */ property var facesPath: "/icons/faces/" From f161aa845c52a61c6ad238da272f5a750b7de675 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 14 Oct 2017 14:57:20 +0200 Subject: [PATCH 17/58] updated changelog --- build_scripts/Debian+Ubuntu/changelog | 41 +++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/build_scripts/Debian+Ubuntu/changelog b/build_scripts/Debian+Ubuntu/changelog index fa7a08c16..72dfeb83b 100644 --- a/build_scripts/Debian+Ubuntu/changelog +++ b/build_scripts/Debian+Ubuntu/changelog @@ -1,5 +1,46 @@ retroshare (0.6.3-1.XXXXXX~YYYYYY) YYYYYY; urgency=low + d61a5cd csoler Mon, 2 Oct 2017 22:23:26 +0200 attempt at fixing the re-hash bug. Now only using canonicalized filenames in hash cache + 22942dc csoler Sun, 1 Oct 2017 20:20:26 +0200 fixed bug causing suffix/prefix lists to contain an empty string + bc05aaa csoler Sat, 30 Sep 2017 18:58:31 +0200 switched tokenQueue speed to 10 calls/sec, thus improving loading speeds. Still need to test for CPU load + 65977c0 csoler Sat, 30 Sep 2017 18:29:29 +0200 Merge pull request #1054 from PhenomRetroShare/Fix_GccWarningd + 06ebaa5 csoler Sat, 30 Sep 2017 18:28:24 +0200 Merge pull request #1055 from felisucoibi/master + 06063c5 felisu Sat, 30 Sep 2017 11:34:18 +0200 removed extra space + b84c898 felisu Sat, 30 Sep 2017 00:29:07 +0200 Removed ... from text + ef6fd38 felisu Thu, 28 Sep 2017 22:42:30 +0200 Changed prefixes and sifixes for startign with and ending with to be understandable. + 7f851f6 Phenom Thu, 28 Sep 2017 19:24:26 +0200 Fix Gcc Warning in p3banlist + e66c0d1 csoler Wed, 27 Sep 2017 22:26:14 +0200 removed updateTotals() method. Replaced it with costless on-the-fly update of totals + a00d2c9 csoler Tue, 26 Sep 2017 21:12:17 +0200 changed lobby to char room in chat system msgs + 8eae374 csoler Mon, 25 Sep 2017 22:14:34 +0200 Merge pull request #1053 from csoler/v0.6-FT + 0d9b6e7 csoler Mon, 25 Sep 2017 22:09:35 +0200 fixd broken layout + cbeefda csoler Mon, 25 Sep 2017 21:35:59 +0200 Merge pull request #744 from RetroPooh/tunnel-names + f98f16f Pooh Mon, 25 Sep 2017 22:31:49 +0300 Update TransfersDialog.cpp + 5970ff2 csoler Mon, 25 Sep 2017 21:14:30 +0200 Merge pull request #1052 from csoler/v0.6-FT + 40cda11 csoler Mon, 25 Sep 2017 21:05:42 +0200 removed delay when calling forceUpdate() on directories + b969f31 csoler Mon, 25 Sep 2017 20:59:32 +0200 Merge pull request #1050 from csoler/v0.6-FT + d8cb3fe csoler Mon, 25 Sep 2017 20:56:35 +0200 fixed not rehashing files that already exist in a different directory pointed by a symlink + 72dc1c7 Pooh Mon, 25 Sep 2017 21:50:12 +0300 Update TransfersDialog.cpp + c47e6f6 Pooh Mon, 25 Sep 2017 21:43:41 +0300 Merge branch 'master' into tunnel-names + 4766a89 csoler Sun, 24 Sep 2017 23:51:47 +0200 added an additional hard limit to directory depth, just in case + f497905 csoler Sun, 24 Sep 2017 23:43:52 +0200 fixed limitation of directory depth when indexing files + abd7e25 csoler Sun, 24 Sep 2017 18:14:45 +0200 added checks for mMaxShareDepth and mIgnoreDuplicates + 2a99df4 csoler Sun, 24 Sep 2017 17:53:06 +0200 added UI and parameters for two new options in shared files: max share depth and ignore duplicates + 932eb49 csoler Sat, 23 Sep 2017 13:49:53 +0200 Merge pull request #1049 from Steve-V/minor-spelling-fix + 82c9c95 Steve- Fri, 22 Sep 2017 19:58:13 -0500 spelling fix ommitted -> omitted + 73cbf6c csoler Thu, 21 Sep 2017 23:47:11 +0200 Merge pull request #1047 from csoler/v0.6-FT + a2ccf97 csoler Wed, 20 Sep 2017 22:57:32 +0200 removed the 4M files limit on 64bits systems + 308f8ca defnax Tue, 19 Sep 2017 18:34:58 +0200 update qrc file + 58ccf0b csoler Mon, 18 Sep 2017 22:50:35 +0200 Merge pull request #1045 from csoler/v0.6-FT + bc2c9d5 csoler Mon, 18 Sep 2017 22:49:51 +0200 adding pending transfers 100 at a time instead of 1 at a time when loading + 52ca6d0 defnax Mon, 18 Sep 2017 20:49:40 +0200 Added Crystall Ball to emote file + bf7d346 csoler Sun, 17 Sep 2017 20:27:44 +0200 Merge pull request #1043 from csoler/v0.6-FT + e21dec4 csoler Sun, 17 Sep 2017 20:26:46 +0200 Merge pull request #1038 from PhenomRetroShare/Add_UploadUserColumn + d8f621e csoler Sun, 17 Sep 2017 20:14:45 +0200 make forceDirectoryCheck() to desactivate the pause, in case it was left activated + + -- Retroshare Dev Team Sat, 14 Oct 2017 15:00:00 +0100 + +retroshare (0.6.3-1.20170917.c2f321d7~trusty) trusty; urgency=low + 46d26bf csoler Tue, 12 Sep 2017 21:05:59 +0200 updated ubuntu packagign script f3c627d csoler Sat, 16 Sep 2017 22:13:53 +0200 Merge pull request #1042 from csoler/v0.6-FT 8189d66 csoler Sat, 16 Sep 2017 22:13:15 +0200 fixed bug causing anon FT to not resume when restarting RS when the server enforces encryption From ebf99a4eaf03f3d6bce658bccdccbf80d514f4b7 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 14 Oct 2017 18:10:55 +0200 Subject: [PATCH 18/58] removed vivid in defautl ubuntu distr list --- build_scripts/Debian+Ubuntu/control.artful | 46 +++++++++++++++++++ .../Debian+Ubuntu/makeSourcePackage.sh | 22 ++------- 2 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 build_scripts/Debian+Ubuntu/control.artful diff --git a/build_scripts/Debian+Ubuntu/control.artful b/build_scripts/Debian+Ubuntu/control.artful new file mode 100644 index 000000000..80b452523 --- /dev/null +++ b/build_scripts/Debian+Ubuntu/control.artful @@ -0,0 +1,46 @@ +Source: retroshare +Section: devel +Priority: standard +Maintainer: Cyril Soler +Build-Depends: debhelper (>= 7), libglib2.0-dev, libupnp-dev, libssl-dev, libxss-dev, libgnome-keyring-dev, libbz2-dev, libspeex-dev, libspeexdsp-dev, libxslt1-dev, cmake, libcurl4-openssl-dev, libopencv-dev, tcl8.6, libsqlcipher-dev, libmicrohttpd-dev, libavcodec-dev, qtmultimedia5-dev, qttools5-dev, libqt5x11extras5-dev, qt5-default +Standards-Version: 3.9.6 +Homepage: http://retroshare.sourceforge.net + +Package: retroshare-voip-plugin +Architecture: any +Conflicts: retroshare06-voip-plugin +Depends: ${shlibs:Depends}, ${misc:Depends}, retroshare, libspeex1, libspeexdsp1, libqt5multimedia5 +Description: RetroShare VOIP plugin + This package provides a plugin for RetroShare, a secured Friend-to-Friend communication + plateform. The plugin adds voice-over-IP functionality to the private chat window. Both + friends chatting together need the plugin installed to be able to talk together. + +Package: retroshare-feedreader-plugin +Architecture: any +Conflicts: retroshare06-feedreader-plugin +Depends: ${shlibs:Depends}, ${misc:Depends}, retroshare +Description: RetroShare FeedReader plugin + This package provides a plugin for RetroShare, a secured Friend-to-Friend communication + plateform. The plugin adds a RSS feed reader tab to retroshare. + +Package: retroshare-nogui +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, gnome-keyring +Conflicts: retroshare,retroshare06-nogui +Description: Secure communication with friends + This is the command-line client for RetroShare network. This client + can be contacted and talked-to using SSL. Clients exist for portable + devices running e.g. Android. + +Package: retroshare +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, gnome-keyring +Conflicts: retroshare-nogui,retroshare06 +Description: Secure communication with friends + RetroShare is a Open Source cross-platform, private and secure decentralised + commmunication platform. It lets you to securely chat and share files with your + friends and family, using a web-of-trust to authenticate peers and OpenSSL to + encrypt all communication. RetroShare provides filesharing, chat, messages, + forums and channels. + + diff --git a/build_scripts/Debian+Ubuntu/makeSourcePackage.sh b/build_scripts/Debian+Ubuntu/makeSourcePackage.sh index e2cf2f79c..9e3bd4fff 100755 --- a/build_scripts/Debian+Ubuntu/makeSourcePackage.sh +++ b/build_scripts/Debian+Ubuntu/makeSourcePackage.sh @@ -55,7 +55,7 @@ while [ ${#} -gt 0 ]; do done if test "${dist}" = "" ; then - dist="precise trusty vivid xenial zesty" + dist="precise trusty xenial zesty artful" fi echo Attempting to get revision number... @@ -121,23 +121,11 @@ for i in ${dist}; do echo copying changelog for ${i} sed -e s/XXXXXX/"${rev}"/g -e s/YYYYYY/"${i}"/g ../changelog > debian/changelog - if test "${i}" = "lucid" ; then - cp ../control.ubuntu_lucid debian/control - elif test "${i}" = "zesty" ; then - cp ../control.zesty debian/control - elif test "${i}" = "squeeze" ; then - cp ../control.squeeze_bubba3 debian/control - elif test "${i}" = "precise" ; then - cp ../control.precise debian/control - elif test "${i}" = "xenial" ; then - cp ../control.xenial debian/control - elif test "${i}" = "yakkety" ; then - cp ../control.yakkety debian/control - elif test "${i}" = "stretch" ; then - cp ../control.${i} debian/control - elif test "${i}" = "jessie" ; then - cp ../control.${i} debian/control + if test -f ../control."${i}" ; then + echo \/\!\\ Using specific control file for distribution "${i}" + cp ../control."${i}" debian/control else + echo Using standard control file control."${i}" for distribution "${i}" cp ../debian/control debian/control fi From 034d88c4e2e99fdc210f553ad030917a8d7d4ecf Mon Sep 17 00:00:00 2001 From: Gioacchino Mazzurco Date: Mon, 16 Oct 2017 20:07:52 +0200 Subject: [PATCH 19/58] Fix android compilation with newer Qt In lastest Qt versions linux-* mkspec doesn't match android anymore, this was triggering a compilation error as DATA_DIR was not defined the RsAccountsDetail::PathDataDirectory(bool check) code has been rearranged so it works reasonably also on Android and do not depend on DATA_DIR define anymore Updated Android compiling documentation --- README-Android.asciidoc | 12 +++++------- android-prepare-toolchain.sh | 2 +- libretroshare/src/libretroshare.pro | 2 +- libretroshare/src/rsserver/rsaccounts.cc | 3 ++- retroshare-qml-app/src/android/gradle.properties | 2 +- retroshare.pri | 2 +- 6 files changed, 11 insertions(+), 12 deletions(-) diff --git a/README-Android.asciidoc b/README-Android.asciidoc index 085d50ade..7c781dda9 100644 --- a/README-Android.asciidoc +++ b/README-Android.asciidoc @@ -1,15 +1,13 @@ Compile Retroshare for Android ============================== -== Introduction - Compiling an application for Android is not as easy as one would imagine, expecially one like RetroShare that has a big codebase and is not well -documented. -This document is aimed to empower the reader so she can hopefully succed or at -least have a significant help in compiling her own RetroShare APK package +documented. This document is aimed to empower the reader so she can hopefully +succed or at least have a significant help in compiling her own RetroShare APK installable on Android. + == Preparing The Environement First of all setup your Qt for Android development environement following the @@ -21,7 +19,7 @@ on your Android phone Qt for Android examples. But RetroShare is not as simple to compile as those examples. The good news is that Android NDK ships all the necessary to build a custom toolchain that is suitable to build RetroShare. -In order to build the toolchain with needed library RetroShare provides the +In order to build the toolchain with needed libraries RetroShare provides the +android-prepare-toolchain.sh+ script; before you execute it you should define some variables the script cannot determine in an easy and reliable manner by itself in your terminal. @@ -33,7 +31,7 @@ export ANDROID_NDK_PATH="/opt/android-ndk/" ## The path where your fresh compiled toolchain will be installed, make sure ## the parent exists -export NDK_TOOLCHAIN_PATH="/home/$(whoami)/Development/android-toolchains/retroshare-android/" +export NDK_TOOLCHAIN_PATH="${HOME}/Builds/android-toolchains/retroshare-android/" ## The CPU architecture of the Android device you want to target export ANDROID_NDK_ARCH="arm" diff --git a/android-prepare-toolchain.sh b/android-prepare-toolchain.sh index a0e37a054..d89e071e2 100755 --- a/android-prepare-toolchain.sh +++ b/android-prepare-toolchain.sh @@ -5,7 +5,7 @@ [ -z ${ANDROID_NDK_ARCH+x} ] && export ANDROID_NDK_ARCH="arm" [ -z ${ANDROID_NDK_ABI_VER+x} ] && export ANDROID_NDK_ABI_VER="4.9" [ -z ${ANDROID_PLATFORM_VER+x} ] && export ANDROID_PLATFORM_VER="18" -[ -z ${NDK_TOOLCHAIN_PATH+x} ] && export NDK_TOOLCHAIN_PATH="/home/$(whoami)/Development/android-toolchains/retroshare-android-${ANDROID_PLATFORM_VER}-${ANDROID_NDK_ARCH}-abi${ANDROID_NDK_ABI_VER}/" +[ -z ${NDK_TOOLCHAIN_PATH+x} ] && export NDK_TOOLCHAIN_PATH="${HOME}/Builds/android-toolchains/retroshare-android-${ANDROID_PLATFORM_VER}-${ANDROID_NDK_ARCH}-abi${ANDROID_NDK_ABI_VER}/" [ -z ${HOST_NUM_CPU+x} ] && export HOST_NUM_CPU=4 runDir="$(pwd)" diff --git a/libretroshare/src/libretroshare.pro b/libretroshare/src/libretroshare.pro index d96e7dc7f..a5241abba 100644 --- a/libretroshare/src/libretroshare.pro +++ b/libretroshare/src/libretroshare.pro @@ -916,7 +916,7 @@ test_bitdht { ################################# Android ##################################### android-g++ { -## ifaddrs is missing on Android add them don't use the one from +## ifaddrs is missing on Android to add them don't use the one from ## https://github.com/morristech/android-ifaddrs ## because they crash, use QNetworkInterface from Qt instead CONFIG *= qt diff --git a/libretroshare/src/rsserver/rsaccounts.cc b/libretroshare/src/rsserver/rsaccounts.cc index 0f0a6ac94..6bd36b04d 100644 --- a/libretroshare/src/rsserver/rsaccounts.cc +++ b/libretroshare/src/rsserver/rsaccounts.cc @@ -803,7 +803,8 @@ static bool checkAccount(std::string accountdir, AccountDetails &account,std::ma /* Use RetroShare's exe dir */ dataDirectory = "."; - +#elif defined(ANDROID) + dataDirectory = defaultBaseDirectory()+"/usr/share/retroshare"; #elif defined(DATA_DIR) dataDirectory = DATA_DIR; // For all other OS the data directory must be set in libretroshare.pro diff --git a/retroshare-qml-app/src/android/gradle.properties b/retroshare-qml-app/src/android/gradle.properties index 6915cd803..47ab4e463 100644 --- a/retroshare-qml-app/src/android/gradle.properties +++ b/retroshare-qml-app/src/android/gradle.properties @@ -6,4 +6,4 @@ androidBuildToolsVersion=24.0.1 androidCompileSdkVersion=23 buildDir=.build -qt5AndroidDir=/opt/Qt5.8.0/5.8/android_armv7/src/android/java +qt5AndroidDir=/opt/Qt/5.9.2/android_armv7/src/android/java diff --git a/retroshare.pri b/retroshare.pri index 7f827542f..0b61671f6 100644 --- a/retroshare.pri +++ b/retroshare.pri @@ -133,7 +133,7 @@ android-g++ { # message(ANDROID_EXTRA_LIBS: $$ANDROID_EXTRA_LIBS) # message(ANDROID_PLATFORM: $$ANDROID_PLATFORM) # message(ANDROID_PLATFORM_ROOT_PATH: $$ANDROID_PLATFORM_ROOT_PATH) -# message(NDK_TOOLCHAIN_PATH: $$NDK_TOOLCHAIN_PATH) +# message(NATIVE_LIBS_TOOLCHAIN_PATH: $$NATIVE_LIBS_TOOLCHAIN_PATH) } win32 { From 68763f58d16e7e532f1bf89af860c486fa153505 Mon Sep 17 00:00:00 2001 From: csoler Date: Sun, 15 Oct 2017 20:52:21 +0200 Subject: [PATCH 20/58] added links machinery to handle file hierarchies --- retroshare-gui/src/gui/RetroShareLink.cpp | 86 ++++++++++++++-------- retroshare-gui/src/gui/RetroShareLink.h | 4 +- retroshare-gui/src/util/HandleRichText.cpp | 2 + 3 files changed, 62 insertions(+), 30 deletions(-) diff --git a/retroshare-gui/src/gui/RetroShareLink.cpp b/retroshare-gui/src/gui/RetroShareLink.cpp index b58e7186b..d1cb574c9 100644 --- a/retroshare-gui/src/gui/RetroShareLink.cpp +++ b/retroshare-gui/src/gui/RetroShareLink.cpp @@ -58,6 +58,7 @@ //#define DEBUG_RSLINK 1 #define HOST_FILE "file" +#define HOST_COLLECTION "collection" #define HOST_EXTRAFILE "extra" #define HOST_PERSON "person" #define HOST_FORUM "forum" @@ -75,6 +76,10 @@ #define FILE_HASH "hash" #define FILE_SOURCE "src" +#define COLLECTION_NAME "name" +#define COLLECTION_SIZE "size" +#define COLLECTION_DATA "radix" + #define PERSON_NAME "name" #define PERSON_HASH "hash" @@ -328,6 +333,19 @@ void RetroShareLink::fromUrl(const QUrl& url) return; } + if (url.host() == HOST_COLLECTION) { + bool ok; + _type = TYPE_COLLECTION; + _radix = decodedQueryItemValue(urlQuery, COLLECTION_DATA); + _size = urlQuery.queryItemValue(COLLECTION_SIZE).toULongLong(&ok); + _name = urlQuery.queryItemValue(COLLECTION_NAME).toULongLong(&ok); + +#ifdef DEBUG_RSLINK + std::cerr << "Got a certificate link!!" << std::endl; +#endif + check() ; + return; + } if (url.host() == HOST_CERTIFICATE) { _type = TYPE_CERTIFICATE; _radix = decodedQueryItemValue(urlQuery, CERTIFICATE_RADIX); @@ -400,6 +418,20 @@ RetroShareLink RetroShareLink::createFile(const QString& name, uint64_t size, co return link; } +RetroShareLink RetroShareLink::createCollection(const QString& name, const uint64_t size,const QString& radix_data) +{ + RetroShareLink link; + link.clear(); + + link._name = name; + link._size = size; + link._radix = radix_data ; + link._type = TYPE_COLLECTION; + + link.check(); + + return link; +} RetroShareLink RetroShareLink::createPublicMsgInvite(time_t time_stamp,const QString& issuer_pgp_id,const QString& hash) { RetroShareLink link; @@ -608,6 +640,8 @@ void RetroShareLink::check() if(!checkSSLId(_SSLid)) _valid = false; // no break! We also test file stuff below. /* fallthrough */ + case TYPE_COLLECTION: + case TYPE_FILE: if(_size > (((uint64_t)1)<<40)) // 1TB. Who has such large files? _valid = false; @@ -615,7 +649,7 @@ void RetroShareLink::check() if(!checkName(_name)) _valid = false; - if(!checkHash(_hash)) + if(!checkRadix64(_radix)) _valid = false; break; @@ -717,6 +751,8 @@ QString RetroShareLink::title() const rsPeers->getGPGDetails(RsPgpId(_GPGid.toStdString()), detail) ; return QObject::tr("Click to send a private message to %1 (%2).").arg(QString::fromUtf8(detail.name.c_str())).arg(_GPGid) ; } + case TYPE_COLLECTION: + return QObject::tr("Click to browse/download this file collection"); case TYPE_EXTRAFILE: return QObject::tr("%1 (%2, Extra - Source included)").arg(hash()).arg(misc::friendlyUnit(size())); case TYPE_FILE: @@ -860,6 +896,13 @@ QString RetroShareLink::toString() const break; + case TYPE_COLLECTION: + url.setScheme(RSLINK_SCHEME); + url.setHost(HOST_COLLECTION) ; + urlQuery.addQueryItem(CERTIFICATE_RADIX, encodeItem(_radix)); + urlQuery.addQueryItem(CERTIFICATE_NAME, encodeItem(_name)); + break; + case TYPE_CERTIFICATE: url.setScheme(RSLINK_SCHEME); url.setHost(HOST_CERTIFICATE) ; @@ -885,6 +928,9 @@ QString RetroShareLink::niceName() const if(type() == TYPE_IDENTITY) return QObject::tr("Identity link (name=%1, ID=%2)").arg(_name).arg(_hash) ; + if(type() == TYPE_COLLECTION) + return QObject::tr("Click to browse/download this file collection"); + if(type() == TYPE_PUBLIC_MSG) { RsPeerDetails detail; rsPeers->getGPGDetails(RsPgpId(_GPGid.toStdString()), detail) ; @@ -1095,6 +1141,7 @@ static void processList(const QStringList &list, const QString &textSingular, co case TYPE_SEARCH: case TYPE_MESSAGE: case TYPE_IDENTITY: + case TYPE_COLLECTION: case TYPE_CERTIFICATE: case TYPE_PUBLIC_MSG: case TYPE_PRIVATE_CHAT: @@ -1336,6 +1383,15 @@ static void processList(const QStringList &list, const QString &textSingular, co } break; + case TYPE_COLLECTION: + { + //FileHierarchy fh ; + //fh.initFromRadix(_radix); + + QMessageBox::information(NULL,"Unimplemented code","File collection links not handled yet.") ; + } + break; + case TYPE_PERSON: { #ifdef DEBUG_RSLINK @@ -1347,34 +1403,6 @@ static void processList(const QStringList &list, const QString &textSingular, co PGPKeyDialog::showIt(detail.gpg_id,PGPKeyDialog::PageDetails) ; else personNotFound.append(PeerDefs::rsid(link.name().toUtf8().constData(), RsPgpId(link.hash().toStdString()))); - -// needNotifySuccess = true; - -// RsPeerDetails detail; -// if (rsPeers->getGPGDetails(RsPgpId(link.hash().toStdString()), detail)) -// { -// if (RsPgpId(detail.gpg_id) == rsPeers->getGPGOwnId()) { -// // it's me, do nothing -// break; -// } -// -// if (detail.accept_connection) { -// // peer connection is already accepted -// personExist.append(PeerDefs::rsid(detail)); -// break; -// } -// -// if (rsPeers->addFriend(RsPeerId(), RsPgpId(link.hash().toStdString()))) { -// ConfCertDialog::loadAll(); -// personAdded.append(PeerDefs::rsid(detail)); -// break; -// } -// -// personFailed.append(PeerDefs::rsid(link.name().toUtf8().constData(), RsPgpId(link.hash().toStdString()))); -// break; -// } -// -// personNotFound.append(PeerDefs::rsid(link.name().toUtf8().constData(), RsPgpId(link.hash().toStdString()))); } break; diff --git a/retroshare-gui/src/gui/RetroShareLink.h b/retroshare-gui/src/gui/RetroShareLink.h index 131970887..a2e54798d 100644 --- a/retroshare-gui/src/gui/RetroShareLink.h +++ b/retroshare-gui/src/gui/RetroShareLink.h @@ -69,7 +69,8 @@ class RetroShareLink TYPE_PRIVATE_CHAT = 0x09, TYPE_PUBLIC_MSG = 0x0a, TYPE_POSTED = 0x0b, - TYPE_IDENTITY = 0x0c + TYPE_IDENTITY = 0x0c, + TYPE_COLLECTION = 0x0d }; public: @@ -80,6 +81,7 @@ class RetroShareLink static RetroShareLink createIdentity(const RsGxsId& gxs_id,const QString& name,const QString& radix_data) ; static RetroShareLink createExtraFile(const QString& name, uint64_t size, const QString& hash, const QString& ssl_id); static RetroShareLink createFile(const QString& name, uint64_t size, const QString& hash); + static RetroShareLink createCollection(const QString& name, const uint64_t size,const QString& radix_data); static RetroShareLink createPublicMsgInvite(time_t time_stamp,const QString& pgp_id,const QString& hash) ; static RetroShareLink createPerson(const RsPgpId &id); static RetroShareLink createCertificate(const RsPeerId &ssl_id) ; diff --git a/retroshare-gui/src/util/HandleRichText.cpp b/retroshare-gui/src/util/HandleRichText.cpp index 96fd36d73..91f3e13ab 100644 --- a/retroshare-gui/src/util/HandleRichText.cpp +++ b/retroshare-gui/src/util/HandleRichText.cpp @@ -227,6 +227,7 @@ bool RsHtml::canReplaceAnchor(QDomDocument &/*doc*/, QDomElement &/*element*/, c switch (link.type()) { case RetroShareLink::TYPE_UNKNOWN: case RetroShareLink::TYPE_FILE: + case RetroShareLink::TYPE_COLLECTION: case RetroShareLink::TYPE_PERSON: case RetroShareLink::TYPE_FORUM: case RetroShareLink::TYPE_CHANNEL: @@ -257,6 +258,7 @@ void RsHtml::anchorStylesheetForImg(QDomDocument &/*doc*/, QDomElement &/*elemen switch (link.type()) { case RetroShareLink::TYPE_UNKNOWN: case RetroShareLink::TYPE_FILE: + case RetroShareLink::TYPE_COLLECTION: case RetroShareLink::TYPE_PERSON: case RetroShareLink::TYPE_FORUM: case RetroShareLink::TYPE_CHANNEL: From 847c1b2bce93699b924ea219ff6e29a1480e336a Mon Sep 17 00:00:00 2001 From: csoler Date: Sun, 15 Oct 2017 21:10:29 +0200 Subject: [PATCH 21/58] renamed RsCollectionFile into RsCollectionEditor --- .../src/gui/FileTransfer/SearchDialog.cpp | 20 +++---- .../gui/FileTransfer/SharedFilesDialog.cpp | 33 ++++-------- .../src/gui/FileTransfer/TransfersDialog.cpp | 22 ++++---- retroshare-gui/src/gui/MainWindow.cpp | 8 +-- retroshare-gui/src/gui/RemoteDirModel.cpp | 4 +- retroshare-gui/src/gui/RetroShareLink.cpp | 6 +-- retroshare-gui/src/gui/common/FilesDefs.cpp | 4 +- .../src/gui/common/RsCollectionDialog.cpp | 10 ++-- .../src/gui/common/RsCollectionDialog.h | 2 +- ...lectionFile.cpp => RsCollectionEditor.cpp} | 54 +++++++++---------- ...sCollectionFile.h => RsCollectionEditor.h} | 8 +-- .../src/gui/common/RsUrlHandler.cpp | 6 +-- retroshare-gui/src/retroshare-gui.pro | 8 +-- 13 files changed, 87 insertions(+), 98 deletions(-) rename retroshare-gui/src/gui/common/{RsCollectionFile.cpp => RsCollectionEditor.cpp} (86%) rename retroshare-gui/src/gui/common/{RsCollectionFile.h => RsCollectionEditor.h} (93%) diff --git a/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp index 4607a2541..e55493a0c 100644 --- a/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp @@ -30,7 +30,7 @@ #include "gui/RetroShareLink.h" #include "retroshare-gui/RsAutoUpdatePage.h" #include "gui/msgs/MessageComposer.h" -#include "gui/common/RsCollectionFile.h" +#include "gui/common/RsCollectionEditor.h" #include "gui/common/FilesDefs.h" #include "gui/common/RsUrlHandler.h" #include "gui/settings/rsharesettings.h" @@ -345,7 +345,7 @@ void SearchDialog::searchResultWidgetCustomPopupMenu( QPoint /*point*/ ) QList item =ui.searchResultWidget->selectedItems() ; if (item.at(0)->data(SR_DATA_COL, SR_ROLE_LOCAL).toBool()) { contextMnu.addAction(QIcon(IMAGE_OPENFOLDER), tr("Open Folder"), this, SLOT(openFolderSearch())) ; - if (item.at(0)->text(SR_NAME_COL).endsWith(RsCollectionFile::ExtensionString)) { + if (item.at(0)->text(SR_NAME_COL).endsWith(RsCollectionEditor::ExtensionString)) { add_CollActions = true ; }//if (item.at(0)->text(SR_NAME_COL).endsWith(RsCollectionFile::ExtensionString)) }//if (item.at(0)->data(SR_DATA_COL, SR_ROLE_LOCAL).toBool()) @@ -448,7 +448,7 @@ void SearchDialog::collCreate() }//if (!item->text(SR_HASH_COL).isEmpty()) }//for (int i = 0; i < numdls; ++i) - RsCollectionFile(dirVec).openNewColl(this); + RsCollectionEditor(dirVec).openNewColl(this); } void SearchDialog::collModif() @@ -476,8 +476,8 @@ void SearchDialog::collModif() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) { - RsCollectionFile collection; + if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { + RsCollectionEditor collection; collection.openColl(qinfo.absoluteFilePath()); }//if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) }//if (qinfo.exists()) @@ -508,8 +508,8 @@ void SearchDialog::collView() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) { - RsCollectionFile collection; + if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { + RsCollectionEditor collection; collection.openColl(qinfo.absoluteFilePath(), true); }//if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) }//if (qinfo.exists()) @@ -540,8 +540,8 @@ void SearchDialog::collOpen() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) { - RsCollectionFile collection; + if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { + RsCollectionEditor collection; if (collection.load(qinfo.absoluteFilePath())) { collection.downloadFiles(); return; @@ -552,7 +552,7 @@ void SearchDialog::collOpen() } } - RsCollectionFile collection; + RsCollectionEditor collection; if (collection.load(this)) { collection.downloadFiles(); }//if (collection.load(this)) diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp index 9b1dac00d..9279642c3 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp @@ -37,7 +37,7 @@ #include "gui/RetroShareLink.h" #include "gui/ShareManager.h" #include "gui/common/PeerDefs.h" -#include "gui/common/RsCollectionFile.h" +#include "gui/common/RsCollectionEditor.h" #include "gui/msgs/MessageComposer.h" #include "gui/settings/AddFileAssociationDialog.h" #include "gui/settings/rsharesettings.h" @@ -499,17 +499,12 @@ void RemoteSharedFilesDialog::spawnCustomPopupMenu( QPoint point ) QMenu contextMnu( this ) ; - //bool bIsRsColl = currentFile.endsWith(RsCollectionFile::ExtensionString); collCreateAct->setEnabled(true); - //collModifAct->setEnabled(bIsRsColl); - //collViewAct->setEnabled(bIsRsColl); collOpenAct->setEnabled(true); QMenu collectionMenu(tr("Collection"), this); collectionMenu.setIcon(QIcon(IMAGE_LIBRARY)); collectionMenu.addAction(collCreateAct); - //collectionMenu.addAction(collModifAct); - //collectionMenu.addAction(collViewAct); collectionMenu.addAction(collOpenAct); QAction *downloadAct = new QAction(QIcon(IMAGE_DOWNLOAD), tr( "Download" ), &contextMnu ) ; @@ -517,18 +512,12 @@ void RemoteSharedFilesDialog::spawnCustomPopupMenu( QPoint point ) contextMnu.addAction( downloadAct) ; if ( type == DIR_TYPE_FILE ) { - //QAction *copyremotelinkAct = new QAction(QIcon(IMAGE_COPYLINK), tr( "Copy retroshare Link" ), &contextMnu ) ; - //connect( copyremotelinkAct , SIGNAL( triggered() ), this, SLOT( copyLink() ) ) ; - - //QAction *sendremotelinkAct = new QAction(QIcon(IMAGE_COPYLINK), tr( "Send retroshare Link" ), &contextMnu ) ; - //connect( sendremotelinkAct , SIGNAL( triggered() ), this, SLOT( sendremoteLinkTo( ) ) ) ; - contextMnu.addSeparator() ;//------------------------------------ contextMnu.addAction( copylinkAct) ; contextMnu.addAction( sendlinkAct) ; contextMnu.addSeparator() ;//------------------------------------ contextMnu.addAction(QIcon(IMAGE_MSG), tr("Recommend in a message to"), this, SLOT(recommendFilesToMsg())) ; - }//if (type == DIR_TYPE_FILE) + } contextMnu.addSeparator() ;//------------------------------------ contextMnu.addMenu(&collectionMenu) ; @@ -542,7 +531,7 @@ QModelIndexList SharedFilesDialog::getSelected() QModelIndexList proxyList ; for (QModelIndexList::iterator index = list.begin(); index != list.end(); ++index ) { proxyList.append(proxyModel->mapToSource(*index)) ; - }//for (QModelIndexList::iterator index + } return proxyList ; } @@ -692,8 +681,8 @@ void SharedFilesDialog::collModif() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) { - RsCollectionFile collection; + if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { + RsCollectionEditor collection; collection.openColl(qinfo.absoluteFilePath()); }//if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) }//if (qinfo.exists()) @@ -722,8 +711,8 @@ void SharedFilesDialog::collView() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) { - RsCollectionFile collection; + if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { + RsCollectionEditor collection; collection.openColl(qinfo.absoluteFilePath(), true); }//if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) }//if (qinfo.exists()) @@ -752,8 +741,8 @@ void SharedFilesDialog::collOpen() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) { - RsCollectionFile collection; + if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { + RsCollectionEditor collection; if (collection.load(qinfo.absoluteFilePath())) { collection.downloadFiles(); return; @@ -763,7 +752,7 @@ void SharedFilesDialog::collOpen() } } - RsCollectionFile collection; + RsCollectionEditor collection; if (collection.load(this)) { collection.downloadFiles(); }//if (collection.load(this)) @@ -995,7 +984,7 @@ void LocalSharedFilesDialog::spawnCustomPopupMenu( QPoint point ) QMenu contextMnu(this) ; - bool bIsRsColl = currentFile.endsWith(RsCollectionFile::ExtensionString); + bool bIsRsColl = currentFile.endsWith(RsCollectionEditor::ExtensionString); collCreateAct->setEnabled(true); collModifAct->setEnabled(bIsRsColl); collViewAct->setEnabled(bIsRsColl); diff --git a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp index aecc53bef..98bc7f3cb 100644 --- a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp @@ -31,7 +31,7 @@ #include #include -#include +#include #include #include @@ -50,7 +50,7 @@ #include "xprogressbar.h" #include #include "util/misc.h" -#include +#include #include "TransferUserNotify.h" #include "util/QtVersion.h" #include "util/RsFile.h" @@ -702,7 +702,7 @@ void TransfersDialog::downloadListCustomPopupMenu( QPoint /*point*/ ) add_PlayOption = !add_PreviewOption ; }// if (misc::isPreviewable(info.fname.substr(pos + 1).c_str())) // Check if the file is a collection - if (RsCollectionFile::ExtensionString == info.fname.substr(pos + 1).c_str()) { + if (RsCollectionEditor::ExtensionString == info.fname.substr(pos + 1).c_str()) { add_CollActions = (info.downloadStatus == FT_STATE_COMPLETE); }//if (RsCollectionFile::ExtensionString == info }// if(pos != std::string::npos) @@ -2155,7 +2155,7 @@ void TransfersDialog::collCreate() dirVec.push_back(details); }//for (it = items.begin(); - RsCollectionFile(dirVec).openNewColl(this); + RsCollectionEditor(dirVec).openNewColl(this); } void TransfersDialog::collModif() @@ -2180,8 +2180,8 @@ void TransfersDialog::collModif() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) { - RsCollectionFile collection; + if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { + RsCollectionEditor collection; collection.openColl(qinfo.absoluteFilePath()); }//if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) }//if (qinfo.exists()) @@ -2210,8 +2210,8 @@ void TransfersDialog::collView() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) { - RsCollectionFile collection; + if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { + RsCollectionEditor collection; collection.openColl(qinfo.absoluteFilePath(), true); }//if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) }//if (qinfo.exists()) @@ -2240,8 +2240,8 @@ void TransfersDialog::collOpen() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) { - RsCollectionFile collection; + if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { + RsCollectionEditor collection; if (collection.load(qinfo.absoluteFilePath())) { collection.downloadFiles(); return; @@ -2252,7 +2252,7 @@ void TransfersDialog::collOpen() } } - RsCollectionFile collection; + RsCollectionEditor collection; if (collection.load(this)) { collection.downloadFiles(); }//if (collection.load(this)) diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 0933f8e7b..d3bb3200f 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -103,7 +103,7 @@ #include "gui/statistics/StatisticsWindow.h" #include "gui/connect/ConnectFriendWizard.h" -#include "gui/common/RsCollectionFile.h" +#include "gui/common/RsCollectionEditor.h" #include "settings/rsettingswin.h" #include "settings/rsharesettings.h" #include "settings/WebuiPage.h" @@ -1020,7 +1020,7 @@ void MainWindow::newRsCollection() { std::vector dirVec; - RsCollectionFile(dirVec).openNewColl(this); + RsCollectionEditor(dirVec).openNewColl(this); } /** Shows Share Manager */ @@ -1448,8 +1448,8 @@ void MainWindow::openRsCollection(const QString &filename) { QFileInfo qinfo(filename); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) { - RsCollectionFile collection; + if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { + RsCollectionEditor collection; collection.openColl(qinfo.absoluteFilePath()); } } diff --git a/retroshare-gui/src/gui/RemoteDirModel.cpp b/retroshare-gui/src/gui/RemoteDirModel.cpp index 15ac3168e..29f08b6a5 100644 --- a/retroshare-gui/src/gui/RemoteDirModel.cpp +++ b/retroshare-gui/src/gui/RemoteDirModel.cpp @@ -26,7 +26,7 @@ #include #include -#include +#include #include #include #include @@ -1065,7 +1065,7 @@ void RetroshareDirModel::createCollectionFile(QWidget *parent, const QModelIndex std::vector dirVec; getDirDetailsFromSelect(list, dirVec); - RsCollectionFile(dirVec).openNewColl(parent); + RsCollectionEditor(dirVec).openNewColl(parent); } void RetroshareDirModel::downloadSelected(const QModelIndexList &list) diff --git a/retroshare-gui/src/gui/RetroShareLink.cpp b/retroshare-gui/src/gui/RetroShareLink.cpp index d1cb574c9..27ec2c1a9 100644 --- a/retroshare-gui/src/gui/RetroShareLink.cpp +++ b/retroshare-gui/src/gui/RetroShareLink.cpp @@ -43,7 +43,7 @@ #include "msgs/MessageComposer.h" #include "util/misc.h" #include "common/PeerDefs.h" -#include "common/RsCollectionFile.h" +#include "common/RsCollectionEditor.h" #include #include "gui/connect/ConnectFriendWizard.h" #include "gui/connect/ConfCertDialog.h" @@ -972,10 +972,10 @@ QString RetroShareLink::toHtmlSize() const { QString size = QString("(%1)").arg(misc::friendlyUnit(_size)); - if (type() == TYPE_FILE && RsCollectionFile::isCollectionFile(name())) { + if (type() == TYPE_FILE && RsCollectionEditor::isCollectionFile(name())) { FileInfo finfo; if (rsFiles->FileDetails(RsFileHash(hash().toStdString()), RS_FILE_HINTS_EXTRA | RS_FILE_HINTS_LOCAL, finfo)) { - RsCollectionFile collection; + RsCollectionEditor collection; if (collection.load(QString::fromUtf8(finfo.path.c_str()), false)) { size += QString(" [%1]").arg(misc::friendlyUnit(collection.size())); } diff --git a/retroshare-gui/src/gui/common/FilesDefs.cpp b/retroshare-gui/src/gui/common/FilesDefs.cpp index 7c4fc9140..063c85e3b 100644 --- a/retroshare-gui/src/gui/common/FilesDefs.cpp +++ b/retroshare-gui/src/gui/common/FilesDefs.cpp @@ -23,7 +23,7 @@ #include #include "FilesDefs.h" -#include "RsCollectionFile.h" +#include "RsCollectionEditor.h" static QString getInfoFromFilename(const QString& filename, bool anyForUnknown, bool image) { @@ -54,7 +54,7 @@ static QString getInfoFromFilename(const QString& filename, bool anyForUnknown, return image ? ":/images/FileTypeDocument.png" : QApplication::translate("FilesDefs", "Document"); } else if (ext == "pdf") { return image ? ":/images/mimetypes/pdf.png" : QApplication::translate("FilesDefs", "Document"); - } else if (ext == RsCollectionFile::ExtensionString) { + } else if (ext == RsCollectionEditor::ExtensionString) { return image ? ":/images/mimetypes/rscollection-16.png" : QApplication::translate("FilesDefs", "RetroShare collection file"); } else if (ext == "sub" || ext == "srt") { return image ? ":/images/FileTypeAny.png" : QApplication::translate("FilesDefs", "Subtitles"); diff --git a/retroshare-gui/src/gui/common/RsCollectionDialog.cpp b/retroshare-gui/src/gui/common/RsCollectionDialog.cpp index eb920f219..ee0aeec39 100644 --- a/retroshare-gui/src/gui/common/RsCollectionDialog.cpp +++ b/retroshare-gui/src/gui/common/RsCollectionDialog.cpp @@ -29,7 +29,7 @@ #include #include #include "RsCollectionDialog.h" -#include "RsCollectionFile.h" +#include "RsCollectionEditor.h" #include "util/misc.h" #define COLUMN_FILE 0 #define COLUMN_FILEPATH 1 @@ -591,12 +591,12 @@ void RsCollectionDialog::changeFileName() QString fileName; if(!misc::getSaveFileName(this, RshareSettings::LASTDIR_EXTRAFILE , QApplication::translate("RsCollectionFile", "Create collection file") - , QApplication::translate("RsCollectionFile", "Collection files") + " (*." + RsCollectionFile::ExtensionString + ")" + , QApplication::translate("RsCollectionFile", "Collection files") + " (*." + RsCollectionEditor::ExtensionString + ")" , fileName,0, QFileDialog::DontConfirmOverwrite)) return; - if (!fileName.endsWith("." + RsCollectionFile::ExtensionString)) - fileName += "." + RsCollectionFile::ExtensionString ; + if (!fileName.endsWith("." + RsCollectionEditor::ExtensionString)) + fileName += "." + RsCollectionEditor::ExtensionString ; std::cerr << "Got file name: " << fileName.toStdString() << std::endl; @@ -604,7 +604,7 @@ void RsCollectionDialog::changeFileName() if(file.exists()) { - RsCollectionFile collFile; + RsCollectionEditor collFile; if (!collFile.checkFile(fileName,true)) return; QMessageBox mb; diff --git a/retroshare-gui/src/gui/common/RsCollectionDialog.h b/retroshare-gui/src/gui/common/RsCollectionDialog.h index 2c5721d8b..e5e5df86d 100644 --- a/retroshare-gui/src/gui/common/RsCollectionDialog.h +++ b/retroshare-gui/src/gui/common/RsCollectionDialog.h @@ -22,7 +22,7 @@ ****************************************************************/ #include "ui_RsCollectionDialog.h" -#include "RsCollectionFile.h" +#include "RsCollectionEditor.h" #include #include diff --git a/retroshare-gui/src/gui/common/RsCollectionFile.cpp b/retroshare-gui/src/gui/common/RsCollectionEditor.cpp similarity index 86% rename from retroshare-gui/src/gui/common/RsCollectionFile.cpp rename to retroshare-gui/src/gui/common/RsCollectionEditor.cpp index 3e4792063..7abfe3f92 100644 --- a/retroshare-gui/src/gui/common/RsCollectionFile.cpp +++ b/retroshare-gui/src/gui/common/RsCollectionEditor.cpp @@ -24,7 +24,7 @@ #include #include -#include "RsCollectionFile.h" +#include "RsCollectionEditor.h" #include "RsCollectionDialog.h" #include "util/misc.h" @@ -36,14 +36,14 @@ #include #include -const QString RsCollectionFile::ExtensionString = QString("rscollection") ; +const QString RsCollectionEditor::ExtensionString = QString("rscollection") ; -RsCollectionFile::RsCollectionFile(QObject *parent) +RsCollectionEditor::RsCollectionEditor(QObject *parent) : QObject(parent), _xml_doc("RsCollection") { } -RsCollectionFile::RsCollectionFile(const std::vector& file_infos, QObject *parent) +RsCollectionEditor::RsCollectionEditor(const std::vector& file_infos, QObject *parent) : QObject(parent), _xml_doc("RsCollection") { QDomElement root = _xml_doc.createElement("RsCollection"); @@ -53,11 +53,11 @@ RsCollectionFile::RsCollectionFile(const std::vector& file_infos, QO recursAddElements(_xml_doc,file_infos[i],root) ; } -RsCollectionFile::~RsCollectionFile() +RsCollectionEditor::~RsCollectionEditor() { } -void RsCollectionFile::downloadFiles() const +void RsCollectionEditor::downloadFiles() const { // print out the element names of all elements that are direct children // of the outermost element. @@ -87,7 +87,7 @@ static QString purifyFileName(const QString& input,bool& bad) return output ; } -void RsCollectionFile::recursCollectColFileInfos(const QDomElement& e,std::vector& colFileInfos,const QString& current_path, bool bad_chars_in_parent) const +void RsCollectionEditor::recursCollectColFileInfos(const QDomElement& e,std::vector& colFileInfos,const QString& current_path, bool bad_chars_in_parent) const { QDomNode n = e.firstChild() ; @@ -139,7 +139,7 @@ void RsCollectionFile::recursCollectColFileInfos(const QDomElement& e,std::vecto } -void RsCollectionFile::recursAddElements(QDomDocument& doc,const DirDetails& details,QDomElement& e) const +void RsCollectionEditor::recursAddElements(QDomDocument& doc,const DirDetails& details,QDomElement& e) const { if (details.type == DIR_TYPE_FILE) { @@ -175,7 +175,7 @@ void RsCollectionFile::recursAddElements(QDomDocument& doc,const DirDetails& det } } -void RsCollectionFile::recursAddElements(QDomDocument& doc,const ColFileInfo& colFileInfo,QDomElement& e) const +void RsCollectionEditor::recursAddElements(QDomDocument& doc,const ColFileInfo& colFileInfo,QDomElement& e) const { if (colFileInfo.type == DIR_TYPE_FILE) { @@ -208,7 +208,7 @@ static void showErrorBox(const QString& fileName, const QString& error) mb.exec(); } -bool RsCollectionFile::load(const QString& fileName, bool showError /* = true*/) +bool RsCollectionEditor::load(const QString& fileName, bool showError /* = true*/) { if (!checkFile(fileName,showError)) return false; @@ -238,7 +238,7 @@ bool RsCollectionFile::load(const QString& fileName, bool showError /* = true*/) } // check that the file is a valid rscollection file, and not a lol bomb or some shit like this -bool RsCollectionFile::checkFile(const QString& fileName, bool showError) +bool RsCollectionEditor::checkFile(const QString& fileName, bool showError) { QFile file(fileName); @@ -306,10 +306,10 @@ bool RsCollectionFile::checkFile(const QString& fileName, bool showError) return false; } -bool RsCollectionFile::load(QWidget *parent) +bool RsCollectionEditor::load(QWidget *parent) { QString fileName; - if (!misc::getOpenFileName(parent, RshareSettings::LASTDIR_EXTRAFILE, QApplication::translate("RsCollectionFile", "Open collection file"), QApplication::translate("RsCollectionFile", "Collection files") + " (*." + RsCollectionFile::ExtensionString + ")", fileName)) + if (!misc::getOpenFileName(parent, RshareSettings::LASTDIR_EXTRAFILE, QApplication::translate("RsCollectionFile", "Open collection file"), QApplication::translate("RsCollectionFile", "Collection files") + " (*." + RsCollectionEditor::ExtensionString + ")", fileName)) return false; std::cerr << "Got file name: " << fileName.toStdString() << std::endl; @@ -317,7 +317,7 @@ bool RsCollectionFile::load(QWidget *parent) return load(fileName, true); } -bool RsCollectionFile::save(const QString& fileName) const +bool RsCollectionEditor::save(const QString& fileName) const { QFile file(fileName); @@ -337,14 +337,14 @@ bool RsCollectionFile::save(const QString& fileName) const return true; } -bool RsCollectionFile::save(QWidget *parent) const +bool RsCollectionEditor::save(QWidget *parent) const { QString fileName; - if(!misc::getSaveFileName(parent, RshareSettings::LASTDIR_EXTRAFILE, QApplication::translate("RsCollectionFile", "Create collection file"), QApplication::translate("RsCollectionFile", "Collection files") + " (*." + RsCollectionFile::ExtensionString + ")", fileName)) + if(!misc::getSaveFileName(parent, RshareSettings::LASTDIR_EXTRAFILE, QApplication::translate("RsCollectionFile", "Create collection file"), QApplication::translate("RsCollectionFile", "Collection files") + " (*." + RsCollectionEditor::ExtensionString + ")", fileName)) return false; - if (!fileName.endsWith("." + RsCollectionFile::ExtensionString)) - fileName += "." + RsCollectionFile::ExtensionString ; + if (!fileName.endsWith("." + RsCollectionEditor::ExtensionString)) + fileName += "." + RsCollectionEditor::ExtensionString ; std::cerr << "Got file name: " << fileName.toStdString() << std::endl; @@ -352,17 +352,17 @@ bool RsCollectionFile::save(QWidget *parent) const } -bool RsCollectionFile::openNewColl(QWidget *parent) +bool RsCollectionEditor::openNewColl(QWidget *parent) { QString fileName; if(!misc::getSaveFileName(parent, RshareSettings::LASTDIR_EXTRAFILE , QApplication::translate("RsCollectionFile", "Create collection file") - , QApplication::translate("RsCollectionFile", "Collection files") + " (*." + RsCollectionFile::ExtensionString + ")" + , QApplication::translate("RsCollectionFile", "Collection files") + " (*." + RsCollectionEditor::ExtensionString + ")" , fileName,0, QFileDialog::DontConfirmOverwrite)) return false; - if (!fileName.endsWith("." + RsCollectionFile::ExtensionString)) - fileName += "." + RsCollectionFile::ExtensionString ; + if (!fileName.endsWith("." + RsCollectionEditor::ExtensionString)) + fileName += "." + RsCollectionEditor::ExtensionString ; std::cerr << "Got file name: " << fileName.toStdString() << std::endl; @@ -419,7 +419,7 @@ bool RsCollectionFile::openNewColl(QWidget *parent) return _saved; } -bool RsCollectionFile::openColl(const QString& fileName, bool readOnly /* = false */, bool showError /* = true*/) +bool RsCollectionEditor::openColl(const QString& fileName, bool readOnly /* = false */, bool showError /* = true*/) { if (load(fileName, showError)) { std::vector colFileInfos ; @@ -437,7 +437,7 @@ bool RsCollectionFile::openColl(const QString& fileName, bool readOnly /* = fals return false; } -qulonglong RsCollectionFile::size() +qulonglong RsCollectionEditor::size() { QDomElement docElem = _xml_doc.documentElement(); @@ -453,14 +453,14 @@ qulonglong RsCollectionFile::size() return size; } -bool RsCollectionFile::isCollectionFile(const QString &fileName) +bool RsCollectionEditor::isCollectionFile(const QString &fileName) { QString ext = QFileInfo(fileName).suffix().toLower(); - return (ext == RsCollectionFile::ExtensionString); + return (ext == RsCollectionEditor::ExtensionString); } -void RsCollectionFile::saveColl(std::vector colFileInfos, const QString &fileName) +void RsCollectionEditor::saveColl(std::vector colFileInfos, const QString &fileName) { QDomElement root = _xml_doc.elementsByTagName("RsCollection").at(0).toElement(); diff --git a/retroshare-gui/src/gui/common/RsCollectionFile.h b/retroshare-gui/src/gui/common/RsCollectionEditor.h similarity index 93% rename from retroshare-gui/src/gui/common/RsCollectionFile.h rename to retroshare-gui/src/gui/common/RsCollectionEditor.h index d2a86eba9..62c33bfd5 100644 --- a/retroshare-gui/src/gui/common/RsCollectionFile.h +++ b/retroshare-gui/src/gui/common/RsCollectionEditor.h @@ -56,16 +56,16 @@ public: }; Q_DECLARE_METATYPE(ColFileInfo) -class RsCollectionFile : public QObject +class RsCollectionEditor : public QObject { Q_OBJECT public: - RsCollectionFile(QObject *parent = 0) ; + RsCollectionEditor(QObject *parent = 0) ; // create from list of files and directories - RsCollectionFile(const std::vector& file_entries, QObject *parent = 0) ; - virtual ~RsCollectionFile() ; + RsCollectionEditor(const std::vector& file_entries, QObject *parent = 0) ; + virtual ~RsCollectionEditor() ; static const QString ExtensionString ; diff --git a/retroshare-gui/src/gui/common/RsUrlHandler.cpp b/retroshare-gui/src/gui/common/RsUrlHandler.cpp index e2c3cd092..2e16b23c4 100644 --- a/retroshare-gui/src/gui/common/RsUrlHandler.cpp +++ b/retroshare-gui/src/gui/common/RsUrlHandler.cpp @@ -22,14 +22,14 @@ #include #include #include -#include "RsCollectionFile.h" +#include "RsCollectionEditor.h" #include "RsUrlHandler.h" bool RsUrlHandler::openUrl(const QUrl& url) { - if(url.scheme() == QString("file") && url.toLocalFile().endsWith("."+RsCollectionFile::ExtensionString)) + if(url.scheme() == QString("file") && url.toLocalFile().endsWith("."+RsCollectionEditor::ExtensionString)) { - RsCollectionFile collection ; + RsCollectionEditor collection ; if(collection.load(url.toLocalFile())) { collection.downloadFiles() ; diff --git a/retroshare-gui/src/retroshare-gui.pro b/retroshare-gui/src/retroshare-gui.pro index b7bc361ce..b762dc4ed 100644 --- a/retroshare-gui/src/retroshare-gui.pro +++ b/retroshare-gui/src/retroshare-gui.pro @@ -476,7 +476,6 @@ HEADERS += rshare.h \ gui/common/ElidedLabel.h \ gui/common/vmessagebox.h \ gui/common/RsUrlHandler.h \ - gui/common/RsCollectionFile.h \ gui/common/RsCollectionDialog.h \ gui/common/rwindow.h \ gui/common/html.h \ @@ -565,7 +564,8 @@ HEADERS += rshare.h \ gui/GetStartedDialog.h \ gui/statistics/BWGraph.h \ util/RsSyntaxHighlighter.h \ - util/imageutil.h + util/imageutil.h \ + gui/common/RsCollectionEditor.h # gui/ForumsDialog.h \ # gui/forums/ForumDetails.h \ @@ -791,7 +791,6 @@ SOURCES += main.cpp \ gui/common/RSGraphWidget.cpp \ gui/common/ElidedLabel.cpp \ gui/common/vmessagebox.cpp \ - gui/common/RsCollectionFile.cpp \ gui/common/RsCollectionDialog.cpp \ gui/common/RsUrlHandler.cpp \ gui/common/rwindow.cpp \ @@ -925,7 +924,8 @@ SOURCES += main.cpp \ gui/statistics/RttStatistics.cpp \ gui/statistics/BWGraph.cpp \ util/RsSyntaxHighlighter.cpp \ - util/imageutil.cpp + util/imageutil.cpp \ + gui/common/RsCollectionEditor.cpp # gui/ForumsDialog.cpp \ # gui/forums/ForumDetails.cpp \ From f98edd400e9c3092bcb04f785c2683cc5da4488b Mon Sep 17 00:00:00 2001 From: csoler Date: Wed, 18 Oct 2017 00:04:04 +0200 Subject: [PATCH 22/58] added FileTree class to implement a compact representation of file hierarchies --- .../src/file_sharing/dir_hierarchy.cc | 18 +- libretroshare/src/file_sharing/file_tree.cc | 244 ++++++++++++++++++ libretroshare/src/file_sharing/file_tree.h | 25 ++ libretroshare/src/file_sharing/filelist_io.cc | 10 + libretroshare/src/file_sharing/filelist_io.h | 16 +- libretroshare/src/libretroshare.pro | 2 + libretroshare/src/retroshare/rsfiles.h | 30 +++ 7 files changed, 328 insertions(+), 17 deletions(-) create mode 100644 libretroshare/src/file_sharing/file_tree.cc create mode 100644 libretroshare/src/file_sharing/file_tree.h diff --git a/libretroshare/src/file_sharing/dir_hierarchy.cc b/libretroshare/src/file_sharing/dir_hierarchy.cc index bc8faf0e9..9ec6d2088 100644 --- a/libretroshare/src/file_sharing/dir_hierarchy.cc +++ b/libretroshare/src/file_sharing/dir_hierarchy.cc @@ -35,6 +35,8 @@ //#define DEBUG_DIRECTORY_STORAGE 1 +typedef FileListIO::read_error read_error; + /******************************************************************************************************************/ /* Internal File Hierarchy Storage */ /******************************************************************************************************************/ @@ -1041,22 +1043,6 @@ bool InternalFileHierarchyStorage::save(const std::string& fname) } } -class read_error -{ -public: - read_error(unsigned char *sec,uint32_t size,uint32_t offset,uint8_t expected_tag) - { - std::ostringstream s ; - s << "At offset " << offset << "/" << size << ": expected section tag " << std::hex << (int)expected_tag << std::dec << " but got " << RsUtil::BinToHex(&sec[offset],std::min((int)size-(int)offset, 15)) << "..." << std::endl; - err_string = s.str(); - } - read_error(const std::string& s) : err_string(s) {} - - const std::string& what() const { return err_string ; } -private: - std::string err_string ; -}; - bool InternalFileHierarchyStorage::load(const std::string& fname) { unsigned char *buffer = NULL ; diff --git a/libretroshare/src/file_sharing/file_tree.cc b/libretroshare/src/file_sharing/file_tree.cc new file mode 100644 index 000000000..59987553c --- /dev/null +++ b/libretroshare/src/file_sharing/file_tree.cc @@ -0,0 +1,244 @@ +#include +#include + +#include "file_sharing_defaults.h" +#include "filelist_io.h" +#include "file_tree.h" + +std::string FileTreeImpl::toRadix64() const +{ + unsigned char *buff = NULL ; + uint32_t size = 0 ; + + serialise(buff,size) ; + + std::string res ; + + Radix64::encode(buff,size,res) ; + + free(buff) ; + return res ; +} + +FileTree *FileTree::create(const std::string& radix64_string) +{ + FileTreeImpl *ft = new FileTreeImpl ; + + std::vector mem = Radix64::decode(radix64_string); + ft->deserialise(mem.data(),mem.size()) ; + + return ft ; +} + +static void recurs_buildFileTree(FileTreeImpl& ft,uint32_t index,void *ref) +{ +} + +FileTree *FileTree::create(void *ref) +{ + FileTreeImpl *ft = new FileTreeImpl ; + + recurs_buildFileTree(*ft,0,ref) ; + + return ft ; +} + +typedef FileListIO::read_error read_error ; + +bool FileTreeImpl::deserialise(unsigned char *buffer,uint32_t buffer_size) +{ + uint32_t buffer_offset = 0 ; + + mTotalFiles = 0; + mTotalSize = 0; + + try + { + // Read some header + + uint32_t version,n_dirs,n_files ; + + if(!FileListIO::readField(buffer,buffer_size,buffer_offset,FILE_LIST_IO_TAG_LOCAL_DIRECTORY_VERSION,version)) throw read_error(buffer,buffer_size,buffer_offset,FILE_LIST_IO_TAG_LOCAL_DIRECTORY_VERSION) ; + if(version != (uint32_t) FILE_LIST_IO_LOCAL_DIRECTORY_TREE_VERSION_0001) throw std::runtime_error("Wrong version number") ; + + if(!FileListIO::readField(buffer,buffer_size,buffer_offset,FILE_LIST_IO_TAG_RAW_NUMBER,n_files)) throw read_error(buffer,buffer_size,buffer_offset,FILE_LIST_IO_TAG_RAW_NUMBER) ; + if(!FileListIO::readField(buffer,buffer_size,buffer_offset,FILE_LIST_IO_TAG_RAW_NUMBER,n_dirs)) throw read_error(buffer,buffer_size,buffer_offset,FILE_LIST_IO_TAG_RAW_NUMBER) ; + + // Write all file/dir entries + + mFiles.resize(n_files) ; + mDirs.resize(n_dirs) ; + + unsigned char *node_section_data = NULL ; + uint32_t node_section_size = 0 ; + + for(uint32_t i=0;i= mDirs.size()) + { + std::cerr << "(EE) inconsistent FileTree structure" << std::endl; + return; + } + std::cerr << indent << mDirs[index].name << std::endl; + + for(uint32_t i=0;i& subdirs,std::vector& subfiles) const ; + virtual void print() const ; + + bool serialise(unsigned char *& data,uint32_t& data_size) const ; + bool deserialise(unsigned char* data, uint32_t data_size) ; + +protected: + void recurs_print(uint32_t index,const std::string& indent) const; + + struct DirData { + std::string name; + std::vector subdirs ; + std::vector subfiles ; + }; + std::vector mFiles ; + std::vector mDirs ; +}; diff --git a/libretroshare/src/file_sharing/filelist_io.cc b/libretroshare/src/file_sharing/filelist_io.cc index 618d6c6bb..15d4d1b53 100644 --- a/libretroshare/src/file_sharing/filelist_io.cc +++ b/libretroshare/src/file_sharing/filelist_io.cc @@ -22,12 +22,22 @@ * Please report all bugs and problems to "retroshare.project@gmail.com". * */ + +#include #include "retroshare/rsids.h" #include "pqi/authssl.h" #include "util/rsdir.h" +#include "util/rsprint.h" #include "serialiser/rsbaseserial.h" #include "filelist_io.h" +FileListIO::read_error::read_error(unsigned char *sec,uint32_t size,uint32_t offset,uint8_t expected_tag) +{ + std::ostringstream s ; + s << "At offset " << offset << "/" << size << ": expected section tag " << std::hex << (int)expected_tag << std::dec << " but got " << RsUtil::BinToHex(&sec[offset],std::min((int)size-(int)offset, 15)) << "..." << std::endl; + err_string = s.str(); +} + template<> bool FileListIO::serialise(unsigned char *buff,uint32_t size,uint32_t& offset,const uint32_t & val) { return setRawUInt32(buff,size,&offset,val) ; } template<> bool FileListIO::serialise(unsigned char *buff,uint32_t size,uint32_t& offset,const uint64_t & val) { return setRawUInt64(buff,size,&offset,val) ; } template<> bool FileListIO::serialise(unsigned char *buff,uint32_t size,uint32_t& offset,const std::string & val) { return setRawString(buff,size,&offset,val) ; } diff --git a/libretroshare/src/file_sharing/filelist_io.h b/libretroshare/src/file_sharing/filelist_io.h index 0fcdb00fb..8eccd6b27 100644 --- a/libretroshare/src/file_sharing/filelist_io.h +++ b/libretroshare/src/file_sharing/filelist_io.h @@ -36,6 +36,7 @@ // WARNING: the encoding is system-dependent, so this should *not* be used to exchange data between computers. static const uint32_t FILE_LIST_IO_LOCAL_DIRECTORY_STORAGE_VERSION_0001 = 0x00000001 ; +static const uint32_t FILE_LIST_IO_LOCAL_DIRECTORY_TREE_VERSION_0001 = 0x00010001 ; static const uint8_t FILE_LIST_IO_TAG_UNKNOWN = 0x00 ; static const uint8_t FILE_LIST_IO_TAG_LOCAL_DIRECTORY_VERSION = 0x01 ; @@ -65,6 +66,7 @@ static const uint8_t FILE_LIST_IO_TAG_RAW_NUMBER = 0x62 ; static const uint32_t SECTION_HEADER_MAX_SIZE = 6 ; // section tag (1 byte) + size (max = 5 bytes) + class FileListIO { public: @@ -93,7 +95,19 @@ public: return deserialise(buff,buff_size,offset,val); } - static bool writeField( unsigned char*&buff,uint32_t& buff_size,uint32_t& offset,uint8_t section_tag,const unsigned char * val,uint32_t size) ; + class read_error + { + public: + read_error(unsigned char *sec,uint32_t size,uint32_t offset,uint8_t expected_tag); + read_error(const std::string& s) : err_string(s) {} + + const std::string& what() const { return err_string ; } + private: + std::string err_string ; + }; + + + static bool writeField( unsigned char*&buff,uint32_t& buff_size,uint32_t& offset,uint8_t section_tag,const unsigned char * val,uint32_t size) ; static bool readField (const unsigned char *buff,uint32_t buff_size,uint32_t& offset,uint8_t check_section_tag, unsigned char *& val,uint32_t& size) ; template static bool serialise(unsigned char *buff,uint32_t size,uint32_t& offset,const T& val) ; diff --git a/libretroshare/src/libretroshare.pro b/libretroshare/src/libretroshare.pro index d96e7dc7f..0cb982ee6 100644 --- a/libretroshare/src/libretroshare.pro +++ b/libretroshare/src/libretroshare.pro @@ -47,6 +47,7 @@ file_lists { file_sharing/directory_updater.h \ file_sharing/rsfilelistitems.h \ file_sharing/dir_hierarchy.h \ + file_sharing/file_tree.h \ file_sharing/file_sharing_defaults.h SOURCES *= file_sharing/p3filelists.cc \ @@ -55,6 +56,7 @@ file_lists { file_sharing/directory_storage.cc \ file_sharing/directory_updater.cc \ file_sharing/dir_hierarchy.cc \ + file_sharing/file_tree.cc \ file_sharing/rsfilelistitems.cc } diff --git a/libretroshare/src/retroshare/rsfiles.h b/libretroshare/src/retroshare/rsfiles.h index 313ca26eb..22a7dd8bf 100644 --- a/libretroshare/src/retroshare/rsfiles.h +++ b/libretroshare/src/retroshare/rsfiles.h @@ -134,6 +134,36 @@ struct SharedDirStats uint64_t total_shared_size ; }; +// This class represents a tree of directories and files, only with their names size and hash. It is used to create collection links in the GUI +// and to transmit directory information between services. This class is independent from the existing FileHierarchy classes used in storage because +// we need a very copact serialization and storage size since we create links with it. Besides, we cannot afford to risk the leak of other local information +// by using the orignal classes. + +class FileTree +{ +public: + virtual ~FileTree() {} + + static FileTree *create(void *ref) ; + static FileTree *create(const std::string& radix64_string) ; + + virtual std::string toRadix64() const =0 ; + + // These methods allow the user to browse the hierarchy + + struct FileData { + std::string name ; + uint64_t size ; + RsFileHash hash ; + }; + + virtual uint32_t root() const { return 0;} + virtual bool getDirectoryContent(uint32_t index,std::vector& subdirs,std::vector& subfiles) const = 0; + + uint32_t mTotalFiles ; + uint64_t mTotalSize ; +}; + class RsFiles { public: From e1d501428837d8a417dbb25b7c8527bddc9be5a1 Mon Sep 17 00:00:00 2001 From: csoler Date: Wed, 18 Oct 2017 22:32:15 +0200 Subject: [PATCH 23/58] added copy links from file hierarchy --- libretroshare/src/file_sharing/file_tree.cc | 60 ++++++++++++++++--- libretroshare/src/file_sharing/file_tree.h | 4 ++ libretroshare/src/retroshare/rsfiles.h | 4 +- .../gui/FileTransfer/SharedFilesDialog.cpp | 16 ++++- 4 files changed, 74 insertions(+), 10 deletions(-) diff --git a/libretroshare/src/file_sharing/file_tree.cc b/libretroshare/src/file_sharing/file_tree.cc index 59987553c..75736ddc8 100644 --- a/libretroshare/src/file_sharing/file_tree.cc +++ b/libretroshare/src/file_sharing/file_tree.cc @@ -30,15 +30,63 @@ FileTree *FileTree::create(const std::string& radix64_string) return ft ; } -static void recurs_buildFileTree(FileTreeImpl& ft,uint32_t index,void *ref) +void FileTreeImpl::recurs_buildFileTree(FileTreeImpl& ft,uint32_t index,const DirDetails& dd,bool remote) { + if(ft.mDirs.size() <= index) + ft.mDirs.resize(index+1) ; + + ft.mDirs[index].name = dd.name ; + ft.mDirs[index].subfiles.clear(); + ft.mDirs[index].subdirs.clear(); + + DirDetails dd2 ; + + FileSearchFlags flags = remote?RS_FILE_HINTS_REMOTE:RS_FILE_HINTS_LOCAL ; + + for(uint32_t i=0;iRequestDirDetails(dd.children[i].ref,dd2,flags)) + { + if(dd.children[i].type == DIR_TYPE_FILE) + { + FileTree::FileData f ; + f.name = dd2.name ; + f.size = dd2.count ; + f.hash = dd2.hash ; + + ft.mDirs[index].subfiles.push_back(ft.mFiles.size()) ; + ft.mFiles.push_back(f) ; + } + else if(dd.children[i].type == DIR_TYPE_DIR) + { + ft.mDirs[index].subdirs.push_back(ft.mDirs.size()); + recurs_buildFileTree(ft,ft.mDirs.size(),dd2,remote) ; + } + else + std::cerr << "(EE) Unsupported DirDetails type." << std::endl; + } + else + std::cerr << "(EE) Cannot request dir details for pointer " << dd.children[i].ref << std::endl; } -FileTree *FileTree::create(void *ref) +bool FileTreeImpl::getDirectoryContent(uint32_t index,std::vector& subdirs,std::vector& subfiles) const +{ + if(index >= mDirs.size()) + return false ; + + subdirs = mDirs[index].subdirs ; + + subfiles.clear() ; + for(uint32_t i=0;i subdirs ; @@ -22,4 +24,6 @@ protected: }; std::vector mFiles ; std::vector mDirs ; + + friend class FileTree ; }; diff --git a/libretroshare/src/retroshare/rsfiles.h b/libretroshare/src/retroshare/rsfiles.h index 22a7dd8bf..422b1e9fd 100644 --- a/libretroshare/src/retroshare/rsfiles.h +++ b/libretroshare/src/retroshare/rsfiles.h @@ -144,7 +144,7 @@ class FileTree public: virtual ~FileTree() {} - static FileTree *create(void *ref) ; + static FileTree *create(const DirDetails& dd, bool remote) ; static FileTree *create(const std::string& radix64_string) ; virtual std::string toRadix64() const =0 ; @@ -160,6 +160,8 @@ public: virtual uint32_t root() const { return 0;} virtual bool getDirectoryContent(uint32_t index,std::vector& subdirs,std::vector& subfiles) const = 0; + virtual void print() const=0; + uint32_t mTotalFiles ; uint64_t mTotalSize ; }; diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp index 9279642c3..a43e3cc5f 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp @@ -511,7 +511,8 @@ void RemoteSharedFilesDialog::spawnCustomPopupMenu( QPoint point ) connect( downloadAct , SIGNAL( triggered() ), this, SLOT( downloadRemoteSelected() ) ) ; contextMnu.addAction( downloadAct) ; - if ( type == DIR_TYPE_FILE ) { + //if ( type == DIR_TYPE_FILE ) + { contextMnu.addSeparator() ;//------------------------------------ contextMnu.addAction( copylinkAct) ; contextMnu.addAction( sendlinkAct) ; @@ -572,6 +573,18 @@ void SharedFilesDialog::copyLink (const QModelIndexList& lst, bool remote) if (details.type == DIR_TYPE_DIR) { + FileTree *ft = FileTree::create(details,remote) ; + + std::cerr << "Created collection file tree:" << std::endl; + ft->print(); + + RetroShareLink link = RetroShareLink::createCollection(QString::fromUtf8(details.name.c_str()), details.count,QString::fromStdString(ft->toRadix64())) ; + + if(link.valid()) + urls.push_back(link) ; + + delete ft ; +#ifdef TO_REMOVE for(uint32_t j=0;j Date: Wed, 18 Oct 2017 23:20:19 +0200 Subject: [PATCH 24/58] fixed up collection link display --- libretroshare/src/file_sharing/file_tree.cc | 6 +++++- libretroshare/src/file_sharing/file_tree.h | 6 +++++- .../gui/FileTransfer/SharedFilesDialog.cpp | 2 +- retroshare-gui/src/gui/RetroShareLink.cpp | 20 +++++++++++++------ retroshare-gui/src/gui/RetroShareLink.h | 3 ++- 5 files changed, 27 insertions(+), 10 deletions(-) diff --git a/libretroshare/src/file_sharing/file_tree.cc b/libretroshare/src/file_sharing/file_tree.cc index 75736ddc8..65eacbcef 100644 --- a/libretroshare/src/file_sharing/file_tree.cc +++ b/libretroshare/src/file_sharing/file_tree.cc @@ -55,6 +55,9 @@ void FileTreeImpl::recurs_buildFileTree(FileTreeImpl& ft,uint32_t index,const Di ft.mDirs[index].subfiles.push_back(ft.mFiles.size()) ; ft.mFiles.push_back(f) ; + + ft.mTotalFiles++ ; + ft.mTotalSize += f.size ; } else if(dd.children[i].type == DIR_TYPE_DIR) { @@ -264,7 +267,8 @@ bool FileTreeImpl::serialise(unsigned char *& buffer,uint32_t& buffer_size) cons void FileTreeImpl::print() const { - recurs_print(0,"") ; + std::cerr << "File hierarchy: name=" << mDirs[0].name << " size=" << mTotalSize << std::endl; + recurs_print(0," ") ; } void FileTreeImpl::recurs_print(uint32_t index,const std::string& indent) const diff --git a/libretroshare/src/file_sharing/file_tree.h b/libretroshare/src/file_sharing/file_tree.h index f4f951361..942414e67 100644 --- a/libretroshare/src/file_sharing/file_tree.h +++ b/libretroshare/src/file_sharing/file_tree.h @@ -3,7 +3,11 @@ class FileTreeImpl: public FileTree { public: - FileTreeImpl() {} + FileTreeImpl() + { + mTotalFiles = 0 ; + mTotalSize = 0 ; + } virtual std::string toRadix64() const ; virtual bool getDirectoryContent(uint32_t index,std::vector& subdirs,std::vector& subfiles) const ; diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp index a43e3cc5f..3a437c9cf 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp @@ -578,7 +578,7 @@ void SharedFilesDialog::copyLink (const QModelIndexList& lst, bool remote) std::cerr << "Created collection file tree:" << std::endl; ft->print(); - RetroShareLink link = RetroShareLink::createCollection(QString::fromUtf8(details.name.c_str()), details.count,QString::fromStdString(ft->toRadix64())) ; + RetroShareLink link = RetroShareLink::createCollection(QString::fromUtf8(details.name.c_str()),ft->mTotalSize,ft->mTotalFiles,QString::fromStdString(ft->toRadix64())) ; if(link.valid()) urls.push_back(link) ; diff --git a/retroshare-gui/src/gui/RetroShareLink.cpp b/retroshare-gui/src/gui/RetroShareLink.cpp index 27ec2c1a9..d141422f1 100644 --- a/retroshare-gui/src/gui/RetroShareLink.cpp +++ b/retroshare-gui/src/gui/RetroShareLink.cpp @@ -69,7 +69,7 @@ #define HOST_CERTIFICATE "certificate" #define HOST_PUBLIC_MSG "public_msg" #define HOST_IDENTITY "identity" -#define HOST_REGEXP "file|extra|person|forum|channel|posted|search|message|certificate|private_chat|public_msg|identity" +#define HOST_REGEXP "file|collection|extra|person|forum|channel|posted|search|message|certificate|private_chat|public_msg|identity" #define FILE_NAME "name" #define FILE_SIZE "size" @@ -79,6 +79,7 @@ #define COLLECTION_NAME "name" #define COLLECTION_SIZE "size" #define COLLECTION_DATA "radix" +#define COLLECTION_COUNT "files" #define PERSON_NAME "name" #define PERSON_HASH "hash" @@ -337,8 +338,9 @@ void RetroShareLink::fromUrl(const QUrl& url) bool ok; _type = TYPE_COLLECTION; _radix = decodedQueryItemValue(urlQuery, COLLECTION_DATA); + _name = decodedQueryItemValue(urlQuery, COLLECTION_NAME); _size = urlQuery.queryItemValue(COLLECTION_SIZE).toULongLong(&ok); - _name = urlQuery.queryItemValue(COLLECTION_NAME).toULongLong(&ok); + _count = urlQuery.queryItemValue(COLLECTION_COUNT).toULongLong(&ok); #ifdef DEBUG_RSLINK std::cerr << "Got a certificate link!!" << std::endl; @@ -418,12 +420,13 @@ RetroShareLink RetroShareLink::createFile(const QString& name, uint64_t size, co return link; } -RetroShareLink RetroShareLink::createCollection(const QString& name, const uint64_t size,const QString& radix_data) +RetroShareLink RetroShareLink::createCollection(const QString& name, uint64_t size, uint32_t count, const QString& radix_data) { RetroShareLink link; link.clear(); link._name = name; + link._count = count; link._size = size; link._radix = radix_data ; link._type = TYPE_COLLECTION; @@ -899,8 +902,10 @@ QString RetroShareLink::toString() const case TYPE_COLLECTION: url.setScheme(RSLINK_SCHEME); url.setHost(HOST_COLLECTION) ; - urlQuery.addQueryItem(CERTIFICATE_RADIX, encodeItem(_radix)); - urlQuery.addQueryItem(CERTIFICATE_NAME, encodeItem(_name)); + urlQuery.addQueryItem(COLLECTION_NAME, encodeItem(_name)); + urlQuery.addQueryItem(COLLECTION_SIZE, QString::number(_size)); + urlQuery.addQueryItem(COLLECTION_DATA, encodeItem(_radix)); + urlQuery.addQueryItem(COLLECTION_COUNT, QString::number(_count)); break; case TYPE_CERTIFICATE: @@ -925,11 +930,14 @@ QString RetroShareLink::niceName() const if (type() == TYPE_PERSON) return PeerDefs::rsid(name().toUtf8().constData(), RsPgpId(hash().toStdString())); + if(type() == TYPE_COLLECTION) + return QObject::tr("%1 (%2 files, %3)").arg(_name).arg(_count).arg(misc::friendlyUnit(_size)); + if(type() == TYPE_IDENTITY) return QObject::tr("Identity link (name=%1, ID=%2)").arg(_name).arg(_hash) ; if(type() == TYPE_COLLECTION) - return QObject::tr("Click to browse/download this file collection"); + return QObject::tr("File directory (Total %s) Click to browse/download this file collection").arg(misc::friendlyUnit(_size)); if(type() == TYPE_PUBLIC_MSG) { RsPeerDetails detail; diff --git a/retroshare-gui/src/gui/RetroShareLink.h b/retroshare-gui/src/gui/RetroShareLink.h index a2e54798d..2576b880c 100644 --- a/retroshare-gui/src/gui/RetroShareLink.h +++ b/retroshare-gui/src/gui/RetroShareLink.h @@ -81,7 +81,7 @@ class RetroShareLink static RetroShareLink createIdentity(const RsGxsId& gxs_id,const QString& name,const QString& radix_data) ; static RetroShareLink createExtraFile(const QString& name, uint64_t size, const QString& hash, const QString& ssl_id); static RetroShareLink createFile(const QString& name, uint64_t size, const QString& hash); - static RetroShareLink createCollection(const QString& name, const uint64_t size,const QString& radix_data); + static RetroShareLink createCollection(const QString& name, uint64_t size,uint32_t count,const QString& radix_data); static RetroShareLink createPublicMsgInvite(time_t time_stamp,const QString& pgp_id,const QString& hash) ; static RetroShareLink createPerson(const RsPgpId &id); static RetroShareLink createCertificate(const RsPeerId &ssl_id) ; @@ -169,6 +169,7 @@ class RetroShareLink QString _encrypted_chat_info ; // encrypted data string for the recipient of a chat invite time_t _time_stamp ; // time stamp at which the link will expire. QString _radix_group_data; + uint32_t _count ; unsigned int _subType; // for general use as sub type for _type (RSLINK_SUBTYPE_...) }; From 32be00614d8251249965f87f021243ce8d444f3a Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 19 Oct 2017 10:19:56 +0200 Subject: [PATCH 25/58] various improvements to collection links --- libretroshare/src/file_sharing/file_tree.cc | 3 +- libretroshare/src/file_sharing/file_tree.h | 2 +- libretroshare/src/retroshare/rsfiles.h | 2 +- .../gui/FileTransfer/SharedFilesDialog.cpp | 1 + retroshare-gui/src/gui/RetroShareLink.cpp | 8 ++-- .../src/gui/common/RsCollectionEditor.cpp | 45 ++++++++++++++++++- .../src/gui/common/RsCollectionEditor.h | 28 +++++++----- 7 files changed, 69 insertions(+), 20 deletions(-) diff --git a/libretroshare/src/file_sharing/file_tree.cc b/libretroshare/src/file_sharing/file_tree.cc index 65eacbcef..8a1f11fc5 100644 --- a/libretroshare/src/file_sharing/file_tree.cc +++ b/libretroshare/src/file_sharing/file_tree.cc @@ -71,11 +71,12 @@ void FileTreeImpl::recurs_buildFileTree(FileTreeImpl& ft,uint32_t index,const Di std::cerr << "(EE) Cannot request dir details for pointer " << dd.children[i].ref << std::endl; } -bool FileTreeImpl::getDirectoryContent(uint32_t index,std::vector& subdirs,std::vector& subfiles) const +bool FileTreeImpl::getDirectoryContent(uint32_t index,std::string& name,std::vector& subdirs,std::vector& subfiles) const { if(index >= mDirs.size()) return false ; + name = mDirs[index].name; subdirs = mDirs[index].subdirs ; subfiles.clear() ; diff --git a/libretroshare/src/file_sharing/file_tree.h b/libretroshare/src/file_sharing/file_tree.h index 942414e67..5f94bdf48 100644 --- a/libretroshare/src/file_sharing/file_tree.h +++ b/libretroshare/src/file_sharing/file_tree.h @@ -10,7 +10,7 @@ public: } virtual std::string toRadix64() const ; - virtual bool getDirectoryContent(uint32_t index,std::vector& subdirs,std::vector& subfiles) const ; + virtual bool getDirectoryContent(uint32_t index,std::string& name,std::vector& subdirs,std::vector& subfiles) const ; virtual void print() const ; bool serialise(unsigned char *& data,uint32_t& data_size) const ; diff --git a/libretroshare/src/retroshare/rsfiles.h b/libretroshare/src/retroshare/rsfiles.h index 422b1e9fd..64af23885 100644 --- a/libretroshare/src/retroshare/rsfiles.h +++ b/libretroshare/src/retroshare/rsfiles.h @@ -158,7 +158,7 @@ public: }; virtual uint32_t root() const { return 0;} - virtual bool getDirectoryContent(uint32_t index,std::vector& subdirs,std::vector& subfiles) const = 0; + virtual bool getDirectoryContent(uint32_t index,std::string& name,std::vector& subdirs,std::vector& subfiles) const = 0; virtual void print() const=0; diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp index 3a437c9cf..0f0244818 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp @@ -1014,6 +1014,7 @@ void LocalSharedFilesDialog::spawnCustomPopupMenu( QPoint point ) switch (type) { case DIR_TYPE_DIR : contextMnu.addAction(openfolderAct) ; + contextMnu.addAction(copylinkAct) ; contextMnu.addSeparator() ;//------------------------------------ contextMnu.addMenu(&collectionMenu) ; break ; diff --git a/retroshare-gui/src/gui/RetroShareLink.cpp b/retroshare-gui/src/gui/RetroShareLink.cpp index d141422f1..5a417cc37 100644 --- a/retroshare-gui/src/gui/RetroShareLink.cpp +++ b/retroshare-gui/src/gui/RetroShareLink.cpp @@ -1393,10 +1393,12 @@ static void processList(const QStringList &list, const QString &textSingular, co case TYPE_COLLECTION: { - //FileHierarchy fh ; - //fh.initFromRadix(_radix); + FileTree *ft = FileTree::create(_radix.toStdString()) ; - QMessageBox::information(NULL,"Unimplemented code","File collection links not handled yet.") ; + RsCollectionEditor colled(*ft,NULL) ; + colled.exec(); + + delete ft; } break; diff --git a/retroshare-gui/src/gui/common/RsCollectionEditor.cpp b/retroshare-gui/src/gui/common/RsCollectionEditor.cpp index 7abfe3f92..ea76231bd 100644 --- a/retroshare-gui/src/gui/common/RsCollectionEditor.cpp +++ b/retroshare-gui/src/gui/common/RsCollectionEditor.cpp @@ -43,6 +43,15 @@ RsCollectionEditor::RsCollectionEditor(QObject *parent) { } +RsCollectionEditor::RsCollectionEditor(const FileTree& fr, QObject *parent) + : QObject(parent), _xml_doc("RsCollection") +{ + QDomElement root = _xml_doc.createElement("RsCollection"); + _xml_doc.appendChild(root); + + recursAddElements(_xml_doc,fr,0,root) ; +} + RsCollectionEditor::RsCollectionEditor(const std::vector& file_infos, QObject *parent) : QObject(parent), _xml_doc("RsCollection") { @@ -186,7 +195,7 @@ void RsCollectionEditor::recursAddElements(QDomDocument& doc,const ColFileInfo& f.setAttribute(QString("size"),QString::number(colFileInfo.size)) ; e.appendChild(f) ; -} + } else if (colFileInfo.type == DIR_TYPE_DIR) { QDomElement d = doc.createElement("Directory") ; @@ -194,7 +203,7 @@ void RsCollectionEditor::recursAddElements(QDomDocument& doc,const ColFileInfo& d.setAttribute(QString("name"),colFileInfo.name) ; for (std::vector::const_iterator it = colFileInfo.children.begin(); it != colFileInfo.children.end(); ++it) -{ + { recursAddElements(doc,(*it),d) ; } @@ -202,6 +211,34 @@ void RsCollectionEditor::recursAddElements(QDomDocument& doc,const ColFileInfo& } } +void RsCollectionEditor::recursAddElements(QDomDocument& doc,const FileTree& ft,uint32_t index,QDomElement& e) const +{ + std::vector subdirs ; + std::vector subfiles ; + std::string name; + + if(!ft.getDirectoryContent(index,name,subdirs,subfiles)) + return ; + + QDomElement d = doc.createElement("Directory") ; + d.setAttribute(QString::fromUtf8()("name"),QString::fromUtf8(name.c_str())) ; + e.appendChild(d) ; + + for (uint32_t i=0;i& file_entries, QObject *parent = 0) ; + RsCollectionEditor(const FileTree& fr, QObject *parent); virtual ~RsCollectionEditor() ; static const QString ExtensionString ; - // Loads file from disk. - bool load(QWidget *parent); + // Loads file from disk. + bool load(QWidget *parent); bool load(const QString& fileName, bool showError = true); - // Save to disk - bool save(QWidget *parent) const ; + // Loads from FileTree + bool load(const FileTree& f); + + // Save to disk + bool save(QWidget *parent) const ; bool save(const QString& fileName) const ; // Open new collection @@ -84,28 +88,28 @@ public: // Open existing collection bool openColl(const QString& fileName, bool readOnly = false, bool showError = true); - // Download the content. - void downloadFiles() const ; + // Download the content. + void downloadFiles() const ; - qulonglong size(); + qulonglong size(); static bool isCollectionFile(const QString& fileName); private slots: void saveColl(std::vector colFileInfos, const QString& fileName); - private: +private: - void recursAddElements(QDomDocument&,const DirDetails&,QDomElement&) const ; + void recursAddElements(QDomDocument&,const DirDetails&,QDomElement&) const ; void recursAddElements(QDomDocument&,const ColFileInfo&,QDomElement&) const; void recursCollectColFileInfos(const QDomElement&,std::vector& colFileInfos,const QString& current_dir,bool bad_chars_in_parent) const ; // check that the file is a valid rscollection file, and not a lol bomb or some shit like this static bool checkFile(const QString &fileName, bool showError); - QDomDocument _xml_doc ; + QDomDocument _xml_doc ; QString _fileName ; bool _saved; - friend class RsCollectionDialog ; + friend class RsCollectionDialog ; }; From 74d5069225d9658ffbe441743034307cf6aa6f91 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 19 Oct 2017 22:14:04 +0200 Subject: [PATCH 26/58] renamed RsCollectionEditor into RsCollection. Added download of FileTree links --- .../src/gui/FileTransfer/SearchDialog.cpp | 20 ++--- .../gui/FileTransfer/SharedFilesDialog.cpp | 28 +++--- .../src/gui/FileTransfer/TransfersDialog.cpp | 86 +++++++++---------- retroshare-gui/src/gui/MainWindow.cpp | 8 +- retroshare-gui/src/gui/RemoteDirModel.cpp | 4 +- retroshare-gui/src/gui/RetroShareLink.cpp | 11 ++- retroshare-gui/src/gui/common/FilesDefs.cpp | 4 +- ...sCollectionEditor.cpp => RsCollection.cpp} | 73 ++++++++-------- .../{RsCollectionEditor.h => RsCollection.h} | 15 ++-- .../src/gui/common/RsCollectionDialog.cpp | 10 +-- .../src/gui/common/RsCollectionDialog.h | 2 +- .../src/gui/common/RsUrlHandler.cpp | 6 +- retroshare-gui/src/retroshare-gui.pro | 4 +- 13 files changed, 132 insertions(+), 139 deletions(-) rename retroshare-gui/src/gui/common/{RsCollectionEditor.cpp => RsCollection.cpp} (84%) rename retroshare-gui/src/gui/common/{RsCollectionEditor.h => RsCollection.h} (90%) diff --git a/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp index e55493a0c..facb8b60d 100644 --- a/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SearchDialog.cpp @@ -30,7 +30,7 @@ #include "gui/RetroShareLink.h" #include "retroshare-gui/RsAutoUpdatePage.h" #include "gui/msgs/MessageComposer.h" -#include "gui/common/RsCollectionEditor.h" +#include "gui/common/RsCollection.h" #include "gui/common/FilesDefs.h" #include "gui/common/RsUrlHandler.h" #include "gui/settings/rsharesettings.h" @@ -345,7 +345,7 @@ void SearchDialog::searchResultWidgetCustomPopupMenu( QPoint /*point*/ ) QList item =ui.searchResultWidget->selectedItems() ; if (item.at(0)->data(SR_DATA_COL, SR_ROLE_LOCAL).toBool()) { contextMnu.addAction(QIcon(IMAGE_OPENFOLDER), tr("Open Folder"), this, SLOT(openFolderSearch())) ; - if (item.at(0)->text(SR_NAME_COL).endsWith(RsCollectionEditor::ExtensionString)) { + if (item.at(0)->text(SR_NAME_COL).endsWith(RsCollection::ExtensionString)) { add_CollActions = true ; }//if (item.at(0)->text(SR_NAME_COL).endsWith(RsCollectionFile::ExtensionString)) }//if (item.at(0)->data(SR_DATA_COL, SR_ROLE_LOCAL).toBool()) @@ -448,7 +448,7 @@ void SearchDialog::collCreate() }//if (!item->text(SR_HASH_COL).isEmpty()) }//for (int i = 0; i < numdls; ++i) - RsCollectionEditor(dirVec).openNewColl(this); + RsCollection(dirVec).openNewColl(this); } void SearchDialog::collModif() @@ -476,8 +476,8 @@ void SearchDialog::collModif() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { - RsCollectionEditor collection; + if (qinfo.absoluteFilePath().endsWith(RsCollection::ExtensionString)) { + RsCollection collection; collection.openColl(qinfo.absoluteFilePath()); }//if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) }//if (qinfo.exists()) @@ -508,8 +508,8 @@ void SearchDialog::collView() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { - RsCollectionEditor collection; + if (qinfo.absoluteFilePath().endsWith(RsCollection::ExtensionString)) { + RsCollection collection; collection.openColl(qinfo.absoluteFilePath(), true); }//if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) }//if (qinfo.exists()) @@ -540,8 +540,8 @@ void SearchDialog::collOpen() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { - RsCollectionEditor collection; + if (qinfo.absoluteFilePath().endsWith(RsCollection::ExtensionString)) { + RsCollection collection; if (collection.load(qinfo.absoluteFilePath())) { collection.downloadFiles(); return; @@ -552,7 +552,7 @@ void SearchDialog::collOpen() } } - RsCollectionEditor collection; + RsCollection collection; if (collection.load(this)) { collection.downloadFiles(); }//if (collection.load(this)) diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp index 0f0244818..f071c3a66 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp @@ -37,7 +37,7 @@ #include "gui/RetroShareLink.h" #include "gui/ShareManager.h" #include "gui/common/PeerDefs.h" -#include "gui/common/RsCollectionEditor.h" +#include "gui/common/RsCollection.h" #include "gui/msgs/MessageComposer.h" #include "gui/settings/AddFileAssociationDialog.h" #include "gui/settings/rsharesettings.h" @@ -695,11 +695,11 @@ void SharedFilesDialog::collModif() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { - RsCollectionEditor collection; + if (qinfo.absoluteFilePath().endsWith(RsCollection::ExtensionString)) { + RsCollection collection; collection.openColl(qinfo.absoluteFilePath()); - }//if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) - }//if (qinfo.exists()) + } + } } void SharedFilesDialog::collView() @@ -725,11 +725,11 @@ void SharedFilesDialog::collView() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { - RsCollectionEditor collection; + if (qinfo.absoluteFilePath().endsWith(RsCollection::ExtensionString)) { + RsCollection collection; collection.openColl(qinfo.absoluteFilePath(), true); - }//if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) - }//if (qinfo.exists()) + } + } } void SharedFilesDialog::collOpen() @@ -755,8 +755,8 @@ void SharedFilesDialog::collOpen() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { - RsCollectionEditor collection; + if (qinfo.absoluteFilePath().endsWith(RsCollection::ExtensionString)) { + RsCollection collection; if (collection.load(qinfo.absoluteFilePath())) { collection.downloadFiles(); return; @@ -766,10 +766,10 @@ void SharedFilesDialog::collOpen() } } - RsCollectionEditor collection; + RsCollection collection; if (collection.load(this)) { collection.downloadFiles(); - }//if (collection.load(this)) + } } void LocalSharedFilesDialog::playselectedfiles() @@ -998,7 +998,7 @@ void LocalSharedFilesDialog::spawnCustomPopupMenu( QPoint point ) QMenu contextMnu(this) ; - bool bIsRsColl = currentFile.endsWith(RsCollectionEditor::ExtensionString); + bool bIsRsColl = currentFile.endsWith(RsCollection::ExtensionString); collCreateAct->setEnabled(true); collModifAct->setEnabled(bIsRsColl); collViewAct->setEnabled(bIsRsColl); diff --git a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp index 98bc7f3cb..b6c3376a5 100644 --- a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp @@ -31,7 +31,7 @@ #include #include -#include +#include #include #include @@ -50,7 +50,7 @@ #include "xprogressbar.h" #include #include "util/misc.h" -#include +#include #include "TransferUserNotify.h" #include "util/QtVersion.h" #include "util/RsFile.h" @@ -679,20 +679,20 @@ void TransfersDialog::downloadListCustomPopupMenu( QPoint /*point*/ ) */ if (info.downloadStatus == FT_STATE_WAITING) { atLeastOne_Waiting = true ; - }//if (info.downloadStatus == FT_STATE_WAITING) + } if (info.downloadStatus == FT_STATE_DOWNLOADING) { atLeastOne_Downloading=true ; - }//if (info.downloadStatus == FT_STATE_DOWNLOADING) + } if (info.downloadStatus == FT_STATE_COMPLETE) { atLeastOne_Complete = true ; add_OpenFileOption = single ; - }//if (info.downloadStatus == FT_STATE_COMPLETE) + } if (info.downloadStatus == FT_STATE_QUEUED) { atLeastOne_Queued = true ; - }//if(info.downloadStatus == FT_STATE_QUEUED) + } if (info.downloadStatus == FT_STATE_PAUSED) { atLeastOne_Paused = true ; - }//if (info.downloadStatus == FT_STATE_PAUSED) + } size_t pos = info.fname.find_last_of('.') ; if (pos != std::string::npos) { @@ -700,23 +700,23 @@ void TransfersDialog::downloadListCustomPopupMenu( QPoint /*point*/ ) if (misc::isPreviewable(info.fname.substr(pos + 1).c_str())) { add_PreviewOption = (info.downloadStatus != FT_STATE_COMPLETE) ; add_PlayOption = !add_PreviewOption ; - }// if (misc::isPreviewable(info.fname.substr(pos + 1).c_str())) + } // Check if the file is a collection - if (RsCollectionEditor::ExtensionString == info.fname.substr(pos + 1).c_str()) { + if (RsCollection::ExtensionString == info.fname.substr(pos + 1).c_str()) { add_CollActions = (info.downloadStatus == FT_STATE_COMPLETE); - }//if (RsCollectionFile::ExtensionString == info - }// if(pos != std::string::npos) + } + } - }// if FileDetails - }// for items iterate - }// if (!items.empty()) + } + } + } if (atLeastOne_Waiting || atLeastOne_Downloading || atLeastOne_Queued || atLeastOne_Paused) { contextMnu.addMenu( &prioritySpeedMenu) ; } if (atLeastOne_Queued) { contextMnu.addMenu( &priorityQueueMenu) ; - }//if (atLeastOne_Queued) + } if ( (!items.empty()) && (atLeastOne_Downloading || atLeastOne_Queued || atLeastOne_Waiting || atLeastOne_Paused)) { @@ -724,7 +724,7 @@ void TransfersDialog::downloadListCustomPopupMenu( QPoint /*point*/ ) if (single) { contextMnu.addAction( renameFileAct) ; - }//if (single) + } QMenu *directoryMenu = contextMnu.addMenu(QIcon(IMAGE_OPENFOLDER), tr("Set destination directory")) ; directoryMenu->addAction(specifyDestinationDirectoryAct) ; @@ -745,27 +745,27 @@ void TransfersDialog::downloadListCustomPopupMenu( QPoint /*point*/ ) act->setData(QString::fromUtf8( (*it).filename.c_str() ) ) ; connect(act, SIGNAL(triggered()), this, SLOT(setDestinationDirectory())) ; directoryMenu->addAction( act) ; - }//for (std::list::const_iterator it - }//if ( (!items.empty()) && + } + } if (atLeastOne_Paused) { contextMnu.addAction(resumeAct) ; - }//if (atLeastOne_Paused) + } if (atLeastOne_Downloading || atLeastOne_Queued || atLeastOne_Waiting) { contextMnu.addAction(pauseAct) ; - }//if (atLeastOne_Downloading || atLeastOne_Queued || atLeastOne_Waiting) + } if (!atLeastOne_Complete && !items.empty()) { contextMnu.addAction(forceCheckAct) ; contextMnu.addAction(cancelAct) ; - }//if (!atLeastOne_Complete && !items.empty()) + } if (add_PlayOption) { contextMnu.addAction(playAct) ; - }//if (add_PlayOption) + } if (atLeastOne_Paused || atLeastOne_Downloading || atLeastOne_Complete || add_PlayOption) { contextMnu.addSeparator() ;//------------------------------------------------ - }//if (atLeastOne_Paused || + } if (single) { if (add_OpenFileOption) contextMnu.addAction( openFileAct) ; @@ -773,20 +773,20 @@ void TransfersDialog::downloadListCustomPopupMenu( QPoint /*point*/ ) contextMnu.addAction( openFolderAct) ; contextMnu.addAction( detailsFileAct) ; contextMnu.addSeparator() ;//-------------------------------------------- - }//if (single) + } contextMnu.addAction( clearCompletedAct) ; contextMnu.addSeparator() ;//------------------------------------------------ if (add_CopyLink) { contextMnu.addAction( copyLinkAct) ; - }//if (add_CopyLink) + } if (add_PasteLink) { contextMnu.addAction( pasteLinkAct) ; - }//if (add_PasteLink) + } if (add_CopyLink || add_PasteLink) { contextMnu.addSeparator() ;//-------------------------------------------- - }//if (add_CopyLink || add_PasteLink) + } if (DLLFilterModel->rowCount()>0 ) { contextMnu.addAction( expandAllDLAct ) ; @@ -2153,9 +2153,9 @@ void TransfersDialog::collCreate() details.type = DIR_TYPE_FILE; dirVec.push_back(details); - }//for (it = items.begin(); + } - RsCollectionEditor(dirVec).openNewColl(this); + RsCollection(dirVec).openNewColl(this); } void TransfersDialog::collModif() @@ -2180,12 +2180,12 @@ void TransfersDialog::collModif() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { - RsCollectionEditor collection; + if (qinfo.absoluteFilePath().endsWith(RsCollection::ExtensionString)) { + RsCollection collection; collection.openColl(qinfo.absoluteFilePath()); - }//if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) - }//if (qinfo.exists()) - }//if (info.downloadStatus == FT_STATE_COMPLETE) + } + } + } } void TransfersDialog::collView() @@ -2210,12 +2210,12 @@ void TransfersDialog::collView() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { - RsCollectionEditor collection; + if (qinfo.absoluteFilePath().endsWith(RsCollection::ExtensionString)) { + RsCollection collection; collection.openColl(qinfo.absoluteFilePath(), true); - }//if (qinfo.absoluteFilePath().endsWith(RsCollectionFile::ExtensionString)) - }//if (qinfo.exists()) - }//if (info.downloadStatus == FT_STATE_COMPLETE) + } + } + } } void TransfersDialog::collOpen() @@ -2240,8 +2240,8 @@ void TransfersDialog::collOpen() QFileInfo qinfo; qinfo.setFile(QString::fromUtf8(path.c_str())); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { - RsCollectionEditor collection; + if (qinfo.absoluteFilePath().endsWith(RsCollection::ExtensionString)) { + RsCollection collection; if (collection.load(qinfo.absoluteFilePath())) { collection.downloadFiles(); return; @@ -2252,10 +2252,10 @@ void TransfersDialog::collOpen() } } - RsCollectionEditor collection; + RsCollection collection; if (collection.load(this)) { collection.downloadFiles(); - }//if (collection.load(this)) + } } void TransfersDialog::setShowDLSizeColumn(bool show) diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index d3bb3200f..ea57a93b6 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -103,7 +103,7 @@ #include "gui/statistics/StatisticsWindow.h" #include "gui/connect/ConnectFriendWizard.h" -#include "gui/common/RsCollectionEditor.h" +#include "gui/common/RsCollection.h" #include "settings/rsettingswin.h" #include "settings/rsharesettings.h" #include "settings/WebuiPage.h" @@ -1020,7 +1020,7 @@ void MainWindow::newRsCollection() { std::vector dirVec; - RsCollectionEditor(dirVec).openNewColl(this); + RsCollection(dirVec).openNewColl(this); } /** Shows Share Manager */ @@ -1448,8 +1448,8 @@ void MainWindow::openRsCollection(const QString &filename) { QFileInfo qinfo(filename); if (qinfo.exists()) { - if (qinfo.absoluteFilePath().endsWith(RsCollectionEditor::ExtensionString)) { - RsCollectionEditor collection; + if (qinfo.absoluteFilePath().endsWith(RsCollection::ExtensionString)) { + RsCollection collection; collection.openColl(qinfo.absoluteFilePath()); } } diff --git a/retroshare-gui/src/gui/RemoteDirModel.cpp b/retroshare-gui/src/gui/RemoteDirModel.cpp index 29f08b6a5..7ffbcf5bd 100644 --- a/retroshare-gui/src/gui/RemoteDirModel.cpp +++ b/retroshare-gui/src/gui/RemoteDirModel.cpp @@ -26,7 +26,7 @@ #include #include -#include +#include #include #include #include @@ -1065,7 +1065,7 @@ void RetroshareDirModel::createCollectionFile(QWidget *parent, const QModelIndex std::vector dirVec; getDirDetailsFromSelect(list, dirVec); - RsCollectionEditor(dirVec).openNewColl(parent); + RsCollection(dirVec).openNewColl(parent); } void RetroshareDirModel::downloadSelected(const QModelIndexList &list) diff --git a/retroshare-gui/src/gui/RetroShareLink.cpp b/retroshare-gui/src/gui/RetroShareLink.cpp index 5a417cc37..7a1e32aae 100644 --- a/retroshare-gui/src/gui/RetroShareLink.cpp +++ b/retroshare-gui/src/gui/RetroShareLink.cpp @@ -43,7 +43,7 @@ #include "msgs/MessageComposer.h" #include "util/misc.h" #include "common/PeerDefs.h" -#include "common/RsCollectionEditor.h" +#include "common/RsCollection.h" #include #include "gui/connect/ConnectFriendWizard.h" #include "gui/connect/ConfCertDialog.h" @@ -980,10 +980,10 @@ QString RetroShareLink::toHtmlSize() const { QString size = QString("(%1)").arg(misc::friendlyUnit(_size)); - if (type() == TYPE_FILE && RsCollectionEditor::isCollectionFile(name())) { + if (type() == TYPE_FILE && RsCollection::isCollectionFile(name())) { FileInfo finfo; if (rsFiles->FileDetails(RsFileHash(hash().toStdString()), RS_FILE_HINTS_EXTRA | RS_FILE_HINTS_LOCAL, finfo)) { - RsCollectionEditor collection; + RsCollection collection; if (collection.load(QString::fromUtf8(finfo.path.c_str()), false)) { size += QString(" [%1]").arg(misc::friendlyUnit(collection.size())); } @@ -1393,10 +1393,9 @@ static void processList(const QStringList &list, const QString &textSingular, co case TYPE_COLLECTION: { - FileTree *ft = FileTree::create(_radix.toStdString()) ; + FileTree *ft = FileTree::create(link.radix().toStdString()) ; - RsCollectionEditor colled(*ft,NULL) ; - colled.exec(); + RsCollection(*ft).downloadFiles() ; delete ft; } diff --git a/retroshare-gui/src/gui/common/FilesDefs.cpp b/retroshare-gui/src/gui/common/FilesDefs.cpp index 063c85e3b..b20660b20 100644 --- a/retroshare-gui/src/gui/common/FilesDefs.cpp +++ b/retroshare-gui/src/gui/common/FilesDefs.cpp @@ -23,7 +23,7 @@ #include #include "FilesDefs.h" -#include "RsCollectionEditor.h" +#include "RsCollection.h" static QString getInfoFromFilename(const QString& filename, bool anyForUnknown, bool image) { @@ -54,7 +54,7 @@ static QString getInfoFromFilename(const QString& filename, bool anyForUnknown, return image ? ":/images/FileTypeDocument.png" : QApplication::translate("FilesDefs", "Document"); } else if (ext == "pdf") { return image ? ":/images/mimetypes/pdf.png" : QApplication::translate("FilesDefs", "Document"); - } else if (ext == RsCollectionEditor::ExtensionString) { + } else if (ext == RsCollection::ExtensionString) { return image ? ":/images/mimetypes/rscollection-16.png" : QApplication::translate("FilesDefs", "RetroShare collection file"); } else if (ext == "sub" || ext == "srt") { return image ? ":/images/FileTypeAny.png" : QApplication::translate("FilesDefs", "Subtitles"); diff --git a/retroshare-gui/src/gui/common/RsCollectionEditor.cpp b/retroshare-gui/src/gui/common/RsCollection.cpp similarity index 84% rename from retroshare-gui/src/gui/common/RsCollectionEditor.cpp rename to retroshare-gui/src/gui/common/RsCollection.cpp index ea76231bd..a7ba9637a 100644 --- a/retroshare-gui/src/gui/common/RsCollectionEditor.cpp +++ b/retroshare-gui/src/gui/common/RsCollection.cpp @@ -24,7 +24,7 @@ #include #include -#include "RsCollectionEditor.h" +#include "RsCollection.h" #include "RsCollectionDialog.h" #include "util/misc.h" @@ -36,15 +36,15 @@ #include #include -const QString RsCollectionEditor::ExtensionString = QString("rscollection") ; +const QString RsCollection::ExtensionString = QString("rscollection") ; -RsCollectionEditor::RsCollectionEditor(QObject *parent) +RsCollection::RsCollection(QObject *parent) : QObject(parent), _xml_doc("RsCollection") { } -RsCollectionEditor::RsCollectionEditor(const FileTree& fr, QObject *parent) - : QObject(parent), _xml_doc("RsCollection") +RsCollection::RsCollection(const FileTree& fr) + : _xml_doc("RsCollection") { QDomElement root = _xml_doc.createElement("RsCollection"); _xml_doc.appendChild(root); @@ -52,7 +52,7 @@ RsCollectionEditor::RsCollectionEditor(const FileTree& fr, QObject *parent) recursAddElements(_xml_doc,fr,0,root) ; } -RsCollectionEditor::RsCollectionEditor(const std::vector& file_infos, QObject *parent) +RsCollection::RsCollection(const std::vector& file_infos, QObject *parent) : QObject(parent), _xml_doc("RsCollection") { QDomElement root = _xml_doc.createElement("RsCollection"); @@ -62,11 +62,11 @@ RsCollectionEditor::RsCollectionEditor(const std::vector& file_infos recursAddElements(_xml_doc,file_infos[i],root) ; } -RsCollectionEditor::~RsCollectionEditor() +RsCollection::~RsCollection() { } -void RsCollectionEditor::downloadFiles() const +void RsCollection::downloadFiles() const { // print out the element names of all elements that are direct children // of the outermost element. @@ -96,7 +96,7 @@ static QString purifyFileName(const QString& input,bool& bad) return output ; } -void RsCollectionEditor::recursCollectColFileInfos(const QDomElement& e,std::vector& colFileInfos,const QString& current_path, bool bad_chars_in_parent) const +void RsCollection::recursCollectColFileInfos(const QDomElement& e,std::vector& colFileInfos,const QString& current_path, bool bad_chars_in_parent) const { QDomNode n = e.firstChild() ; @@ -148,7 +148,7 @@ void RsCollectionEditor::recursCollectColFileInfos(const QDomElement& e,std::vec } -void RsCollectionEditor::recursAddElements(QDomDocument& doc,const DirDetails& details,QDomElement& e) const +void RsCollection::recursAddElements(QDomDocument& doc,const DirDetails& details,QDomElement& e) const { if (details.type == DIR_TYPE_FILE) { @@ -184,7 +184,7 @@ void RsCollectionEditor::recursAddElements(QDomDocument& doc,const DirDetails& d } } -void RsCollectionEditor::recursAddElements(QDomDocument& doc,const ColFileInfo& colFileInfo,QDomElement& e) const +void RsCollection::recursAddElements(QDomDocument& doc,const ColFileInfo& colFileInfo,QDomElement& e) const { if (colFileInfo.type == DIR_TYPE_FILE) { @@ -211,7 +211,7 @@ void RsCollectionEditor::recursAddElements(QDomDocument& doc,const ColFileInfo& } } -void RsCollectionEditor::recursAddElements(QDomDocument& doc,const FileTree& ft,uint32_t index,QDomElement& e) const +void RsCollection::recursAddElements(QDomDocument& doc,const FileTree& ft,uint32_t index,QDomElement& e) const { std::vector subdirs ; std::vector subfiles ; @@ -221,7 +221,7 @@ void RsCollectionEditor::recursAddElements(QDomDocument& doc,const FileTree& ft, return ; QDomElement d = doc.createElement("Directory") ; - d.setAttribute(QString::fromUtf8()("name"),QString::fromUtf8(name.c_str())) ; + d.setAttribute(QString("name"),QString::fromUtf8(name.c_str())) ; e.appendChild(d) ; for (uint32_t i=0;i colFileInfos ; @@ -474,11 +469,11 @@ bool RsCollectionEditor::openColl(const QString& fileName, bool readOnly /* = fa delete rcd; return _saved; - }//if (load(fileName, showError)) + } return false; } -qulonglong RsCollectionEditor::size() +qulonglong RsCollection::size() { QDomElement docElem = _xml_doc.documentElement(); @@ -494,14 +489,14 @@ qulonglong RsCollectionEditor::size() return size; } -bool RsCollectionEditor::isCollectionFile(const QString &fileName) +bool RsCollection::isCollectionFile(const QString &fileName) { QString ext = QFileInfo(fileName).suffix().toLower(); - return (ext == RsCollectionEditor::ExtensionString); + return (ext == RsCollection::ExtensionString); } -void RsCollectionEditor::saveColl(std::vector colFileInfos, const QString &fileName) +void RsCollection::saveColl(std::vector colFileInfos, const QString &fileName) { QDomElement root = _xml_doc.elementsByTagName("RsCollection").at(0).toElement(); diff --git a/retroshare-gui/src/gui/common/RsCollectionEditor.h b/retroshare-gui/src/gui/common/RsCollection.h similarity index 90% rename from retroshare-gui/src/gui/common/RsCollectionEditor.h rename to retroshare-gui/src/gui/common/RsCollection.h index 0f291401e..f42b81db0 100644 --- a/retroshare-gui/src/gui/common/RsCollectionEditor.h +++ b/retroshare-gui/src/gui/common/RsCollection.h @@ -56,17 +56,17 @@ public: }; Q_DECLARE_METATYPE(ColFileInfo) -class RsCollectionEditor : public QObject +class RsCollection : public QObject { Q_OBJECT public: - RsCollectionEditor(QObject *parent = 0) ; + RsCollection(QObject *parent = 0) ; // create from list of files and directories - RsCollectionEditor(const std::vector& file_entries, QObject *parent = 0) ; - RsCollectionEditor(const FileTree& fr, QObject *parent); - virtual ~RsCollectionEditor() ; + RsCollection(const std::vector& file_entries, QObject *parent = 0) ; + RsCollection(const FileTree& fr); + virtual ~RsCollection() ; static const QString ExtensionString ; @@ -76,9 +76,6 @@ public: bool load(QWidget *parent); bool load(const QString& fileName, bool showError = true); - // Loads from FileTree - bool load(const FileTree& f); - // Save to disk bool save(QWidget *parent) const ; bool save(const QString& fileName) const ; @@ -102,6 +99,8 @@ private: void recursAddElements(QDomDocument&,const DirDetails&,QDomElement&) const ; void recursAddElements(QDomDocument&,const ColFileInfo&,QDomElement&) const; + void recursAddElements(QDomDocument& doc,const FileTree& ft,uint32_t index,QDomElement& e) const; + void recursCollectColFileInfos(const QDomElement&,std::vector& colFileInfos,const QString& current_dir,bool bad_chars_in_parent) const ; // check that the file is a valid rscollection file, and not a lol bomb or some shit like this static bool checkFile(const QString &fileName, bool showError); diff --git a/retroshare-gui/src/gui/common/RsCollectionDialog.cpp b/retroshare-gui/src/gui/common/RsCollectionDialog.cpp index ee0aeec39..68599eeeb 100644 --- a/retroshare-gui/src/gui/common/RsCollectionDialog.cpp +++ b/retroshare-gui/src/gui/common/RsCollectionDialog.cpp @@ -29,7 +29,7 @@ #include #include #include "RsCollectionDialog.h" -#include "RsCollectionEditor.h" +#include "RsCollection.h" #include "util/misc.h" #define COLUMN_FILE 0 #define COLUMN_FILEPATH 1 @@ -591,12 +591,12 @@ void RsCollectionDialog::changeFileName() QString fileName; if(!misc::getSaveFileName(this, RshareSettings::LASTDIR_EXTRAFILE , QApplication::translate("RsCollectionFile", "Create collection file") - , QApplication::translate("RsCollectionFile", "Collection files") + " (*." + RsCollectionEditor::ExtensionString + ")" + , QApplication::translate("RsCollectionFile", "Collection files") + " (*." + RsCollection::ExtensionString + ")" , fileName,0, QFileDialog::DontConfirmOverwrite)) return; - if (!fileName.endsWith("." + RsCollectionEditor::ExtensionString)) - fileName += "." + RsCollectionEditor::ExtensionString ; + if (!fileName.endsWith("." + RsCollection::ExtensionString)) + fileName += "." + RsCollection::ExtensionString ; std::cerr << "Got file name: " << fileName.toStdString() << std::endl; @@ -604,7 +604,7 @@ void RsCollectionDialog::changeFileName() if(file.exists()) { - RsCollectionEditor collFile; + RsCollection collFile; if (!collFile.checkFile(fileName,true)) return; QMessageBox mb; diff --git a/retroshare-gui/src/gui/common/RsCollectionDialog.h b/retroshare-gui/src/gui/common/RsCollectionDialog.h index e5e5df86d..bac5289b4 100644 --- a/retroshare-gui/src/gui/common/RsCollectionDialog.h +++ b/retroshare-gui/src/gui/common/RsCollectionDialog.h @@ -22,7 +22,7 @@ ****************************************************************/ #include "ui_RsCollectionDialog.h" -#include "RsCollectionEditor.h" +#include "RsCollection.h" #include #include diff --git a/retroshare-gui/src/gui/common/RsUrlHandler.cpp b/retroshare-gui/src/gui/common/RsUrlHandler.cpp index 2e16b23c4..d307d7db1 100644 --- a/retroshare-gui/src/gui/common/RsUrlHandler.cpp +++ b/retroshare-gui/src/gui/common/RsUrlHandler.cpp @@ -22,14 +22,14 @@ #include #include #include -#include "RsCollectionEditor.h" +#include "RsCollection.h" #include "RsUrlHandler.h" bool RsUrlHandler::openUrl(const QUrl& url) { - if(url.scheme() == QString("file") && url.toLocalFile().endsWith("."+RsCollectionEditor::ExtensionString)) + if(url.scheme() == QString("file") && url.toLocalFile().endsWith("."+RsCollection::ExtensionString)) { - RsCollectionEditor collection ; + RsCollection collection ; if(collection.load(url.toLocalFile())) { collection.downloadFiles() ; diff --git a/retroshare-gui/src/retroshare-gui.pro b/retroshare-gui/src/retroshare-gui.pro index b762dc4ed..6b3211392 100644 --- a/retroshare-gui/src/retroshare-gui.pro +++ b/retroshare-gui/src/retroshare-gui.pro @@ -565,7 +565,7 @@ HEADERS += rshare.h \ gui/statistics/BWGraph.h \ util/RsSyntaxHighlighter.h \ util/imageutil.h \ - gui/common/RsCollectionEditor.h + gui/common/RsCollection.h # gui/ForumsDialog.h \ # gui/forums/ForumDetails.h \ @@ -925,7 +925,7 @@ SOURCES += main.cpp \ gui/statistics/BWGraph.cpp \ util/RsSyntaxHighlighter.cpp \ util/imageutil.cpp \ - gui/common/RsCollectionEditor.cpp + gui/common/RsCollection.cpp # gui/ForumsDialog.cpp \ # gui/forums/ForumDetails.cpp \ From 0fbcf0148c1e765d7654008ca257577ace9478ec Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 19 Oct 2017 22:20:23 +0200 Subject: [PATCH 27/58] code cleaning. Removed comments at end of conditional --- .../src/gui/common/RsCollectionDialog.cpp | 98 +++++++++---------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/retroshare-gui/src/gui/common/RsCollectionDialog.cpp b/retroshare-gui/src/gui/common/RsCollectionDialog.cpp index 68599eeeb..68c2a70b7 100644 --- a/retroshare-gui/src/gui/common/RsCollectionDialog.cpp +++ b/retroshare-gui/src/gui/common/RsCollectionDialog.cpp @@ -243,26 +243,26 @@ bool RsCollectionDialog::eventFilter(QObject *obj, QEvent *event) for (it = selectedItems.begin(); it != selectedItems.end(); ++it) { if ((*it)->checkState(COLUMN_FILE) != checkState) (*it)->setCheckState(COLUMN_FILE, checkState); - }//for (it - }//if (item) + } + } return true; // eat event - }//if (keyEvent && keyEvent->key() == Qt::Key_Space) + } if (keyEvent && (keyEvent->key() == Qt::Key_Delete)) { // Delete pressed remove(); return true; // eat event - }//if (keyEvent && keyEvent->key() == Qt::Key_Delete) + } if (keyEvent && (keyEvent->key() == Qt::Key_Plus)) { // Plus pressed makeDir(); return true; // eat event - }//if (keyEvent && keyEvent->key() == Qt::Key_Plus) + } - }//if (event->type() == QEvent::KeyPress) - }//if (obj == ui._fileEntriesTW) + } + } if (obj == ui._systemFileTW) { if (event->type() == QEvent::KeyPress) { @@ -277,9 +277,9 @@ bool RsCollectionDialog::eventFilter(QObject *obj, QEvent *event) } return true; // eat event - }//if (keyEvent && keyEvent->key() == Qt::Key_Enter... - }//if (event->type() == QEvent::KeyPress) - }//if (obj == ui._systemFileTW) + } + } + } // pass the event on to the parent class return QDialog::eventFilter(obj, event); @@ -452,7 +452,7 @@ bool RsCollectionDialog::addChild(QTreeWidgetItem* parent, const std::vectorsetToolTip(COLUMN_FILEC, tr("Real File Count=%1").arg(1)); item->setData(COLUMN_FILEC, ROLE_FILEC, 1); item->setData(COLUMN_FILEC, ROLE_SELFILEC, 1); - }//if (colFileInfo.type==DIR_TYPE_DIR + } item->setFont(COLUMN_FILE, font); if (colFileInfo.filename_has_wrong_characters) @@ -487,12 +487,12 @@ bool RsCollectionDialog::addChild(QTreeWidgetItem* parent, const std::vectorsetText(COLUMN_FILEC, QString("%1").arg(parentSelFileCount)); itemParent = itemParent->parent(); - }//while (itemParent) - }//if (itemParent) - }//if (colFileInfo.type==DIR_TYPE_FILE) + } + } + } founds.push_back(item); - }//(founds.empty()) + } if (!founds.empty()) { @@ -624,7 +624,7 @@ void RsCollectionDialog::changeFileName() if (qddOldFile.setContent(&file)) { QDomElement docOldElem = qddOldFile.elementsByTagName("RsCollection").at(0).toElement(); collFile.recursCollectColFileInfos(docOldElem,_newColFileInfos,QString(),false); - }//(qddOldFile.setContent(&file)) + } } else if (mb.clickedButton()==btnCancel) { return; @@ -636,7 +636,7 @@ void RsCollectionDialog::changeFileName() //create a new empty file to check if name if good. if (!file.open(QFile::WriteOnly)) return; file.remove(); - }//if(file.exists()) + } _fileName = fileName; @@ -686,7 +686,7 @@ void RsCollectionDialog::addRecursive(bool recursive) } else { continue; } - }//if (fileInfo.isDir()) + } if (fileInfo.isFile()){ fileToHash.append(fileInfo.absoluteFilePath()); ++count; @@ -694,9 +694,9 @@ void RsCollectionDialog::addRecursive(bool recursive) _listOfFilesAddedInDir.insert(fileInfo.absoluteFilePath(),fileInfo.absolutePath()); else _listOfFilesAddedInDir.insert(fileInfo.absoluteFilePath(),""); - }//if (fileInfo.isFile()) - }//if (index.column()==0) - }//foreach (QModelIndex index, milSelectionList) + } + } + } // Process Dirs QTreeWidgetItem *item = NULL; @@ -705,8 +705,8 @@ void RsCollectionDialog::addRecursive(bool recursive) if (item) { while (item->data(COLUMN_HASH, ROLE_TYPE).toUInt() != DIR_TYPE_DIR) { item = item->parent();//Only Dir as Parent - }//while - }//if (item) + } + } int index = 0; while (index < dirToAdd.count()) @@ -722,7 +722,7 @@ void RsCollectionDialog::addRecursive(bool recursive) //QMap is ordered, so we get parent before child //Iterator is moved inside this function processItem(dirToAdd, index, root); - }//while (index < dirToAdd.count()) + } //Update liste before attach files to be sure when file is hashed, parent directory exists. updateList(); @@ -736,9 +736,9 @@ void RsCollectionDialog::addRecursive(bool recursive) } else if(item) { if (item->data(COLUMN_HASH, ROLE_NAME) != "") { it.value() = item->text(COLUMN_FILEPATH); - }//if (item->data(COLUMN_HASH, ROLE_NAME) != "") - }//if (dirToAdd.contains(path)) - }//for (QHash::Iterator it + } + } + } // Process Files once all done ui._hashBox->addAttachments(fileToHash,RS_FILE_REQ_ANONYMOUS_ROUTING /*, 0*/); @@ -781,13 +781,13 @@ bool RsCollectionDialog::addAllChild(QFileInfo &fileInfoParent default: // should never be reached break; - }//switch (ret) + } } if (fileInfo.isDir()) { dirToAdd.insert(fileInfo.absoluteFilePath(),fileInfo.absolutePath()); ++count; if (!addAllChild(fileInfo, dirToAdd, fileToHash, count)) return false; - }//if (fileInfo.isDir()) + } if (fileInfo.isFile()){ fileToHash.append(fileInfo.absoluteFilePath()); ++count; @@ -795,8 +795,8 @@ bool RsCollectionDialog::addAllChild(QFileInfo &fileInfoParent _listOfFilesAddedInDir.insert(fileInfo.absoluteFilePath(),fileInfo.absolutePath()); else _listOfFilesAddedInDir.insert(fileInfo.absoluteFilePath(),""); - }//if (fileInfo.isFile()) - }//foreach (QFileInfo fileInfo, dirParent.entryInfoList()) + } + } return true; } @@ -821,10 +821,10 @@ void RsCollectionDialog::remove() item->setSelected(false); } else { listDir += item->data(COLUMN_HASH, ROLE_NAME).toString() +"
"; - }//if (listDir.contains(item->data(COLUMN_HASH, ROLE_PATH).toString())) - }//if (item->data(COLUMN_HASH, ROLE_TYPE).toUInt() == DIR_TYPE_DIR) - }//if (item != getRootItem()) - }//for (int curs = 0; curs < count; ++curs) + } + } + } + } //If directories, ask to remove them or not if (!listDir.isEmpty()){ @@ -870,14 +870,14 @@ void RsCollectionDialog::remove() case QMessageBox::Cancel: { delete msgBox; return; - }//case QMessageBox::Cancel: + } break; default: // should never be reached break; - }//switch (ret) + } delete msgBox; - }//if (!listDir.isEmpty()) + } //Remove wanted items int leftItem = 0; @@ -966,7 +966,7 @@ void RsCollectionDialog::processItem(QMap &dirToAdd } else { _newColFileInfos.push_back(newChild); } - }//(index < count) + } } /** @@ -1006,13 +1006,13 @@ void RsCollectionDialog::makeDir() default: // should never be reached break; - }//switch (ret) - }//if (badChar) + } + } } else {//if (ok && !childName.isEmpty()) return; - }//if (ok && !childName.isEmpty()) + } - }//while (!nameOK) + } // Process all selected items int count = ui._fileEntriesTW->selectedItems().count(); @@ -1040,8 +1040,8 @@ void RsCollectionDialog::makeDir() if (item == getRootItem()) newChild.path = ""; _newColFileInfos.push_back(newChild); - }//if (item) - }//for (; curs < count; ++curs) + } + } updateList(); @@ -1074,7 +1074,7 @@ void RsCollectionDialog::fileHashingFinished(QList hashedFiles) //File Added in directory, find its parent colFileInfo.path = _listOfFilesAddedInDir.value(hashedFile.filepath,""); _listOfFilesAddedInDir.remove(hashedFile.filepath); - }//if (_listOfFilesAddedInDir.value(hashedFile.filepath,"")!="") + } _newColFileInfos.push_back(colFileInfo); @@ -1112,7 +1112,7 @@ void RsCollectionDialog::itemChanged(QTreeWidgetItem *item, int col) itemParent->setText(COLUMN_FILEC, QString("%1").arg(parentFileCount)); itemParent = itemParent->parent(); - }//while (itemParent) + } updateSizes() ; @@ -1258,8 +1258,8 @@ void RsCollectionDialog::download() std::list()); } else {//if (item->checkState(COLUMN_FILE) == Qt::Checked) std::cerr<<"Skipping file : " << item->data(COLUMN_HASH,ROLE_NAME).toString().toStdString() << std::endl; - }//if (item->checkState(COLUMN_FILE) == Qt::Checked) - }//while ((item = *itemIterator) != NULL) + } + } close(); } From b6f102cabbec3b6956844672dd87147ac6c69662 Mon Sep 17 00:00:00 2001 From: Gioacchino Mazzurco Date: Sat, 21 Oct 2017 13:00:36 +0200 Subject: [PATCH 28/58] Fix TokenManager.qml JSON API request This was the cause of ChatView.qml not being updated on messages sent or received, the problem was into the TokeManager and manifested only on some hardaware, this fix probably many other Qml App and Qml Notification Service unexpected behaviours due to tokens not being properly updated. --- retroshare-qml-app/src/TokensManager.qml | 29 ++++++++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/retroshare-qml-app/src/TokensManager.qml b/retroshare-qml-app/src/TokensManager.qml index fd2bfe73e..6a7bd498a 100644 --- a/retroshare-qml-app/src/TokensManager.qml +++ b/retroshare-qml-app/src/TokensManager.qml @@ -28,6 +28,13 @@ QtObject property var tokens: ({}) function registerToken(token, callback) { + if(!maybeToken(token)) + { + console.error("TokensManager attempt to register a non int token") + console.trace() + return + } + if (Array.isArray(tokens[token])) { if(QT_DEBUG) @@ -72,6 +79,7 @@ QtObject delete tokens[token] } function isTokenValid(token) { return Array.isArray(tokens[token]) } + function maybeToken(value) { return Number(value) === parseInt(value) } property alias refreshInterval: refreshTokensTimer.interval @@ -81,16 +89,22 @@ QtObject onResponseReceived: { + /* TODO: This is vital enough and if some fails appens can create + * difficult to debug unexpected behaviours in any place of the app. + * We should do some more checking on the data received here + */ var jsonData = JSON.parse(msg).data + // console.log("refreshTokensApi got expired tokens:", msg) var arrayLength = jsonData.length - for (var i = 0; i < arrayLength; i++) - { + for (var i = 0; i < arrayLength; ++i) tokensManager.tokenExpire(jsonData[i]) - } } Component.onCompleted: { + /* Disable debugging only for this instance of LibresapiLocalClient + * as it is particularly noisy and repetitive, and not useful in + * most of the cases */ if(QT_DEBUG) debug = false openConnection(apiSocketPath) @@ -99,8 +113,13 @@ QtObject function refreshTokens() { - request("/statetokenservice/*", - '['+Object.keys(tokensManager.tokens)+']') + var tokensArr = Object.keys(tokensManager.tokens) + + // Filter to avoid "undefined" being sent toghether with tokens + var tokensStr = '['+ tokensArr.filter(maybeToken) +']' + + // console.log("refreshTokensApi checking tokens:", tokensStr) + request("/statetokenservice/*", tokensStr) } } From 6581fa0429e9ba09f3b50c591738c613f9b8bb54 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 21 Oct 2017 15:44:45 +0200 Subject: [PATCH 29/58] code cleaning --- .../src/gui/FileTransfer/TransfersDialog.cpp | 134 ++++-------------- 1 file changed, 29 insertions(+), 105 deletions(-) diff --git a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp index b6c3376a5..d2194ebec 100644 --- a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp @@ -666,8 +666,7 @@ void TransfersDialog::downloadListCustomPopupMenu( QPoint /*point*/ ) //Look only for first column == File List //Get Info for current item - if (rsFiles->FileDetails(fileHash - , RS_FILE_HINTS_DOWNLOAD, info)) { + if (rsFiles->FileDetails(fileHash, RS_FILE_HINTS_DOWNLOAD, info)) { /*const uint32_t FT_STATE_FAILED = 0x0000; *const uint32_t FT_STATE_OKAY = 0x0001; *const uint32_t FT_STATE_WAITING = 0x0002; @@ -677,22 +676,21 @@ void TransfersDialog::downloadListCustomPopupMenu( QPoint /*point*/ ) *const uint32_t FT_STATE_PAUSED = 0x0006; *const uint32_t FT_STATE_CHECKING_HASH = 0x0007; */ - if (info.downloadStatus == FT_STATE_WAITING) { + if (info.downloadStatus == FT_STATE_WAITING) atLeastOne_Waiting = true ; - } - if (info.downloadStatus == FT_STATE_DOWNLOADING) { + + if (info.downloadStatus == FT_STATE_DOWNLOADING) atLeastOne_Downloading=true ; - } + if (info.downloadStatus == FT_STATE_COMPLETE) { atLeastOne_Complete = true ; add_OpenFileOption = single ; } - if (info.downloadStatus == FT_STATE_QUEUED) { + if (info.downloadStatus == FT_STATE_QUEUED) atLeastOne_Queued = true ; - } - if (info.downloadStatus == FT_STATE_PAUSED) { + + if (info.downloadStatus == FT_STATE_PAUSED) atLeastOne_Paused = true ; - } size_t pos = info.fname.find_last_of('.') ; if (pos != std::string::npos) { @@ -748,24 +746,21 @@ void TransfersDialog::downloadListCustomPopupMenu( QPoint /*point*/ ) } } - if (atLeastOne_Paused) { + if (atLeastOne_Paused) contextMnu.addAction(resumeAct) ; - } - if (atLeastOne_Downloading || atLeastOne_Queued || atLeastOne_Waiting) { + + if (atLeastOne_Downloading || atLeastOne_Queued || atLeastOne_Waiting) contextMnu.addAction(pauseAct) ; - } if (!atLeastOne_Complete && !items.empty()) { contextMnu.addAction(forceCheckAct) ; contextMnu.addAction(cancelAct) ; } - if (add_PlayOption) { + if (add_PlayOption) contextMnu.addAction(playAct) ; - } - if (atLeastOne_Paused || atLeastOne_Downloading || atLeastOne_Complete || add_PlayOption) { - contextMnu.addSeparator() ;//------------------------------------------------ - } + if (atLeastOne_Paused || atLeastOne_Downloading || atLeastOne_Complete || add_PlayOption) + contextMnu.addSeparator() ; if (single) { if (add_OpenFileOption) contextMnu.addAction( openFileAct) ; @@ -776,7 +771,7 @@ void TransfersDialog::downloadListCustomPopupMenu( QPoint /*point*/ ) } contextMnu.addAction( clearCompletedAct) ; - contextMnu.addSeparator() ;//------------------------------------------------ + contextMnu.addSeparator() ; if (add_CopyLink) { contextMnu.addAction( copyLinkAct) ; @@ -785,7 +780,7 @@ void TransfersDialog::downloadListCustomPopupMenu( QPoint /*point*/ ) contextMnu.addAction( pasteLinkAct) ; } if (add_CopyLink || add_PasteLink) { - contextMnu.addSeparator() ;//-------------------------------------------- + contextMnu.addSeparator() ; } if (DLLFilterModel->rowCount()>0 ) { @@ -2153,7 +2148,7 @@ void TransfersDialog::collCreate() details.type = DIR_TYPE_FILE; dirVec.push_back(details); - } + }//for (it = items.begin(); RsCollection(dirVec).openNewColl(this); } @@ -2258,89 +2253,18 @@ void TransfersDialog::collOpen() } } -void TransfersDialog::setShowDLSizeColumn(bool show) -{ - if ( (!ui.downloadList->isColumnHidden(COLUMN_SIZE)) != show) { - ui.downloadList->setColumnHidden(COLUMN_SIZE, !show); - } -} - -void TransfersDialog::setShowDLCompleteColumn(bool show) -{ - if ( (!ui.downloadList->isColumnHidden(COLUMN_COMPLETED)) != show) { - ui.downloadList->setColumnHidden(COLUMN_COMPLETED, !show); - } -} - -void TransfersDialog::setShowDLDLSpeedColumn(bool show) -{ - if ( (!ui.downloadList->isColumnHidden(COLUMN_DLSPEED)) != show) { - ui.downloadList->setColumnHidden(COLUMN_DLSPEED, !show); - } -} - -void TransfersDialog::setShowDLProgressColumn(bool show) -{ - if ( (!ui.downloadList->isColumnHidden(COLUMN_PROGRESS)) != show) { - ui.downloadList->setColumnHidden(COLUMN_PROGRESS, !show); - } -} - -void TransfersDialog::setShowDLSourcesColumn(bool show) -{ - if ( (!ui.downloadList->isColumnHidden(COLUMN_SOURCES)) != show) { - ui.downloadList->setColumnHidden(COLUMN_SOURCES, !show); - } -} - -void TransfersDialog::setShowDLStatusColumn(bool show) -{ - if ( (!ui.downloadList->isColumnHidden(COLUMN_STATUS)) != show) { - ui.downloadList->setColumnHidden(COLUMN_STATUS, !show); - } -} - -void TransfersDialog::setShowDLPriorityColumn(bool show) -{ - if ( (!ui.downloadList->isColumnHidden(COLUMN_PRIORITY)) != show) { - ui.downloadList->setColumnHidden(COLUMN_PRIORITY, !show); - } -} - -void TransfersDialog::setShowDLRemainingColumn(bool show) -{ - if ( (!ui.downloadList->isColumnHidden(COLUMN_REMAINING)) != show) { - ui.downloadList->setColumnHidden(COLUMN_REMAINING, !show); - } -} - -void TransfersDialog::setShowDLDownloadTimeColumn(bool show) -{ - if ( (!ui.downloadList->isColumnHidden(COLUMN_DOWNLOADTIME)) != show) { - ui.downloadList->setColumnHidden(COLUMN_DOWNLOADTIME, !show); - } -} - -void TransfersDialog::setShowDLIDColumn(bool show) -{ - if ( (!ui.downloadList->isColumnHidden(COLUMN_ID)) != show) { - ui.downloadList->setColumnHidden(COLUMN_ID, !show); - } -} - -void TransfersDialog::setShowDLLastDLColumn(bool show) -{ - if ( (!ui.downloadList->isColumnHidden(COLUMN_LASTDL)) != show) { - ui.downloadList->setColumnHidden(COLUMN_LASTDL, !show); - } -} - -void TransfersDialog::setShowDLPath(bool show) -{ - if ( (!ui.downloadList->isColumnHidden(COLUMN_PATH)) != show) { - ui.downloadList->setColumnHidden(COLUMN_PATH, !show); - } -} +void TransfersDialog::setShowDLSizeColumn (bool show) { ui.downloadList->setColumnHidden(COLUMN_SIZE, !show); } +void TransfersDialog::setShowDLCompleteColumn (bool show) { ui.downloadList->setColumnHidden(COLUMN_COMPLETED, !show); } +void TransfersDialog::setShowDLDLSpeedColumn (bool show) { ui.downloadList->setColumnHidden(COLUMN_DLSPEED, !show); } +void TransfersDialog::setShowDLProgressColumn (bool show) { ui.downloadList->setColumnHidden(COLUMN_PROGRESS, !show); } +void TransfersDialog::setShowDLSourcesColumn (bool show) { ui.downloadList->setColumnHidden(COLUMN_SOURCES, !show); } +void TransfersDialog::setShowDLStatusColumn (bool show) { ui.downloadList->setColumnHidden(COLUMN_STATUS, !show); } +void TransfersDialog::setShowDLPriorityColumn (bool show) { ui.downloadList->setColumnHidden(COLUMN_PRIORITY, !show); } +void TransfersDialog::setShowDLRemainingColumn (bool show) { ui.downloadList->setColumnHidden(COLUMN_REMAINING, !show); } +void TransfersDialog::setShowDLDownloadTimeColumn(bool show) { ui.downloadList->setColumnHidden(COLUMN_DOWNLOADTIME, !show); } +void TransfersDialog::setShowDLIDColumn (bool show) { ui.downloadList->setColumnHidden(COLUMN_ID, !show); } +void TransfersDialog::setShowDLLastDLColumn (bool show) { ui.downloadList->setColumnHidden(COLUMN_LASTDL, !show); } +void TransfersDialog::setShowDLPath (bool show) { ui.downloadList->setColumnHidden(COLUMN_PATH, !show); } void TransfersDialog::expandAllDL() { From fe516c6b7a2563efdb0aae5f3f812f35dcc8356f Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 21 Oct 2017 16:16:23 +0200 Subject: [PATCH 30/58] fixed pasting of FileTree links in download queue --- .../src/gui/FileTransfer/SharedFilesDialog.cpp | 10 ++++++---- .../src/gui/FileTransfer/TransfersDialog.cpp | 4 +++- retroshare-gui/src/gui/RetroShareLink.cpp | 18 +++++++++--------- retroshare-gui/src/gui/RetroShareLink.h | 2 +- retroshare-gui/src/util/HandleRichText.cpp | 4 ++-- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp index f071c3a66..b5d82ad4f 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp @@ -517,7 +517,7 @@ void RemoteSharedFilesDialog::spawnCustomPopupMenu( QPoint point ) contextMnu.addAction( copylinkAct) ; contextMnu.addAction( sendlinkAct) ; contextMnu.addSeparator() ;//------------------------------------ - contextMnu.addAction(QIcon(IMAGE_MSG), tr("Recommend in a message to"), this, SLOT(recommendFilesToMsg())) ; + contextMnu.addAction(QIcon(IMAGE_MSG), tr("Recommend in a message to..."), this, SLOT(recommendFilesToMsg())) ; } contextMnu.addSeparator() ;//------------------------------------ @@ -578,7 +578,9 @@ void SharedFilesDialog::copyLink (const QModelIndexList& lst, bool remote) std::cerr << "Created collection file tree:" << std::endl; ft->print(); - RetroShareLink link = RetroShareLink::createCollection(QString::fromUtf8(details.name.c_str()),ft->mTotalSize,ft->mTotalFiles,QString::fromStdString(ft->toRadix64())) ; + QString dir_name = QDir(QString::fromUtf8(details.name.c_str())).dirName(); + + RetroShareLink link = RetroShareLink::createCollection(dir_name,ft->mTotalSize,ft->mTotalFiles,QString::fromStdString(ft->toRadix64())) ; if(link.valid()) urls.push_back(link) ; @@ -1027,12 +1029,12 @@ void LocalSharedFilesDialog::spawnCustomPopupMenu( QPoint point ) contextMnu.addSeparator() ;//------------------------------------ contextMnu.addMenu(&collectionMenu) ; contextMnu.addSeparator() ;//------------------------------------ - contextMnu.addAction(QIcon(IMAGE_MSG), tr("Recommend in a message to"), this, SLOT(recommendFilesToMsg())) ; + contextMnu.addAction(QIcon(IMAGE_MSG), tr("Recommend in a message to..."), this, SLOT(recommendFilesToMsg())) ; break ; default : return ; - }//switch (type) + } contextMnu.exec(QCursor::pos()) ; } diff --git a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp index d2194ebec..ca4cf5cfa 100644 --- a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp @@ -652,7 +652,8 @@ void TransfersDialog::downloadListCustomPopupMenu( QPoint /*point*/ ) QMenu contextMnu( this ); - if(!RSLinkClipboard::empty(RetroShareLink::TYPE_FILE)) add_PasteLink=true; + if(!RSLinkClipboard::empty(RetroShareLink::TYPE_FILE)) add_PasteLink=true; + if(!RSLinkClipboard::empty(RetroShareLink::TYPE_FILE_TREE)) add_PasteLink=true; if(!items.empty()) { @@ -1640,6 +1641,7 @@ void TransfersDialog::updateDetailsDialog() void TransfersDialog::pasteLink() { RSLinkClipboard::process(RetroShareLink::TYPE_FILE); + RSLinkClipboard::process(RetroShareLink::TYPE_FILE_TREE); } void TransfersDialog::getDLSelectedItems(std::set *ids, std::set *rows) diff --git a/retroshare-gui/src/gui/RetroShareLink.cpp b/retroshare-gui/src/gui/RetroShareLink.cpp index 7a1e32aae..769a6321f 100644 --- a/retroshare-gui/src/gui/RetroShareLink.cpp +++ b/retroshare-gui/src/gui/RetroShareLink.cpp @@ -336,7 +336,7 @@ void RetroShareLink::fromUrl(const QUrl& url) if (url.host() == HOST_COLLECTION) { bool ok; - _type = TYPE_COLLECTION; + _type = TYPE_FILE_TREE; _radix = decodedQueryItemValue(urlQuery, COLLECTION_DATA); _name = decodedQueryItemValue(urlQuery, COLLECTION_NAME); _size = urlQuery.queryItemValue(COLLECTION_SIZE).toULongLong(&ok); @@ -429,7 +429,7 @@ RetroShareLink RetroShareLink::createCollection(const QString& name, uint64_t si link._count = count; link._size = size; link._radix = radix_data ; - link._type = TYPE_COLLECTION; + link._type = TYPE_FILE_TREE; link.check(); @@ -643,7 +643,7 @@ void RetroShareLink::check() if(!checkSSLId(_SSLid)) _valid = false; // no break! We also test file stuff below. /* fallthrough */ - case TYPE_COLLECTION: + case TYPE_FILE_TREE: case TYPE_FILE: if(_size > (((uint64_t)1)<<40)) // 1TB. Who has such large files? @@ -754,7 +754,7 @@ QString RetroShareLink::title() const rsPeers->getGPGDetails(RsPgpId(_GPGid.toStdString()), detail) ; return QObject::tr("Click to send a private message to %1 (%2).").arg(QString::fromUtf8(detail.name.c_str())).arg(_GPGid) ; } - case TYPE_COLLECTION: + case TYPE_FILE_TREE: return QObject::tr("Click to browse/download this file collection"); case TYPE_EXTRAFILE: return QObject::tr("%1 (%2, Extra - Source included)").arg(hash()).arg(misc::friendlyUnit(size())); @@ -899,7 +899,7 @@ QString RetroShareLink::toString() const break; - case TYPE_COLLECTION: + case TYPE_FILE_TREE: url.setScheme(RSLINK_SCHEME); url.setHost(HOST_COLLECTION) ; urlQuery.addQueryItem(COLLECTION_NAME, encodeItem(_name)); @@ -930,13 +930,13 @@ QString RetroShareLink::niceName() const if (type() == TYPE_PERSON) return PeerDefs::rsid(name().toUtf8().constData(), RsPgpId(hash().toStdString())); - if(type() == TYPE_COLLECTION) + if(type() == TYPE_FILE_TREE) return QObject::tr("%1 (%2 files, %3)").arg(_name).arg(_count).arg(misc::friendlyUnit(_size)); if(type() == TYPE_IDENTITY) return QObject::tr("Identity link (name=%1, ID=%2)").arg(_name).arg(_hash) ; - if(type() == TYPE_COLLECTION) + if(type() == TYPE_FILE_TREE) return QObject::tr("File directory (Total %s) Click to browse/download this file collection").arg(misc::friendlyUnit(_size)); if(type() == TYPE_PUBLIC_MSG) { @@ -1149,7 +1149,7 @@ static void processList(const QStringList &list, const QString &textSingular, co case TYPE_SEARCH: case TYPE_MESSAGE: case TYPE_IDENTITY: - case TYPE_COLLECTION: + case TYPE_FILE_TREE: case TYPE_CERTIFICATE: case TYPE_PUBLIC_MSG: case TYPE_PRIVATE_CHAT: @@ -1391,7 +1391,7 @@ static void processList(const QStringList &list, const QString &textSingular, co } break; - case TYPE_COLLECTION: + case TYPE_FILE_TREE: { FileTree *ft = FileTree::create(link.radix().toStdString()) ; diff --git a/retroshare-gui/src/gui/RetroShareLink.h b/retroshare-gui/src/gui/RetroShareLink.h index 2576b880c..11b25b419 100644 --- a/retroshare-gui/src/gui/RetroShareLink.h +++ b/retroshare-gui/src/gui/RetroShareLink.h @@ -70,7 +70,7 @@ class RetroShareLink TYPE_PUBLIC_MSG = 0x0a, TYPE_POSTED = 0x0b, TYPE_IDENTITY = 0x0c, - TYPE_COLLECTION = 0x0d + TYPE_FILE_TREE = 0x0d }; public: diff --git a/retroshare-gui/src/util/HandleRichText.cpp b/retroshare-gui/src/util/HandleRichText.cpp index 91f3e13ab..743a2fcc1 100644 --- a/retroshare-gui/src/util/HandleRichText.cpp +++ b/retroshare-gui/src/util/HandleRichText.cpp @@ -227,7 +227,7 @@ bool RsHtml::canReplaceAnchor(QDomDocument &/*doc*/, QDomElement &/*element*/, c switch (link.type()) { case RetroShareLink::TYPE_UNKNOWN: case RetroShareLink::TYPE_FILE: - case RetroShareLink::TYPE_COLLECTION: + case RetroShareLink::TYPE_FILE_TREE: case RetroShareLink::TYPE_PERSON: case RetroShareLink::TYPE_FORUM: case RetroShareLink::TYPE_CHANNEL: @@ -258,7 +258,7 @@ void RsHtml::anchorStylesheetForImg(QDomDocument &/*doc*/, QDomElement &/*elemen switch (link.type()) { case RetroShareLink::TYPE_UNKNOWN: case RetroShareLink::TYPE_FILE: - case RetroShareLink::TYPE_COLLECTION: + case RetroShareLink::TYPE_FILE_TREE: case RetroShareLink::TYPE_PERSON: case RetroShareLink::TYPE_FORUM: case RetroShareLink::TYPE_CHANNEL: From 2cfa86620cf778e76c32f2da8cd536fa96a64311 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 21 Oct 2017 17:35:06 +0200 Subject: [PATCH 31/58] merge of trees and single files before paste in DL queue so that all use the CollectionEditor --- .../src/gui/FileTransfer/TransfersDialog.cpp | 23 +++++++++++++-- retroshare-gui/src/gui/RetroShareLink.cpp | 28 +++++++----------- retroshare-gui/src/gui/RetroShareLink.h | 6 ++-- .../src/gui/common/RsCollection.cpp | 29 +++++++++++++------ retroshare-gui/src/gui/common/RsCollection.h | 6 ++-- 5 files changed, 58 insertions(+), 34 deletions(-) diff --git a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp index ca4cf5cfa..b9e961457 100644 --- a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp @@ -1640,8 +1640,27 @@ void TransfersDialog::updateDetailsDialog() void TransfersDialog::pasteLink() { - RSLinkClipboard::process(RetroShareLink::TYPE_FILE); - RSLinkClipboard::process(RetroShareLink::TYPE_FILE_TREE); + QList links ; + + // We want to capture and process all links at once here, because we're possibly pasting a large collection of files. So we first + // merge all links into a single RsCollection and then process it. + + RsCollection col ; + RSLinkClipboard::pasteLinks(links,RetroShareLink::TYPE_FILE_TREE); + + for(QList::const_iterator it(links.begin());it!=links.end();++it) + { + FileTree *ft = FileTree::create((*it).radix().toStdString()) ; + + col.merge_in(*ft) ; + } + links.clear(); + RSLinkClipboard::pasteLinks(links,RetroShareLink::TYPE_FILE); + + for(QList::const_iterator it(links.begin());it!=links.end();++it) + col.merge_in((*it).name(),(*it).size(),RsFileHash((*it).hash().toStdString())) ; + + col.downloadFiles(); } void TransfersDialog::getDLSelectedItems(std::set *ids, std::set *rows) diff --git a/retroshare-gui/src/gui/RetroShareLink.cpp b/retroshare-gui/src/gui/RetroShareLink.cpp index 769a6321f..a42d9c104 100644 --- a/retroshare-gui/src/gui/RetroShareLink.cpp +++ b/retroshare-gui/src/gui/RetroShareLink.cpp @@ -1716,17 +1716,17 @@ void RSLinkClipboard::copyLinks(const QList& links) QApplication::clipboard()->setText(res) ; } -void RSLinkClipboard::pasteLinks(QList &links) +void RSLinkClipboard::pasteLinks(QList &links,RetroShareLink::enumType type) { - return parseClipboard(links); + return parseClipboard(links,type); } -void RSLinkClipboard::parseClipboard(QList &links) +void RSLinkClipboard::parseClipboard(QList &links,RetroShareLink::enumType type) { // parse clipboard for links. // QString text = QApplication::clipboard()->text() ; - parseText(text, links); + parseText(text, links,type); } QString RSLinkClipboard::toString() @@ -1771,26 +1771,18 @@ bool RSLinkClipboard::empty(RetroShareLink::enumType type /* = RetroShareLink::T return true; } -/*static*/ int RSLinkClipboard::process(RetroShareLink::enumType type /* = RetroShareLink::TYPE_UNKNOWN*/, uint flag /* = RSLINK_PROCESS_NOTIFY_ALL*/) +int RSLinkClipboard::process(RetroShareLink::enumType type /* = RetroShareLink::TYPE_UNKNOWN*/, uint flag /* = RSLINK_PROCESS_NOTIFY_ALL*/) { QList links; - pasteLinks(links); + pasteLinks(links,type); - QList linksToProcess; - for (int i = 0; i < links.size(); ++i) { - if (links[i].valid() && (type == RetroShareLink::TYPE_UNKNOWN || links[i].type() == type)) { - linksToProcess.append(links[i]); - } - } - - if (linksToProcess.isEmpty()) { + if (links.isEmpty()) return 0; - } - return RetroShareLink::process(linksToProcess, flag); + return RetroShareLink::process(links, flag); } -void RSLinkClipboard::parseText(QString text, QList &links) +void RSLinkClipboard::parseText(QString text, QList &links,RetroShareLink::enumType type ) { links.clear(); @@ -1805,7 +1797,7 @@ void RSLinkClipboard::parseText(QString text, QList &links) QString url(text.mid(pos, rx.matchedLength())); RetroShareLink link(url); - if(link.valid()) + if(link.valid() && (type == RetroShareLink::TYPE_UNKNOWN || type == link.type())) { // check that the link is not already in the list: bool already = false ; diff --git a/retroshare-gui/src/gui/RetroShareLink.h b/retroshare-gui/src/gui/RetroShareLink.h index 11b25b419..43ca67ab0 100644 --- a/retroshare-gui/src/gui/RetroShareLink.h +++ b/retroshare-gui/src/gui/RetroShareLink.h @@ -192,7 +192,7 @@ class RSLinkClipboard // Get the liste of pasted links, either from the internal RS links, or by default // from the clipboard. // - static void pasteLinks(QList &links) ; + static void pasteLinks(QList &links,RetroShareLink::enumType type = RetroShareLink::TYPE_UNKNOWN) ; // Produces a list of links with no html structure. static QString toString() ; @@ -215,10 +215,10 @@ class RSLinkClipboard // static int process(RetroShareLink::enumType type = RetroShareLink::TYPE_UNKNOWN, uint flag = RSLINK_PROCESS_NOTIFY_ALL); - static void parseText(QString text, QList &links) ; + static void parseText(QString text, QList &links, RetroShareLink::enumType type = RetroShareLink::TYPE_UNKNOWN) ; private: - static void parseClipboard(QList &links) ; + static void parseClipboard(QList &links, RetroShareLink::enumType type = RetroShareLink::TYPE_UNKNOWN) ; }; #endif diff --git a/retroshare-gui/src/gui/common/RsCollection.cpp b/retroshare-gui/src/gui/common/RsCollection.cpp index a7ba9637a..a42d34340 100644 --- a/retroshare-gui/src/gui/common/RsCollection.cpp +++ b/retroshare-gui/src/gui/common/RsCollection.cpp @@ -41,25 +41,21 @@ const QString RsCollection::ExtensionString = QString("rscollection") ; RsCollection::RsCollection(QObject *parent) : QObject(parent), _xml_doc("RsCollection") { + _root = _xml_doc.createElement("RsCollection"); + _xml_doc.appendChild(_root); } RsCollection::RsCollection(const FileTree& fr) : _xml_doc("RsCollection") { - QDomElement root = _xml_doc.createElement("RsCollection"); - _xml_doc.appendChild(root); - - recursAddElements(_xml_doc,fr,0,root) ; + recursAddElements(_xml_doc,fr,0,_root) ; } RsCollection::RsCollection(const std::vector& file_infos, QObject *parent) : QObject(parent), _xml_doc("RsCollection") { - QDomElement root = _xml_doc.createElement("RsCollection"); - _xml_doc.appendChild(root); - for(uint32_t i = 0;i& colFileInfos,const QString& current_path, bool bad_chars_in_parent) const { QDomNode n = e.firstChild() ; @@ -235,7 +246,7 @@ void RsCollection::recursAddElements(QDomDocument& doc,const FileTree& ft,uint32 f.setAttribute(QString("sha1"),QString::fromStdString(subfiles[i].hash.toStdString())) ; f.setAttribute(QString("size"),QString::number(subfiles[i].size)) ; - e.appendChild(f) ; + d.appendChild(f) ; } } diff --git a/retroshare-gui/src/gui/common/RsCollection.h b/retroshare-gui/src/gui/common/RsCollection.h index f42b81db0..0a6e1e65f 100644 --- a/retroshare-gui/src/gui/common/RsCollection.h +++ b/retroshare-gui/src/gui/common/RsCollection.h @@ -68,10 +68,11 @@ public: RsCollection(const FileTree& fr); virtual ~RsCollection() ; + void merge_in(const QString& fname,uint64_t size,const RsFileHash& hash) ; + void merge_in(const FileTree& tree) ; + static const QString ExtensionString ; - - // Loads file from disk. bool load(QWidget *parent); bool load(const QString& fileName, bool showError = true); @@ -108,6 +109,7 @@ private: QDomDocument _xml_doc ; QString _fileName ; bool _saved; + QDomElement _root ; friend class RsCollectionDialog ; }; From cbcf402e0bded6413f6419a1f4b0ea7259bc908f Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 21 Oct 2017 17:42:17 +0200 Subject: [PATCH 32/58] setup proper title in RsCollectionEditor when in download mode --- retroshare-gui/src/gui/common/RsCollection.cpp | 2 -- retroshare-gui/src/gui/common/RsCollectionDialog.cpp | 6 +++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/retroshare-gui/src/gui/common/RsCollection.cpp b/retroshare-gui/src/gui/common/RsCollection.cpp index a42d34340..8fdbd4e0f 100644 --- a/retroshare-gui/src/gui/common/RsCollection.cpp +++ b/retroshare-gui/src/gui/common/RsCollection.cpp @@ -214,9 +214,7 @@ void RsCollection::recursAddElements(QDomDocument& doc,const ColFileInfo& colFil d.setAttribute(QString("name"),colFileInfo.name) ; for (std::vector::const_iterator it = colFileInfo.children.begin(); it != colFileInfo.children.end(); ++it) - { recursAddElements(doc,(*it),d) ; - } e.appendChild(d) ; } diff --git a/retroshare-gui/src/gui/common/RsCollectionDialog.cpp b/retroshare-gui/src/gui/common/RsCollectionDialog.cpp index 68c2a70b7..b73191fec 100644 --- a/retroshare-gui/src/gui/common/RsCollectionDialog.cpp +++ b/retroshare-gui/src/gui/common/RsCollectionDialog.cpp @@ -138,7 +138,11 @@ RsCollectionDialog::RsCollectionDialog(const QString& collectionFileName ui.headerFrame->setHeaderImage(QPixmap(":/images/library64.png")); - ui.headerFrame->setHeaderText(tr("Collection Editor")); + + if(creation) + ui.headerFrame->setHeaderText(tr("Collection Editor")); + else + ui.headerFrame->setHeaderText(tr("Download files")); // 1 - add all elements to the list. From edffbc3670b61a3f8bd239105824d475f9c5b92d Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 21 Oct 2017 18:09:26 +0200 Subject: [PATCH 33/58] fixed bug in removing top dirs when creating file hierarhies --- libretroshare/src/file_sharing/file_tree.cc | 15 ++++++++++----- libretroshare/src/file_sharing/file_tree.h | 2 +- libretroshare/src/retroshare/rsfiles.h | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/libretroshare/src/file_sharing/file_tree.cc b/libretroshare/src/file_sharing/file_tree.cc index 8a1f11fc5..92ee6a362 100644 --- a/libretroshare/src/file_sharing/file_tree.cc +++ b/libretroshare/src/file_sharing/file_tree.cc @@ -1,5 +1,6 @@ #include #include +#include #include "file_sharing_defaults.h" #include "filelist_io.h" @@ -30,12 +31,16 @@ FileTree *FileTree::create(const std::string& radix64_string) return ft ; } -void FileTreeImpl::recurs_buildFileTree(FileTreeImpl& ft,uint32_t index,const DirDetails& dd,bool remote) +void FileTreeImpl::recurs_buildFileTree(FileTreeImpl& ft,uint32_t index,const DirDetails& dd,bool remote,bool remove_top_dirs) { if(ft.mDirs.size() <= index) ft.mDirs.resize(index+1) ; - ft.mDirs[index].name = dd.name ; + if(remove_top_dirs) + ft.mDirs[index].name = RsDirUtil::getTopDir(dd.name) ; + else + ft.mDirs[index].name = dd.name ; + ft.mDirs[index].subfiles.clear(); ft.mDirs[index].subdirs.clear(); @@ -62,7 +67,7 @@ void FileTreeImpl::recurs_buildFileTree(FileTreeImpl& ft,uint32_t index,const Di else if(dd.children[i].type == DIR_TYPE_DIR) { ft.mDirs[index].subdirs.push_back(ft.mDirs.size()); - recurs_buildFileTree(ft,ft.mDirs.size(),dd2,remote) ; + recurs_buildFileTree(ft,ft.mDirs.size(),dd2,remote,remove_top_dirs) ; } else std::cerr << "(EE) Unsupported DirDetails type." << std::endl; @@ -86,11 +91,11 @@ bool FileTreeImpl::getDirectoryContent(uint32_t index,std::string& name,std::vec return true ; } -FileTree *FileTree::create(const DirDetails& dd, bool remote) +FileTree *FileTree::create(const DirDetails& dd, bool remote,bool remove_top_dirs) { FileTreeImpl *ft = new FileTreeImpl ; - FileTreeImpl::recurs_buildFileTree(*ft,0,dd,remote) ; + FileTreeImpl::recurs_buildFileTree(*ft,0,dd,remote,remove_top_dirs) ; return ft ; } diff --git a/libretroshare/src/file_sharing/file_tree.h b/libretroshare/src/file_sharing/file_tree.h index 5f94bdf48..8aaa9dff6 100644 --- a/libretroshare/src/file_sharing/file_tree.h +++ b/libretroshare/src/file_sharing/file_tree.h @@ -19,7 +19,7 @@ public: protected: void recurs_print(uint32_t index,const std::string& indent) const; - static void recurs_buildFileTree(FileTreeImpl& ft,uint32_t index,const DirDetails& dd,bool remote); + static void recurs_buildFileTree(FileTreeImpl& ft, uint32_t index, const DirDetails& dd, bool remote, bool remove_top_dirs); struct DirData { std::string name; diff --git a/libretroshare/src/retroshare/rsfiles.h b/libretroshare/src/retroshare/rsfiles.h index 64af23885..d7efb2937 100644 --- a/libretroshare/src/retroshare/rsfiles.h +++ b/libretroshare/src/retroshare/rsfiles.h @@ -144,7 +144,7 @@ class FileTree public: virtual ~FileTree() {} - static FileTree *create(const DirDetails& dd, bool remote) ; + static FileTree *create(const DirDetails& dd, bool remote, bool remove_top_dirs = true) ; static FileTree *create(const std::string& radix64_string) ; virtual std::string toRadix64() const =0 ; From 770add8b8ac5a0eb192d72a934bf77c013838d18 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 21 Oct 2017 21:23:40 +0200 Subject: [PATCH 34/58] added code to share a file/dir on channel --- .../gui/FileTransfer/SharedFilesDialog.cpp | 133 ++++++++++-------- .../src/gui/FileTransfer/SharedFilesDialog.h | 7 +- .../src/gui/gxs/GxsGroupFrameDialog.cpp | 9 ++ .../src/gui/gxs/GxsGroupFrameDialog.h | 4 + .../src/gui/gxschannels/GxsChannelDialog.cpp | 5 + .../src/gui/gxschannels/GxsChannelDialog.h | 2 + 6 files changed, 98 insertions(+), 62 deletions(-) diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp index b5d82ad4f..afba50f7b 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.cpp @@ -33,6 +33,7 @@ #include "SharedFilesDialog.h" #include "gui/notifyqt.h" +#include "gui/MainWindow.h" #include "gui/RemoteDirModel.h" #include "gui/RetroShareLink.h" #include "gui/ShareManager.h" @@ -40,6 +41,7 @@ #include "gui/common/RsCollection.h" #include "gui/msgs/MessageComposer.h" #include "gui/settings/AddFileAssociationDialog.h" +#include "gui/gxschannels/GxsChannelDialog.h" #include "gui/settings/rsharesettings.h" #include "util/QtVersion.h" #include "util/RsAction.h" @@ -61,6 +63,7 @@ #define IMAGE_OPENFOLDER ":/images/folderopen.png" #define IMAGE_OPENFILE ":/images/fileopen.png" #define IMAGE_LIBRARY ":/images/library.png" +#define IMAGE_CHANNEL ":/images/channels32.png" #define IMAGE_COLLCREATE ":/images/library_add.png" #define IMAGE_COLLMODIF ":/images/library_edit.png" #define IMAGE_COLLVIEW ":/images/library_view.png" @@ -154,9 +157,6 @@ SharedFilesDialog::SharedFilesDialog(RetroshareDirModel *_tree_model,RetroshareD connect(notify, SIGNAL(filesPreModChanged(bool)), this, SLOT(preModDirectories(bool))); connect(notify, SIGNAL(filesPostModChanged(bool)), this, SLOT(postModDirectories(bool))); -//== connect(ui.localButton, SIGNAL(toggled(bool)), this, SLOT(showFrame(bool))); -//== connect(ui.remoteButton, SIGNAL(toggled(bool)), this, SLOT(showFrameRemote(bool))); -//== connect(ui.splittedButton, SIGNAL(toggled(bool)), this, SLOT(showFrameSplitted(bool))); connect(ui.viewType_CB, SIGNAL(currentIndexChanged(int)), this, SLOT(changeCurrentViewModel(int))); connect( ui.dirTreeView, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( spawnCustomPopupMenu( QPoint ) ) ); @@ -511,14 +511,12 @@ void RemoteSharedFilesDialog::spawnCustomPopupMenu( QPoint point ) connect( downloadAct , SIGNAL( triggered() ), this, SLOT( downloadRemoteSelected() ) ) ; contextMnu.addAction( downloadAct) ; - //if ( type == DIR_TYPE_FILE ) - { - contextMnu.addSeparator() ;//------------------------------------ - contextMnu.addAction( copylinkAct) ; - contextMnu.addAction( sendlinkAct) ; - contextMnu.addSeparator() ;//------------------------------------ - contextMnu.addAction(QIcon(IMAGE_MSG), tr("Recommend in a message to..."), this, SLOT(recommendFilesToMsg())) ; - } + contextMnu.addSeparator() ;//------------------------------------ + contextMnu.addAction( copylinkAct) ; + contextMnu.addAction( sendlinkAct) ; + contextMnu.addSeparator() ;//------------------------------------ + contextMnu.addAction(QIcon(IMAGE_MSG), tr("Recommend in a message to..."), this, SLOT(recommendFilesToMsg())) ; + contextMnu.addSeparator() ;//------------------------------------ contextMnu.addMenu(&collectionMenu) ; @@ -557,22 +555,20 @@ void RemoteSharedFilesDialog::downloadRemoteSelected() model -> downloadSelected(lst) ; } -void SharedFilesDialog::copyLink (const QModelIndexList& lst, bool remote) +void SharedFilesDialog::copyLinks(const QModelIndexList& lst, bool remote,QList& urls,bool& has_unhashed_files) { - std::vector dirVec; + std::vector dirVec; - model->getDirDetailsFromSelect(lst, dirVec); + model->getDirDetailsFromSelect(lst, dirVec); - QList urls ; + has_unhashed_files = false; - bool has_unhashed_files = false; + for (int i = 0, n = dirVec.size(); i < n; ++i) + { + const DirDetails& details = dirVec[i]; - for (int i = 0, n = dirVec.size(); i < n; ++i) - { - const DirDetails& details = dirVec[i]; - - if (details.type == DIR_TYPE_DIR) - { + if (details.type == DIR_TYPE_DIR) + { FileTree *ft = FileTree::create(details,remote) ; std::cerr << "Created collection file tree:" << std::endl; @@ -586,48 +582,32 @@ void SharedFilesDialog::copyLink (const QModelIndexList& lst, bool remote) urls.push_back(link) ; delete ft ; -#ifdef TO_REMOVE - for(uint32_t j=0;jRequestDirDetails(dirStub.ref, details, flags) || details.type != DIR_TYPE_FILE) - continue; - - if(details.hash.isNull()) - { - has_unhashed_files = true; - continue; - } - - RetroShareLink link = RetroShareLink::createFile(QString::fromUtf8(details.name.c_str()), details.count, details.hash.toStdString().c_str()); - if (link.valid()) { - urls.push_back(link) ; - } - } -#endif - } - else - { - if(details.hash.isNull()) + } + else + { + if(details.hash.isNull()) { has_unhashed_files = true; continue; } - RetroShareLink link = RetroShareLink::createFile(QString::fromUtf8(details.name.c_str()), details.count, details.hash.toStdString().c_str()); - if (link.valid()) { - urls.push_back(link) ; - } - } - } + RetroShareLink link = RetroShareLink::createFile(QString::fromUtf8(details.name.c_str()), details.count, details.hash.toStdString().c_str()); + if (link.valid()) { + urls.push_back(link) ; + } + } + } +} + +void SharedFilesDialog::copyLink (const QModelIndexList& lst, bool remote) +{ + QList urls ; + bool has_unhashed_files = false; + + copyLinks(lst,remote,urls,has_unhashed_files) ; RSLinkClipboard::copyLinks(urls) ; if(has_unhashed_files) - QMessageBox::warning(NULL,tr("Some files have been omitted"),tr("Some files have been omitted because their hash is not available yet.")) ; + QMessageBox::warning(NULL,tr("Some files have been omitted"),tr("Some files have been omitted because they have not been indexed yet.")) ; } void SharedFilesDialog::copyLink() @@ -1036,7 +1016,44 @@ void LocalSharedFilesDialog::spawnCustomPopupMenu( QPoint point ) return ; } - contextMnu.exec(QCursor::pos()) ; + GxsChannelDialog *channelDialog = dynamic_cast(MainWindow::getPage(MainWindow::Channels)); + + if(channelDialog != NULL) + { + QMenu shareChannelMenu(tr("Share on channel...")) ; + shareChannelMenu.setIcon(QIcon(IMAGE_CHANNEL)); + + std::list grp_metas ; + channelDialog->getGroupList(grp_metas) ; + + for(auto it(grp_metas.begin());it!=grp_metas.end();++it) + if(IS_GROUP_PUBLISHER((*it).mSubscribeFlags)) + shareChannelMenu.addAction(QString::fromUtf8((*it).mGroupName.c_str()), this, SLOT(shareOnChannel()))->setData(QString::fromStdString((*it).mGroupId.toStdString())) ; + + contextMnu.addMenu(&shareChannelMenu) ; + contextMnu.exec(QCursor::pos()) ; // added here because the shareChannelMenu QMenu object is deleted afterwards + } + else + contextMnu.exec(QCursor::pos()) ; +} + +void LocalSharedFilesDialog::shareOnChannel() +{ + RsGxsGroupId groupId(qobject_cast(sender())->data().toString().toStdString()); + + GxsChannelDialog *channelDialog = dynamic_cast(MainWindow::getPage(MainWindow::Channels)); + + if(channelDialog == NULL) + return ; + + std::list files_info ; + + QList file_links_list ; + bool has_unhashed_files ; + + copyLinks(getSelected(),false,file_links_list,has_unhashed_files) ; + + channelDialog->shareOnChannel(groupId,file_links_list) ; } //============================================================================ diff --git a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.h b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.h index e7ec1e2b0..885bab91a 100644 --- a/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.h +++ b/retroshare-gui/src/gui/FileTransfer/SharedFilesDialog.h @@ -24,6 +24,7 @@ #include #include "RsAutoUpdatePage.h" +#include "gui/RetroShareLink.h" #include "ui_SharedFilesDialog.h" class RetroshareDirModel; @@ -68,10 +69,6 @@ private slots: void collView(); void collOpen(); -//== void showFrame(bool show); -//== void showFrameRemote(bool show); -//== void showFrameSplitted(bool show); - void recommendFilesToMsg(); void indicatorChanged(int index); @@ -103,6 +100,7 @@ protected: //QMenu* contextMnu2; + void copyLinks(const QModelIndexList& lst, bool remote, QList& urls, bool& has_unhashed_files); void copyLink (const QModelIndexList& lst, bool remote); void FilterItems(); @@ -161,6 +159,7 @@ class LocalSharedFilesDialog : public SharedFilesDialog void runCommandForFile(); void tryToAddNewAssotiation(); void forceCheck(); + void shareOnChannel(); QAction* fileAssotiationAction(const QString fileName); diff --git a/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.cpp b/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.cpp index 998f01a6e..25f6bf2b6 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.cpp +++ b/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.cpp @@ -121,6 +121,13 @@ GxsGroupFrameDialog::~GxsGroupFrameDialog() delete(ui); } +void GxsGroupFrameDialog::getGroupList(std::list& group_list) +{ + group_list = mCachedGroupMetas ; + + if(group_list.empty()) + requestGroupSummary(); +} void GxsGroupFrameDialog::initUi() { registerHelpButton(ui->helpButton, getHelpString(),pageName()) ; @@ -927,6 +934,8 @@ void GxsGroupFrameDialog::loadGroupSummary(const uint32_t &token) RsUserdata *userdata = NULL; loadGroupSummaryToken(token, groupInfo, userdata); + mCachedGroupMetas = groupInfo ; + insertGroupsData(groupInfo, userdata); mStateHelper->setLoading(TOKEN_TYPE_GROUP_SUMMARY, false); diff --git a/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.h b/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.h index 8138cc1e1..2c0dca594 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.h +++ b/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.h @@ -81,6 +81,8 @@ public: virtual QString getHelpString() const =0; + virtual void getGroupList(std::list& groups) ; + protected: virtual void showEvent(QShowEvent *event); virtual void updateDisplay(bool complete); @@ -197,6 +199,8 @@ private: /** Qt Designer generated object */ Ui::GxsGroupFrameDialog *ui; + + std::list mCachedGroupMetas; }; #endif diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.cpp b/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.cpp index 1bd22504e..a3fa824f6 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.cpp +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.cpp @@ -76,6 +76,11 @@ UserNotify *GxsChannelDialog::getUserNotify(QObject *parent) return new GxsChannelUserNotify(rsGxsChannels, parent); } +void GxsChannelDialog::shareOnChannel(const RsGxsGroupId& channel_id,const QList& file_link) +{ + std::cerr << "Sharing file link on channel " << channel_id << ": Not yet implemented!" << std::endl; +} + QString GxsChannelDialog::text(TextType type) { switch (type) { diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.h b/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.h index 9915ec362..e1f3c75d0 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.h +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.h @@ -42,6 +42,8 @@ public: virtual UserNotify *getUserNotify(QObject *parent); + void shareOnChannel(const RsGxsGroupId& channel_id, const QList& file_link) ; + protected: /* GxsGroupFrameDialog */ virtual RetroShareLink::enumType getLinkType() { return RetroShareLink::TYPE_CHANNEL; } From b6aeacbed4ac50c723a395de47498c00d7e42f43 Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 21 Oct 2017 23:48:27 +0200 Subject: [PATCH 35/58] fixed share on channel code --- .../src/gui/gxschannels/CreateGxsChannelMsg.cpp | 5 +++++ .../src/gui/gxschannels/CreateGxsChannelMsg.h | 1 + .../src/gui/gxschannels/GxsChannelDialog.cpp | 12 +++++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.cpp b/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.cpp index f21fd8660..89c1a3a4e 100644 --- a/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.cpp +++ b/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.cpp @@ -411,6 +411,11 @@ void CreateGxsChannelMsg::addExtraFile() } } +void CreateGxsChannelMsg::addHtmlText(const QString& text) +{ + msgEdit->setHtml(text) ; +} + void CreateGxsChannelMsg::addAttachment(const std::string &path) { /* add a SubFileItem to the attachment section */ diff --git a/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.h b/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.h index 4a99ad9aa..5168c6226 100644 --- a/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.h +++ b/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.h @@ -43,6 +43,7 @@ public: /** Default Destructor */ ~CreateGxsChannelMsg(); + void addHtmlText(const QString& text) ; void addAttachment(const std::string &path); void addAttachment(const RsFileHash &hash, const std::string &fname, uint64_t size, bool local, const RsPeerId &srcId,bool assume_file_ready = false); diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.cpp b/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.cpp index a3fa824f6..c011621a8 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.cpp +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.cpp @@ -27,6 +27,7 @@ #include "GxsChannelDialog.h" #include "GxsChannelGroupDialog.h" #include "GxsChannelPostsWidget.h" +#include "CreateGxsChannelMsg.h" #include "GxsChannelUserNotify.h" #include "gui/gxs/GxsGroupShareKey.h" #include "gui/feeds/GxsChannelPostItem.h" @@ -76,9 +77,18 @@ UserNotify *GxsChannelDialog::getUserNotify(QObject *parent) return new GxsChannelUserNotify(rsGxsChannels, parent); } -void GxsChannelDialog::shareOnChannel(const RsGxsGroupId& channel_id,const QList& file_link) +void GxsChannelDialog::shareOnChannel(const RsGxsGroupId& channel_id,const QList& file_links) { std::cerr << "Sharing file link on channel " << channel_id << ": Not yet implemented!" << std::endl; + + CreateGxsChannelMsg *msgDialog = new CreateGxsChannelMsg(channel_id) ; + + QString txt ; + for(QList::const_iterator it(file_links.begin());it!=file_links.end();++it) + txt += (*it).toHtml() + "\n" ; + + msgDialog->addHtmlText(txt); + msgDialog->show(); } QString GxsChannelDialog::text(TextType type) From ef13e03e5a9e19172b2bd7cecd20bdd5075c03f2 Mon Sep 17 00:00:00 2001 From: Phenom Date: Sun, 22 Oct 2017 11:52:00 +0200 Subject: [PATCH 36/58] Fix SecurityIpItem isSame --- retroshare-gui/src/gui/NewsFeed.cpp | 2 +- retroshare-gui/src/gui/feeds/SecurityIpItem.cpp | 4 ++-- retroshare-gui/src/gui/feeds/SecurityIpItem.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/retroshare-gui/src/gui/NewsFeed.cpp b/retroshare-gui/src/gui/NewsFeed.cpp index 5da89940a..93ba2fc13 100644 --- a/retroshare-gui/src/gui/NewsFeed.cpp +++ b/retroshare-gui/src/gui/NewsFeed.cpp @@ -1116,7 +1116,7 @@ static bool addFeedItemIfUniqueCallback(FeedItem *feedItem, void *data) if (findData->mSecurityIpItem) { SecurityIpItem *securityIpItem = dynamic_cast(feedItem); - if (securityIpItem && securityIpItem->isSame(findData->mId1, findData->mId2, findData->mType)) { + if (securityIpItem && securityIpItem->isSame(RsPeerId(findData->mId1), findData->mId2, findData->mId3, findData->mType)) { return true; } return false; diff --git a/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp b/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp index c2cca5d57..be2d2cc19 100644 --- a/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp +++ b/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp @@ -79,9 +79,9 @@ void SecurityIpItem::setup() updateItem(); } -bool SecurityIpItem::isSame(const std::string& ipAddr, const std::string& ipAddrReported, uint32_t type) +bool SecurityIpItem::isSame(const RsPeerId &sslId, const std::string& ipAddr, const std::string& ipAddrReported, uint32_t type) { - if (mType == type && mIpAddr == ipAddr && mIpAddrReported == ipAddrReported) { + if (mType == type && mSslId==sslId && mIpAddr == ipAddr && mIpAddrReported == ipAddrReported) { return true; } diff --git a/retroshare-gui/src/gui/feeds/SecurityIpItem.h b/retroshare-gui/src/gui/feeds/SecurityIpItem.h index 949140c83..93f6a4c26 100644 --- a/retroshare-gui/src/gui/feeds/SecurityIpItem.h +++ b/retroshare-gui/src/gui/feeds/SecurityIpItem.h @@ -44,7 +44,7 @@ public: void updateItemStatic(); - bool isSame(const std::string& ipAddr, const std::string& ipAddrReported, uint32_t type); + bool isSame(const RsPeerId &sslId, const std::string& ipAddr, const std::string& ipAddrReported, uint32_t type); protected: /* FeedItem */ From b48916ca464b38f886d490ac3e7e7d6725397313 Mon Sep 17 00:00:00 2001 From: RetroPooh Date: Sun, 22 Oct 2017 13:49:38 +0300 Subject: [PATCH 37/58] add windows size/pos saving --- retroshare-gui/src/gui/Posted/PostedCreatePostDialog.cpp | 5 ++++- retroshare-gui/src/gui/connect/ConfCertDialog.cpp | 3 ++- retroshare-gui/src/gui/connect/PGPKeyDialog.cpp | 3 ++- retroshare-gui/src/gui/gxs/GxsGroupDialog.cpp | 6 +++++- .../src/gui/gxschannels/CreateGxsChannelMsg.cpp | 3 ++- .../src/gui/gxschannels/CreateGxsChannelMsg.ui | 2 +- retroshare-gui/src/gui/statistics/StatisticsWindow.cpp | 9 ++++++++- retroshare-gui/src/gui/statistics/StatisticsWindow.h | 3 ++- 8 files changed, 26 insertions(+), 8 deletions(-) diff --git a/retroshare-gui/src/gui/Posted/PostedCreatePostDialog.cpp b/retroshare-gui/src/gui/Posted/PostedCreatePostDialog.cpp index 369bb4f3d..6a47ecc77 100644 --- a/retroshare-gui/src/gui/Posted/PostedCreatePostDialog.cpp +++ b/retroshare-gui/src/gui/Posted/PostedCreatePostDialog.cpp @@ -27,6 +27,8 @@ #include "util/TokenQueue.h" +#include "gui/settings/rsharesettings.h" + #include PostedCreatePostDialog::PostedCreatePostDialog(TokenQueue* tokenQ, RsPosted *posted, const RsGxsGroupId& grpId, QWidget *parent): @@ -35,7 +37,7 @@ PostedCreatePostDialog::PostedCreatePostDialog(TokenQueue* tokenQ, RsPosted *pos ui(new Ui::PostedCreatePostDialog) { ui->setupUi(this); - + Settings->loadWidgetInformation(this); connect(ui->submitButton, SIGNAL(clicked()), this, SLOT(createPost())); connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(close())); @@ -50,6 +52,7 @@ PostedCreatePostDialog::PostedCreatePostDialog(TokenQueue* tokenQ, RsPosted *pos PostedCreatePostDialog::~PostedCreatePostDialog() { + Settings->saveWidgetInformation(this); delete ui; } diff --git a/retroshare-gui/src/gui/connect/ConfCertDialog.cpp b/retroshare-gui/src/gui/connect/ConfCertDialog.cpp index e33ad13ec..dd18b4d16 100644 --- a/retroshare-gui/src/gui/connect/ConfCertDialog.cpp +++ b/retroshare-gui/src/gui/connect/ConfCertDialog.cpp @@ -83,7 +83,7 @@ ConfCertDialog::ConfCertDialog(const RsPeerId& id, const RsPgpId &pgp_id, QWidge { /* Invoke Qt Designer generated QObject setup routine */ ui.setupUi(this); - + Settings->loadWidgetInformation(this); ui.headerFrame->setHeaderImage(QPixmap(":/images/user/identityinfo64.png")); //ui.headerFrame->setHeaderText(tr("Friend node details")); @@ -105,6 +105,7 @@ ConfCertDialog::ConfCertDialog(const RsPeerId& id, const RsPgpId &pgp_id, QWidge ConfCertDialog::~ConfCertDialog() { + Settings->saveWidgetInformation(this); QMap::iterator it = instances_ssl.find(peerId); if (it != instances_ssl.end()) instances_ssl.erase(it); diff --git a/retroshare-gui/src/gui/connect/PGPKeyDialog.cpp b/retroshare-gui/src/gui/connect/PGPKeyDialog.cpp index e878a22ec..a9e67585b 100644 --- a/retroshare-gui/src/gui/connect/PGPKeyDialog.cpp +++ b/retroshare-gui/src/gui/connect/PGPKeyDialog.cpp @@ -65,7 +65,7 @@ PGPKeyDialog::PGPKeyDialog(const RsPeerId& id, const RsPgpId &pgp_id, QWidget *p { /* Invoke Qt Designer generated QObject setup routine */ ui.setupUi(this); - + Settings->loadWidgetInformation(this); // if(id.isNull()) // ui._useOldFormat_CB->setChecked(true) ; // else @@ -100,6 +100,7 @@ PGPKeyDialog::PGPKeyDialog(const RsPeerId& id, const RsPgpId &pgp_id, QWidget *p PGPKeyDialog::~PGPKeyDialog() { + Settings->saveWidgetInformation(this); QMap::iterator it = instances_pgp.find(pgpId); if (it != instances_pgp.end()) instances_pgp.erase(it); diff --git a/retroshare-gui/src/gui/gxs/GxsGroupDialog.cpp b/retroshare-gui/src/gui/gxs/GxsGroupDialog.cpp index 7757a7a15..378151d78 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupDialog.cpp +++ b/retroshare-gui/src/gui/gxs/GxsGroupDialog.cpp @@ -34,6 +34,8 @@ #include #include +#include + #include // Control of Publish Signatures. @@ -66,7 +68,7 @@ GxsGroupDialog::GxsGroupDialog(TokenQueue *tokenExternalQueue, uint32_t enableFl { /* Invoke the Qt Designer generated object setup routine */ ui.setupUi(this); - + mInternalTokenQueue = NULL; init(); @@ -87,6 +89,7 @@ GxsGroupDialog::GxsGroupDialog(TokenQueue *tokenExternalQueue, RsTokenService *t GxsGroupDialog::~GxsGroupDialog() { + Settings->saveWidgetInformation(this); if (mInternalTokenQueue) { delete(mInternalTokenQueue); } @@ -134,6 +137,7 @@ void GxsGroupDialog::init() ui.personal_required->setChecked(true) ; // this is always true initMode(); + Settings->loadWidgetInformation(this); } QIcon GxsGroupDialog::serviceWindowIcon() diff --git a/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.cpp b/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.cpp index f21fd8660..af19f7f29 100644 --- a/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.cpp +++ b/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.cpp @@ -50,7 +50,7 @@ CreateGxsChannelMsg::CreateGxsChannelMsg(const RsGxsGroupId &cId, RsGxsMessageId { /* Invoke the Qt Designer generated object setup routine */ setupUi(this); - + Settings->loadWidgetInformation(this); mChannelQueue = new TokenQueue(rsGxsChannels->getTokenService(), this); headerFrame->setHeaderImage(QPixmap(":/images/channels.png")); @@ -95,6 +95,7 @@ CreateGxsChannelMsg::CreateGxsChannelMsg(const RsGxsGroupId &cId, RsGxsMessageId CreateGxsChannelMsg::~CreateGxsChannelMsg() { + Settings->saveWidgetInformation(this); #ifdef CHANNELS_FRAME_CATCHER delete fCatcher; #endif diff --git a/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.ui b/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.ui index 180a79672..3f4cd7d4b 100644 --- a/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.ui +++ b/retroshare-gui/src/gui/gxschannels/CreateGxsChannelMsg.ui @@ -60,7 +60,7 @@ false - 1 + 0 diff --git a/retroshare-gui/src/gui/statistics/StatisticsWindow.cpp b/retroshare-gui/src/gui/statistics/StatisticsWindow.cpp index 597cf6320..d9c74bf45 100644 --- a/retroshare-gui/src/gui/statistics/StatisticsWindow.cpp +++ b/retroshare-gui/src/gui/statistics/StatisticsWindow.cpp @@ -95,10 +95,12 @@ StatisticsWindow::StatisticsWindow(QWidget *parent) : { ui->setupUi(this); + Settings->loadWidgetInformation(this); + initStackedPage(); connect(ui->stackPages, SIGNAL(currentChanged(int)), this, SLOT(setNewPage(int))); ui->stackPages->setCurrentIndex(0); - + int toolSize = Settings->getToolButtonSize(); ui->toolBar->setToolButtonStyle(Settings->getToolButtonStyle()); ui->toolBar->setIconSize(QSize(toolSize,toolSize)); @@ -110,6 +112,11 @@ StatisticsWindow::~StatisticsWindow() mInstance = NULL; } +void StatisticsWindow::closeEvent (QCloseEvent * /*event*/) +{ + Settings->saveWidgetInformation(this); +} + void StatisticsWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); diff --git a/retroshare-gui/src/gui/statistics/StatisticsWindow.h b/retroshare-gui/src/gui/statistics/StatisticsWindow.h index 3541a6cc6..a491792a8 100644 --- a/retroshare-gui/src/gui/statistics/StatisticsWindow.h +++ b/retroshare-gui/src/gui/statistics/StatisticsWindow.h @@ -65,7 +65,8 @@ public slots: protected: void changeEvent(QEvent *e); - + void closeEvent (QCloseEvent * event); + private: void initStackedPage(); From 749a34d8154eff45ca41a0cb9073a6d6e8edeb87 Mon Sep 17 00:00:00 2001 From: RetroPooh Date: Sun, 22 Oct 2017 15:55:08 +0300 Subject: [PATCH 38/58] add text labels to post buttons in forums and channels; fix version selector placement --- .../gui/gxschannels/GxsChannelPostsWidget.cpp | 2 ++ .../gui/gxschannels/GxsChannelPostsWidget.ui | 6 ++++++ .../gui/gxsforums/GxsForumThreadWidget.cpp | 3 +++ .../src/gui/gxsforums/GxsForumThreadWidget.ui | 20 +++++++++++++++---- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.cpp b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.cpp index 56cf042a5..b3f5662b4 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.cpp +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.cpp @@ -75,6 +75,8 @@ GxsChannelPostsWidget::GxsChannelPostsWidget(const RsGxsGroupId &channelId, QWid connect(ui->subscribeToolButton, SIGNAL(subscribe(bool)), this, SLOT(subscribeGroup(bool))); connect(NotifyQt::getInstance(), SIGNAL(settingsChanged()), this, SLOT(settingsChanged())); + ui->postButton->setText(tr("Add new post")); + /* add filter actions */ ui->filterLineEdit->addFilter(QIcon(), tr("Title"), FILTER_TITLE, tr("Search Title")); ui->filterLineEdit->addFilter(QIcon(), tr("Message"), FILTER_MSG, tr("Search Message")); diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.ui b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.ui index 47f98bcdf..7e9b478ac 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.ui +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.ui @@ -169,6 +169,9 @@ Post to Channel + + Add new post + :/images/mail_send.png:/images/mail_send.png @@ -179,6 +182,9 @@ 16 + + Qt::ToolButtonTextBesideIcon + true diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index f08b1f61f..2a0f59ceb 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -210,6 +210,9 @@ GxsForumThreadWidget::GxsForumThreadWidget(const RsGxsGroupId &forumId, QWidget connect(ui->newmessageButton, SIGNAL(clicked()), this, SLOT(replytoforummessage())); connect(ui->newthreadButton, SIGNAL(clicked()), this, SLOT(createthread())); + ui->newmessageButton->setText(tr("Reply")); + ui->newthreadButton->setText(tr("New thread")); + connect(ui->threadTreeWidget, SIGNAL(itemSelectionChanged()), this, SLOT(changedThread())); connect(ui->threadTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(clickedThread(QTreeWidgetItem*,int))); connect(ui->viewBox, SIGNAL(currentIndexChanged(int)), this, SLOT(changedViewBox())); diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui index 789616228..571e99c01 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui @@ -84,6 +84,9 @@ Start new Thread for Selected Forum + + New Thread + :/images/mail_new.png:/images/mail_new.png @@ -94,6 +97,9 @@ 16 + + Qt::ToolButtonTextBesideIcon + true @@ -306,8 +312,8 @@ - 24 - 24 + 16777215 + 16777215 @@ -316,10 +322,16 @@ Reply Message + + Reply + :/images/mail_reply.png:/images/mail_reply.png + + Qt::ToolButtonTextBesideIcon + true @@ -358,7 +370,7 @@ - + Qt::Vertical @@ -471,7 +483,7 @@ - + From ee2120a5bce5dcf1b2f9a512a9c38f8545215c02 Mon Sep 17 00:00:00 2001 From: csoler Date: Sun, 22 Oct 2017 17:36:19 +0200 Subject: [PATCH 39/58] fixed bug causing FileTree links to open empty --- retroshare-gui/src/gui/common/RsCollection.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/retroshare-gui/src/gui/common/RsCollection.cpp b/retroshare-gui/src/gui/common/RsCollection.cpp index 8fdbd4e0f..14f522531 100644 --- a/retroshare-gui/src/gui/common/RsCollection.cpp +++ b/retroshare-gui/src/gui/common/RsCollection.cpp @@ -48,12 +48,18 @@ RsCollection::RsCollection(QObject *parent) RsCollection::RsCollection(const FileTree& fr) : _xml_doc("RsCollection") { + _root = _xml_doc.createElement("RsCollection"); + _xml_doc.appendChild(_root); + recursAddElements(_xml_doc,fr,0,_root) ; } RsCollection::RsCollection(const std::vector& file_infos, QObject *parent) : QObject(parent), _xml_doc("RsCollection") { + _root = _xml_doc.createElement("RsCollection"); + _xml_doc.appendChild(_root); + for(uint32_t i = 0;i Date: Sun, 22 Oct 2017 18:28:36 +0200 Subject: [PATCH 40/58] added means to select download directory in RsCollectionDialog --- .../src/gui/common/RsCollectionDialog.cpp | 56 ++++++++++++++++++- .../src/gui/common/RsCollectionDialog.h | 3 + .../src/gui/common/RsCollectionDialog.ui | 40 +++++++------ 3 files changed, 82 insertions(+), 17 deletions(-) diff --git a/retroshare-gui/src/gui/common/RsCollectionDialog.cpp b/retroshare-gui/src/gui/common/RsCollectionDialog.cpp index b73191fec..e78fbdf08 100644 --- a/retroshare-gui/src/gui/common/RsCollectionDialog.cpp +++ b/retroshare-gui/src/gui/common/RsCollectionDialog.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -50,6 +51,7 @@ #define MAX_FILE_ADDED_BEFORE_ASK 500 //Number of file added in Recursive mode before asking to continue +#define IMAGE_SEARCH ":/icons/svg/magnifying-glass.svg" /** * @brief The FSMSortFilterProxyModel class sort directory before file. @@ -140,9 +142,21 @@ RsCollectionDialog::RsCollectionDialog(const QString& collectionFileName ui.headerFrame->setHeaderImage(QPixmap(":/images/library64.png")); if(creation) + { ui.headerFrame->setHeaderText(tr("Collection Editor")); + ui.downloadFolder_LE->hide(); + ui.downloadFolder_LB->hide(); + } else + { ui.headerFrame->setHeaderText(tr("Download files")); + ui.downloadFolder_LE->show(); + ui.downloadFolder_LB->show(); + + ui.downloadFolder_LE->setText(QString::fromUtf8(rsFiles->getDownloadDirectory().c_str())) ; + + QObject::connect(ui.downloadFolder_LE,SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(openDestinationDirectoryMenu(QPoint))); + } // 1 - add all elements to the list. @@ -213,6 +227,46 @@ RsCollectionDialog::RsCollectionDialog(const QString& collectionFileName QMessageBox::warning(NULL,tr("Bad filenames have been cleaned"),tr("Some filenames or directory names contained forbidden characters.\nCharacters \",|,/,\\,<,>,*,? will be replaced by '_'.\n Concerned files are listed in red.")) ; } +void RsCollectionDialog::openDestinationDirectoryMenu(QPoint) +{ + QMenu contextMnu( this ); + + // pop a menu with existing entries and also a custom entry + // Now get the list of existing directories. + + std::list< SharedDirInfo> dirs ; + rsFiles->getSharedDirectories( dirs) ; + + for (std::list::const_iterator it(dirs.begin());it!=dirs.end();++it){ + // Check for existence of directory name + QFile directory( QString::fromUtf8((*it).filename.c_str())) ; + + if (!directory.exists()) continue ; + if (!(directory.permissions() & QFile::WriteOwner)) continue ; + + contextMnu.addAction(QString::fromUtf8((*it).filename.c_str()), this, SLOT(setDestinationDirectory()))->setData(QString::fromUtf8( (*it).filename.c_str() ) ) ; + } + + contextMnu.addAction( QIcon(IMAGE_SEARCH),tr("Specify..."),this,SLOT(chooseDestinationDirectory())); + + contextMnu.exec(QCursor::pos()) ; +} + +void RsCollectionDialog::setDestinationDirectory() +{ + QString dest_dir(qobject_cast(sender())->data().toString()) ; + ui.downloadFolder_LE->setText(dest_dir) ; +} + +void RsCollectionDialog::chooseDestinationDirectory() +{ + QString dest_dir = QFileDialog::getExistingDirectory(this,tr("Choose directory")) ; + + if(dest_dir.isNull()) + return ; + + ui.downloadFolder_LE->setText(dest_dir) ; +} /** * @brief RsCollectionDialog::~RsCollectionDialog */ @@ -1226,7 +1280,7 @@ void RsCollectionDialog::download() { std::cerr << "Downloading!" << std::endl; - QString dldir = QString::fromUtf8(rsFiles->getDownloadDirectory().c_str()) ; + QString dldir = ui.downloadFolder_LE->text(); std::cerr << "downloading all these files:" << std::endl; diff --git a/retroshare-gui/src/gui/common/RsCollectionDialog.h b/retroshare-gui/src/gui/common/RsCollectionDialog.h index bac5289b4..7ecf9b6da 100644 --- a/retroshare-gui/src/gui/common/RsCollectionDialog.h +++ b/retroshare-gui/src/gui/common/RsCollectionDialog.h @@ -49,6 +49,9 @@ private slots: void add() ; void addRecursive() ; void remove() ; + void chooseDestinationDirectory(); + void setDestinationDirectory(); + void openDestinationDirectoryMenu(QPoint pt); void processItem(QMap &dirToAdd , int &index , ColFileInfo &parent diff --git a/retroshare-gui/src/gui/common/RsCollectionDialog.ui b/retroshare-gui/src/gui/common/RsCollectionDialog.ui index 78e736c24..a1b2fd275 100644 --- a/retroshare-gui/src/gui/common/RsCollectionDialog.ui +++ b/retroshare-gui/src/gui/common/RsCollectionDialog.ui @@ -6,8 +6,8 @@ 0 0 - 693 - 525 + 969 + 778 @@ -67,19 +67,7 @@ QFrame::Plain - - - 0 - - - 0 - - - 0 - - - 0 - + @@ -403,7 +391,7 @@ - + @@ -424,6 +412,26 @@ + + + + Destination: + + + + + + + Qt::PreventContextMenu + + + Right click to change download directory + + + true + + + From 723016e930ae9c9304578a3820a116131887b0ed Mon Sep 17 00:00:00 2001 From: RetroPooh Date: Sun, 22 Oct 2017 19:39:44 +0300 Subject: [PATCH 41/58] fix descriptions display in Posted --- retroshare-gui/src/gui/Posted/PostedItem.cpp | 13 ++----- retroshare-gui/src/gui/Posted/PostedItem.ui | 37 ++++++++++---------- 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/retroshare-gui/src/gui/Posted/PostedItem.cpp b/retroshare-gui/src/gui/Posted/PostedItem.cpp index d26b1e5c8..327608ff8 100644 --- a/retroshare-gui/src/gui/Posted/PostedItem.cpp +++ b/retroshare-gui/src/gui/Posted/PostedItem.cpp @@ -104,8 +104,6 @@ void PostedItem::setup() ui->clearButton->hide(); ui->readAndClearButton->hide(); - - ui->frame_notes->hide(); } bool PostedItem::setGroup(const RsPostedGroup &group, bool doFill) @@ -278,11 +276,12 @@ void PostedItem::fill() // FIX THIS UP LATER. ui->notes->setText(QString::fromUtf8(mPost.mNotes.c_str())); + if(ui->notes->text().isEmpty()) + ui->frame_notes->hide(); // differences between Feed or Top of Comment. if (mFeedHolder) { // feed. - ui->frame_notes->hide(); //frame_comment->show(); ui->commentButton->show(); @@ -303,14 +302,6 @@ void PostedItem::fill() else { // no feed. - if(ui->notes->text().isEmpty()) - { - ui->frame_notes->hide(); - } - else - { - ui->frame_notes->show(); - } //frame_comment->hide(); ui->commentButton->hide(); diff --git a/retroshare-gui/src/gui/Posted/PostedItem.ui b/retroshare-gui/src/gui/Posted/PostedItem.ui index ac9ea2a72..bebf874c2 100644 --- a/retroshare-gui/src/gui/Posted/PostedItem.ui +++ b/retroshare-gui/src/gui/Posted/PostedItem.ui @@ -60,7 +60,7 @@ - + 0 @@ -327,30 +327,29 @@ - QFrame::Box + QFrame::NoFrame QFrame::Sunken - - - - 2 - 2 - 16 - 17 - + + + 1 - - + + 1 - - - - - true - - + + + + + + + true + + + + From 4e16042b75236812442979b837e2bd4890b48d12 Mon Sep 17 00:00:00 2001 From: hunbernd Date: Sun, 22 Oct 2017 19:11:52 +0200 Subject: [PATCH 42/58] Part of the forum title is not displayed when it is enclosed in < > --- retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index 2a0f59ceb..5209ca184 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -231,6 +231,7 @@ GxsForumThreadWidget::GxsForumThreadWidget(const RsGxsGroupId &forumId, QWidget /* Set own item delegate */ RSElidedItemDelegate *itemDelegate = new RSElidedItemDelegate(this); itemDelegate->setSpacing(QSize(0, 2)); + itemDelegate->setOnlyPlainText(true); ui->threadTreeWidget->setItemDelegate(itemDelegate); /* Set header resize modes and initial section sizes */ From 0c39b5c021ea535a7a65aca845ed5f16ae8fae1b Mon Sep 17 00:00:00 2001 From: hunbernd Date: Sun, 22 Oct 2017 19:44:14 +0200 Subject: [PATCH 43/58] Fix bug causing RS to crash at startup when some icons were removed from toolbar For example: disabled plugins --- retroshare-gui/src/gui/MainWindow.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 0933f8e7b..74bc4ab27 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -207,8 +207,9 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags) connect(ui->listWidget, SIGNAL(currentRowChanged(int)), this, SLOT(setNewPage(int))); connect(ui->stackPages, SIGNAL(currentChanged(int)), this, SLOT(setNewPage(int))); - //ui->stackPages->setCurrentIndex(Settings->getLastPageInMainWindow()); - setNewPage(Settings->getLastPageInMainWindow()); + int lastpageindex = Settings->getLastPageInMainWindow(); + if(lastpageindex < ui->stackPages->count()) //Do not crash when a page was removed after last run + setNewPage(lastpageindex); ui->splitter->setStretchFactor(0, 0); ui->splitter->setStretchFactor(1, 1); From 0359795caeb16e8937d11ac5b608f1772252a0fd Mon Sep 17 00:00:00 2001 From: csoler Date: Sun, 22 Oct 2017 20:08:22 +0200 Subject: [PATCH 44/58] fixed regression preventing context menu to open in destination directory for RsCollection --- retroshare-gui/src/gui/common/RsCollectionDialog.ui | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/common/RsCollectionDialog.ui b/retroshare-gui/src/gui/common/RsCollectionDialog.ui index a1b2fd275..1e867eb2a 100644 --- a/retroshare-gui/src/gui/common/RsCollectionDialog.ui +++ b/retroshare-gui/src/gui/common/RsCollectionDialog.ui @@ -10,6 +10,9 @@ 778 + + Qt::CustomContextMenu + Collection @@ -422,7 +425,7 @@ - Qt::PreventContextMenu + Qt::CustomContextMenu Right click to change download directory From 78037a66be2c53405642dba24a0dbd56c7470ae0 Mon Sep 17 00:00:00 2001 From: RetroPooh Date: Mon, 23 Oct 2017 11:42:03 +0300 Subject: [PATCH 45/58] disable nat/dht indicators for hidden mode, hide irrelevant network options elements --- retroshare-gui/src/gui/MainWindow.cpp | 23 +++++++++++++++---- retroshare-gui/src/gui/MainWindow.h | 2 ++ .../src/gui/settings/AppearancePage.cpp | 11 +++++++-- .../src/gui/settings/ServerPage.cpp | 19 +++++++++++++-- retroshare-gui/src/gui/settings/ServerPage.ui | 4 ++-- .../src/gui/statistics/StatisticsWindow.cpp | 15 +++++++++--- 6 files changed, 60 insertions(+), 14 deletions(-) diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 0933f8e7b..8012d5be2 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -141,6 +141,7 @@ #define IMAGE_BLOGS ":/images/kblogger.png" #define IMAGE_DHT ":/images/dht16.png" +/*static*/ bool MainWindow::hiddenmode = false; /*static*/ MainWindow *MainWindow::_instance = NULL; @@ -182,8 +183,10 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags) RsPeerDetails pd; if (rsPeers->getPeerDetails(rsPeers->getOwnId(), pd)) { nameAndLocation = QString("%1 (%2)").arg(QString::fromUtf8(pd.name.c_str())).arg(QString::fromUtf8(pd.location.c_str())); + if(pd.netMode == RS_NETMODE_HIDDEN) + hiddenmode = true; } - + setWindowTitle(tr("RetroShare %1 a secure decentralized communication platform").arg(Rshare::retroshareVersion(true)) + " - " + nameAndLocation); connect(rApp, SIGNAL(newArgsReceived(QStringList)), this, SLOT(receiveNewArgs(QStringList))); @@ -241,13 +244,17 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags) statusBar()->addWidget(peerstatus); natstatus = new NATStatus(); - natstatus->setVisible(Settings->valueFromGroup("StatusBar", "ShowNAT", QVariant(true)).toBool()); + if(hiddenmode) natstatus->setVisible(false); + else natstatus->setVisible(Settings->valueFromGroup("StatusBar", "ShowNAT", QVariant(true)).toBool()); statusBar()->addWidget(natstatus); - + natstatus->getNATStatus(); + dhtstatus = new DHTStatus(); - dhtstatus->setVisible(Settings->valueFromGroup("StatusBar", "ShowDHT", QVariant(true)).toBool()); + if(hiddenmode) dhtstatus->setVisible(false); + else dhtstatus->setVisible(Settings->valueFromGroup("StatusBar", "ShowDHT", QVariant(true)).toBool()); statusBar()->addWidget(dhtstatus); - + dhtstatus->getDHTStatus(); + hashingstatus = new HashingStatus(); hashingstatus->setVisible(Settings->valueFromGroup("StatusBar", "ShowHashing", QVariant(true)).toBool()); statusBar()->addPermanentWidget(hashingstatus, 1); @@ -702,11 +709,14 @@ void MainWindow::updateStatus() if (ratesstatus) ratesstatus->getRatesStatus(downKb, upKb); + if(!hiddenmode) + { if (natstatus) natstatus->getNATStatus(); if (dhtstatus) dhtstatus->getDHTStatus(); + } if (discstatus) { discstatus->update(); @@ -1576,10 +1586,13 @@ void MainWindow::setCompactStatusMode(bool compact) //statusComboBox: TODO Show only icon peerstatus->setCompactMode(compact); updateFriends(); + if(!hiddenmode) + { natstatus->setCompactMode(compact); natstatus->getNATStatus(); dhtstatus->setCompactMode(compact); dhtstatus->getDHTStatus(); + } hashingstatus->setCompactMode(compact); ratesstatus->setCompactMode(compact); //opModeStatus: TODO Show only ??? diff --git a/retroshare-gui/src/gui/MainWindow.h b/retroshare-gui/src/gui/MainWindow.h index 0297690ae..b3fc246dc 100644 --- a/retroshare-gui/src/gui/MainWindow.h +++ b/retroshare-gui/src/gui/MainWindow.h @@ -184,6 +184,8 @@ public: ToasterDisable *toasterDisableInstance(); SysTrayStatus *sysTrayStatusInstance(); + static bool hiddenmode; + public slots: void receiveNewArgs(QStringList args); void displayErrorMessage(int,int,const QString&) ; diff --git a/retroshare-gui/src/gui/settings/AppearancePage.cpp b/retroshare-gui/src/gui/settings/AppearancePage.cpp index e5e742c72..5ffa7e10a 100755 --- a/retroshare-gui/src/gui/settings/AppearancePage.cpp +++ b/retroshare-gui/src/gui/settings/AppearancePage.cpp @@ -301,8 +301,15 @@ void AppearancePage::load() whileBlocking(ui.checkBoxDisableSysTrayToolTip)->setChecked(Settings->valueFromGroup("StatusBar", "DisableSysTrayToolTip", QVariant(false)).toBool()); whileBlocking(ui.checkBoxShowStatusStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowStatus", QVariant(true)).toBool()); whileBlocking(ui.checkBoxShowPeerStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowPeer", QVariant(true)).toBool()); - whileBlocking(ui.checkBoxShowNATStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowNAT", QVariant(true)).toBool()); - whileBlocking(ui.checkBoxShowDHTStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowDHT", QVariant(true)).toBool()); + if(MainWindow::hiddenmode) { + whileBlocking(ui.checkBoxShowNATStatus)-> setChecked(0); + whileBlocking(ui.checkBoxShowDHTStatus)-> setChecked(0); + ui.checkBoxShowNATStatus->setVisible(false); + ui.checkBoxShowDHTStatus->setVisible(false); + } else { + whileBlocking(ui.checkBoxShowNATStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowNAT", QVariant(true)).toBool()); + whileBlocking(ui.checkBoxShowDHTStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowDHT", QVariant(true)).toBool()); + } whileBlocking(ui.checkBoxShowHashingStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowHashing", QVariant(true)).toBool()); whileBlocking(ui.checkBoxShowDiscStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowDisc", QVariant(true)).toBool()); whileBlocking(ui.checkBoxShowRateStatus)-> setChecked(Settings->valueFromGroup("StatusBar", "ShowRate", QVariant(true)).toBool()); diff --git a/retroshare-gui/src/gui/settings/ServerPage.cpp b/retroshare-gui/src/gui/settings/ServerPage.cpp index ae7411c4f..9ff71dcb5 100755 --- a/retroshare-gui/src/gui/settings/ServerPage.cpp +++ b/retroshare-gui/src/gui/settings/ServerPage.cpp @@ -303,7 +303,8 @@ void ServerPage::load() if (mIsHiddenNode) { mHiddenType = detail.hiddenType; - ui.tabWidget->setTabEnabled(1,false) ; + ui.tabWidget->setTabEnabled(1,false) ; // ip filter + ui.tabWidget->setTabEnabled(3,false) ; // relay loadHiddenNode(); return; } @@ -1004,10 +1005,24 @@ void ServerPage::loadHiddenNode() ui.iconlabel_upnp->hide(); ui.label_nat->hide(); + ui.label_warningBandwidth->hide(); + ui.iconlabel_netLimited->hide(); + ui.textlabel_netLimited->hide(); + ui.iconlabel_ext->hide(); + ui.textlabel_ext->hide(); + ui.extPortLabel->hide(); + + ui.ipAddressLabel->hide(); + ui.cleanKnownIPs_PB->hide(); + + ui.ipAddressList->hide(); + ui.allowIpDeterminationCB->hide(); + ui.IPServersLV->hide(); + ui.textlabel_hiddenMode->show(); ui.iconlabel_hiddenMode->show() ; ui.iconlabel_hiddenMode->setPixmap(QPixmap(":/images/ledon1.png")); - + // CHANGE OPTIONS ON whileBlocking(ui.discComboBox)->removeItem(3); whileBlocking(ui.discComboBox)->removeItem(2); diff --git a/retroshare-gui/src/gui/settings/ServerPage.ui b/retroshare-gui/src/gui/settings/ServerPage.ui index 0adb576c6..6ff4723ab 100755 --- a/retroshare-gui/src/gui/settings/ServerPage.ui +++ b/retroshare-gui/src/gui/settings/ServerPage.ui @@ -831,7 +831,7 @@ behind a firewall or a VPN. - <html><head/><body><p>Outgoing Connctions</p><p>Configure your Tor and I2P SOCKS proxy here. <br/>If you prefer to use BOB to automatically manage I2P check the other tab.</p></body></html> + <html><head/><body><p>Configure your Tor and I2P SOCKS proxy here. <br/>If you prefer to use BOB to automatically manage I2P check the other tab.</p></body></html> @@ -1475,7 +1475,7 @@ You can connect to Hidden Nodes, even if you are running a standard Node, so why - <html><head/><body><p>Incoming Connection</p><p>Setup your hidden address (and port if needed)</p></body></html> + <html><head/><body><p>Setup your hidden address (and port if needed)</p></body></html> diff --git a/retroshare-gui/src/gui/statistics/StatisticsWindow.cpp b/retroshare-gui/src/gui/statistics/StatisticsWindow.cpp index 597cf6320..d4abdc4f3 100644 --- a/retroshare-gui/src/gui/statistics/StatisticsWindow.cpp +++ b/retroshare-gui/src/gui/statistics/StatisticsWindow.cpp @@ -98,7 +98,6 @@ StatisticsWindow::StatisticsWindow(QWidget *parent) : initStackedPage(); connect(ui->stackPages, SIGNAL(currentChanged(int)), this, SLOT(setNewPage(int))); ui->stackPages->setCurrentIndex(0); - int toolSize = Settings->getToolButtonSize(); ui->toolBar->setToolButtonStyle(Settings->getToolButtonStyle()); ui->toolBar->setIconSize(QSize(toolSize,toolSize)); @@ -147,9 +146,19 @@ void StatisticsWindow::initStackedPage() ui->stackPages->add(rttdlg = new RttStatistics(ui->stackPages), action = createPageAction(QIcon(IMAGE_RTT), tr("RTT Statistics"), grp)); - ui->stackPages->add(dhtw = new DhtWindow(ui->stackPages), + bool showdht = true; + RsPeerDetails detail; + if (rsPeers->getPeerDetails(rsPeers->getOwnId(), detail)) + { + if(detail.netMode == RS_NETMODE_HIDDEN) + showdht = false; + } + if(showdht) + { + ui->stackPages->add(dhtw = new DhtWindow(ui->stackPages), action = createPageAction(QIcon(IMAGE_DHT), tr("DHT"), grp)); - + } + /*std::cerr << "Looking for interfaces in existing plugins:" << std::endl; for(int i = 0;inbPlugins();++i) { From 1cc65066dd347e00632bf571fe96933990f6f800 Mon Sep 17 00:00:00 2001 From: Pooh Date: Mon, 23 Oct 2017 11:49:05 +0300 Subject: [PATCH 46/58] Update ServerPage.cpp --- retroshare-gui/src/gui/settings/ServerPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/settings/ServerPage.cpp b/retroshare-gui/src/gui/settings/ServerPage.cpp index 9ff71dcb5..d9b1ff0de 100755 --- a/retroshare-gui/src/gui/settings/ServerPage.cpp +++ b/retroshare-gui/src/gui/settings/ServerPage.cpp @@ -1022,7 +1022,7 @@ void ServerPage::loadHiddenNode() ui.textlabel_hiddenMode->show(); ui.iconlabel_hiddenMode->show() ; ui.iconlabel_hiddenMode->setPixmap(QPixmap(":/images/ledon1.png")); - + // CHANGE OPTIONS ON whileBlocking(ui.discComboBox)->removeItem(3); whileBlocking(ui.discComboBox)->removeItem(2); From 4594c1ae9c85fc471b325cba641d5783ffa264f8 Mon Sep 17 00:00:00 2001 From: Pooh Date: Mon, 23 Oct 2017 11:51:22 +0300 Subject: [PATCH 47/58] Update MainWindow.cpp --- retroshare-gui/src/gui/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 10342b3c8..9569af802 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -186,7 +186,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags) if(pd.netMode == RS_NETMODE_HIDDEN) hiddenmode = true; } - + setWindowTitle(tr("RetroShare %1 a secure decentralized communication platform").arg(Rshare::retroshareVersion(true)) + " - " + nameAndLocation); connect(rApp, SIGNAL(newArgsReceived(QStringList)), this, SLOT(receiveNewArgs(QStringList))); From 4a1ddccd8e0aa9bceedf80b5da52ac345865da46 Mon Sep 17 00:00:00 2001 From: RetroPooh Date: Mon, 23 Oct 2017 12:24:56 +0300 Subject: [PATCH 48/58] removed show discovery checkbox from network options, it is in appearance now --- retroshare-gui/src/gui/settings/ServerPage.cpp | 8 -------- retroshare-gui/src/gui/settings/ServerPage.h | 1 - retroshare-gui/src/gui/settings/ServerPage.ui | 13 ++----------- 3 files changed, 2 insertions(+), 20 deletions(-) diff --git a/retroshare-gui/src/gui/settings/ServerPage.cpp b/retroshare-gui/src/gui/settings/ServerPage.cpp index ae7411c4f..f0af32d27 100755 --- a/retroshare-gui/src/gui/settings/ServerPage.cpp +++ b/retroshare-gui/src/gui/settings/ServerPage.cpp @@ -152,7 +152,6 @@ ServerPage::ServerPage(QWidget * parent, Qt::WindowFlags flags) connect( ui.allowIpDeterminationCB, SIGNAL( toggled( bool ) ), this, SLOT( toggleIpDetermination(bool) ) ); connect( ui.cleanKnownIPs_PB, SIGNAL( clicked( ) ), this, SLOT( clearKnownAddressList() ) ); connect( ui.testIncoming_PB, SIGNAL( clicked( ) ), this, SLOT( saveAndTestInProxy() ) ); - connect( ui.showDiscStatusBar,SIGNAL(toggled(bool)),this,SLOT(updateShowDiscStatusBar())) ; #ifdef SERVER_DEBUG std::cerr << "ServerPage::ServerPage() called"; @@ -160,7 +159,6 @@ ServerPage::ServerPage(QWidget * parent, Qt::WindowFlags flags) #endif connect(ui.netModeComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(saveAddresses())); - connect(ui.discComboBox, SIGNAL(currentIndexChanged(int)),this,SLOT(saveAddresses())); connect(ui.localAddress, SIGNAL(textChanged(QString)),this,SLOT(saveAddresses())); connect(ui.extAddress, SIGNAL(textChanged(QString)),this,SLOT(saveAddresses())); connect(ui.dynDNS, SIGNAL(textChanged(QString)),this,SLOT(saveAddresses())); @@ -277,8 +275,6 @@ void ServerPage::toggleTunnelConnection(bool b) //rsPeers->allowTunnelConnection(b) ; } -void ServerPage::updateShowDiscStatusBar() { Settings->setStatusBarFlag(STATUSBAR_DISC, ui.showDiscStatusBar->isChecked()); } - /** Loads the settings for this page */ void ServerPage::load() { @@ -380,7 +376,6 @@ void ServerPage::load() /* set DynDNS */ whileBlocking(ui.dynDNS) -> setText(QString::fromStdString(detail.dyndns)); - whileBlocking(ui.showDiscStatusBar)->setChecked(Settings->getStatusBarFlags() & STATUSBAR_DISC); whileBlocking(ui.ipAddressList)->clear(); for(std::list::const_iterator it(detail.ipAddressList.begin());it!=detail.ipAddressList.end();++it) @@ -1048,9 +1043,6 @@ void ServerPage::loadHiddenNode() whileBlocking(ui.extAddress)->setText(tr("Hidden - See Config")); - whileBlocking(ui.showDiscStatusBar)->setChecked(Settings->getStatusBarFlags() & STATUSBAR_DISC); - ui.showDiscStatusBar->hide() ; // hidden because not functional at the moment. - //ui._turtle_enabled_CB->setChecked(rsTurtle->enabled()) ; // show what we have in ipAddresses. (should be nothing!) diff --git a/retroshare-gui/src/gui/settings/ServerPage.h b/retroshare-gui/src/gui/settings/ServerPage.h index 87f13400c..ce0e4baa4 100755 --- a/retroshare-gui/src/gui/settings/ServerPage.h +++ b/retroshare-gui/src/gui/settings/ServerPage.h @@ -87,7 +87,6 @@ private slots: // server void saveAddresses(); void saveRates(); - void updateShowDiscStatusBar() ; void toggleUPnP(); void toggleIpDetermination(bool) ; void toggleTunnelConnection(bool) ; diff --git a/retroshare-gui/src/gui/settings/ServerPage.ui b/retroshare-gui/src/gui/settings/ServerPage.ui index 0adb576c6..b1d2a7706 100755 --- a/retroshare-gui/src/gui/settings/ServerPage.ui +++ b/retroshare-gui/src/gui/settings/ServerPage.ui @@ -482,13 +482,6 @@ These values don't take into account the Relays. - - - Show Discovery information in statusbar - - - - If you uncheck this, RetroShare can only determine your IP @@ -504,7 +497,7 @@ behind a firewall or a VPN. - + @@ -517,7 +510,7 @@ behind a firewall or a VPN. - + Qt::Vertical @@ -531,7 +524,6 @@ behind a firewall or a VPN. - showDiscStatusBar allowIpDeterminationCB IPServersLV ipAddressList @@ -2097,7 +2089,6 @@ If you have issues connecting over Tor check the Tor logs too. extAddress extPort dynDNS - showDiscStatusBar From e24febf96ef508e37341249f846ba111f85944c4 Mon Sep 17 00:00:00 2001 From: Kcchouette Date: Mon, 23 Oct 2017 14:52:10 +0200 Subject: [PATCH 49/58] Fix some markdown checkbox --- libresapi/src/webui-src/README.md | 42 +++++++++++++++---------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/libresapi/src/webui-src/README.md b/libresapi/src/webui-src/README.md index 148068918..8174097e3 100644 --- a/libresapi/src/webui-src/README.md +++ b/libresapi/src/webui-src/README.md @@ -31,32 +31,32 @@ CONTRIBUTE TODO ---- -[ ] make stylesheets or find reusable sass/css components + - [ ] make stylesheets or find reusable sass/css components google material design has nice rules for color, spacing and everything: https://www.google.de/design/spec/material-design/introduction.html -[ ] find icons, maybe use google material design iconfont -[X] use urls/mithril routing for the menu. urls could replace state stored in rs.content -[X] drag and drop private key upload and import -[X] link from peer location to chat (use urls and mithril routing) -[X] add/remove friend, own cert -[X] downloads, search -[ ] make reusable infinite list controller, the js part to load data from Pagination.h (tweak Pagination.h to make everything work) + - [ ] find icons, maybe use google material design iconfont + - [X] use urls/mithril routing for the menu. urls could replace state stored in rs.content + - [X] drag and drop private key upload and import + - [X] link from peer location to chat (use urls and mithril routing) + - [X] add/remove friend, own cert + - [X] downloads, search + - [ ] make reusable infinite list controller, the js part to load data from Pagination.h (tweak Pagination.h to make everything work) should provide forward, backward and follow-list-end -[ ] backend: view/create identities -[ ] backend: chat lobby participants list -[X] chat: send_message -[ ] backend: chat typing notifications -[ ] make routines to handle retroshare links -[ ] backend: edit shared folders -[ ] backend: view shared files -[ ] redirect if a url is not usable in the current runstate (e.g. redirect from login page to home page, after login) -[X] sort friendslist + - [ ] backend: view/create identities + - [ ] backend: chat lobby participants list + - [X] chat: send_message + - [ ] backend: chat typing notifications + - [ ] make routines to handle retroshare links + - [ ] backend: edit shared folders + - [ ] backend: view shared files + - [ ] redirect if a url is not usable in the current runstate (e.g. redirect from login page to home page, after login) + - [X] sort friendslist need 4 master ------------- -[X] unsubscribe lobby -[X] unread chat message counter in menu -[X] list chat-lobby participants -[X] creating app.js on build (no need for npm on regulary build) + - [X] unsubscribe lobby + - [X] unread chat message counter in menu + - [X] list chat-lobby participants + - [X] creating app.js on build (no need for npm on regulary build) url-handling (brainstorming) ---------------------------- From 9af2730879d56e9aff7243e4c7112d548c3956c1 Mon Sep 17 00:00:00 2001 From: hunbernd Date: Thu, 8 Jun 2017 23:00:33 +0200 Subject: [PATCH 50/58] Downscale image automatically --- retroshare-gui/src/util/HandleRichText.cpp | 47 ++----------- retroshare-gui/src/util/imageutil.cpp | 79 ++++++++++++++++++++++ retroshare-gui/src/util/imageutil.h | 4 ++ 3 files changed, 88 insertions(+), 42 deletions(-) diff --git a/retroshare-gui/src/util/HandleRichText.cpp b/retroshare-gui/src/util/HandleRichText.cpp index 96fd36d73..75b3c327d 100644 --- a/retroshare-gui/src/util/HandleRichText.cpp +++ b/retroshare-gui/src/util/HandleRichText.cpp @@ -35,6 +35,8 @@ #include "HandleRichText.h" #include "gui/RetroShareLink.h" #include "util/ObjectPainter.h" +#include "util/imageutil.h" +#include "util/rsscopetimer.h" #include @@ -1119,48 +1121,9 @@ bool RsHtml::makeEmbeddedImage(const QString &fileName, QString &embeddedImage, /** Converts image to embedded image HTML fragment **/ bool RsHtml::makeEmbeddedImage(const QImage &originalImage, QString &embeddedImage, const int maxPixels) { - QByteArray bytearray; - QBuffer buffer(&bytearray); - QImage resizedImage; - const QImage *image = &originalImage; - - if (maxPixels > 0) { - QSize imgSize = originalImage.size(); - if ((imgSize.height() * imgSize.width()) > maxPixels) { - // image is too large - resize keeping aspect ratio - QSize newSize; - newSize.setWidth(int(qSqrt((maxPixels * imgSize.width()) / imgSize.height()))); - newSize.setHeight(int((imgSize.height() * newSize.width()) / imgSize.width())); - - // ask user - QMessageBox msgBox; - msgBox.setText(QString(QApplication::translate("RsHtml", "Image is oversized for transmission.\nReducing image to %1x%2 pixels?")).arg(newSize.width()).arg(newSize.height())); - msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); - msgBox.setDefaultButton(QMessageBox::Ok); - if (msgBox.exec() != QMessageBox::Ok) { - return false; - } - resizedImage = originalImage.scaled(newSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); - image = &resizedImage; - } - } - - if (buffer.open(QIODevice::WriteOnly)) { - if (image->save(&buffer, "PNG")) { - QByteArray encodedByteArray = bytearray.toBase64(); - - embeddedImage = ""); - } else { - //fprintf (stderr, "RsHtml::makeEmbeddedImage() - image can't be saved to buffer\n"); - return false; - } - } else { - fprintf (stderr, "RsHtml::makeEmbeddedImage() - buffer can't be opened\n"); - return false; - } - return true; + RsScopeTimer s("Embed image"); + QImage opt; + ImageUtil::optimizeSize(embeddedImage, originalImage, opt, maxPixels, 6000); } QString RsHtml::plainText(const QString &text) diff --git a/retroshare-gui/src/util/imageutil.cpp b/retroshare-gui/src/util/imageutil.cpp index 1a08ffb07..d27f946b8 100644 --- a/retroshare-gui/src/util/imageutil.cpp +++ b/retroshare-gui/src/util/imageutil.cpp @@ -8,6 +8,10 @@ #include #include #include +#include +#include +#include +#include ImageUtil::ImageUtil() {} @@ -42,3 +46,78 @@ void ImageUtil::extractImage(QWidget *window, QTextCursor cursor) } } +void ImageUtil::optimizeSize(QString &html, const QImage& original, QImage &optimized, int maxPixels, int maxBytes) +{ + optimized = original; + if ((maxPixels <= 0) || (optimized.width()*optimized.height() <= maxPixels)) { + if(checkSize(html, optimized, maxBytes)) { + return; + } + } + + //Downscale the image to fit into maxPixels + qreal scale = qSqrt((qreal)(maxPixels) / original.width() / original.height()); + if(scale > 1.0) scale = 1.0; + + //Half the resolution until image fits into maxBytes, or width becomes 0 + do { + optimized = original.scaledToWidth((int)(original.width() * scale), Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8); + checkSize(html, optimized, maxBytes); + scale = scale / 2.0; + } while((!optimized.isNull()) && (!checkSize(html, optimized, maxBytes))); +} + +bool ImageUtil::checkSize(QString &embeddedImage, const QImage &img, int maxBytes) +{ + QByteArray bytearray; + QBuffer buffer(&bytearray); + + std::cout << QString("Trying image: format PNG, size %1x%2, colors %3\n").arg(img.width()).arg(img.height()).arg(img.colorCount()).toStdString(); + if (buffer.open(QIODevice::WriteOnly)) { + if (img.save(&buffer, "PNG", 0)) { + QByteArray encodedByteArray = bytearray.toBase64(); + embeddedImage = ""); + if((maxBytes > 0) && (embeddedImage.size() > maxBytes)) + { + std::cout << QString("\tToo large, size: %1, limit: %2 bytes\n").arg(embeddedImage.size()).arg(maxBytes).toStdString(); + }else{ + std::cout << QString("\tOK, size: %1, limit: %2 bytes\n").arg(embeddedImage.size()).arg(maxBytes).toStdString(); + return true; + } + } else { + std::cerr << "ImageUtil: image can't be saved to buffer" << std::endl; + } + buffer.close(); + bytearray.clear(); + } else { + std::cerr << "ImageUtil: buffer can't be opened" << std::endl; + } + + std::cout << QString("Trying image: format JPEG, size %1x%2, colors %3\n").arg(img.width()).arg(img.height()).arg(img.colorCount()).toStdString(); + if (buffer.open(QIODevice::WriteOnly)) { + if (img.save(&buffer, "JPEG")) { + QByteArray encodedByteArray = bytearray.toBase64(); + embeddedImage = ""); + if((maxBytes > 0) && (embeddedImage.size() > maxBytes)) + { + std::cout << QString("\tToo large, size: %1, limit: %2 bytes\n").arg(embeddedImage.size()).arg(maxBytes).toStdString(); + }else{ + std::cout << QString("\tOK, size: %1, limit: %2 bytes\n").arg(embeddedImage.size()).arg(maxBytes).toStdString(); + return true; + } + } else { + std::cerr << "ImageUtil: image can't be saved to buffer" << std::endl; + } + buffer.close(); + bytearray.clear(); + } else { + std::cerr << "ImageUtil: buffer can't be opened" << std::endl; + } + + embeddedImage.clear(); + return false; +} diff --git a/retroshare-gui/src/util/imageutil.h b/retroshare-gui/src/util/imageutil.h index 30e6ecb67..e4755f2d2 100644 --- a/retroshare-gui/src/util/imageutil.h +++ b/retroshare-gui/src/util/imageutil.h @@ -10,6 +10,10 @@ public: ImageUtil(); static void extractImage(QWidget *window, QTextCursor cursor); + static void optimizeSize(QString &html, const QImage& original, QImage &optimized, int maxPixels = -1, int maxBytes = -1); + + private: + static bool checkSize(QString& embeddedImage, const QImage& img, int maxBytes = -1); }; #endif // IMAGEUTIL_H From af4817378c318b2dcecd79bbb63b84e453d4a259 Mon Sep 17 00:00:00 2001 From: hunbernd Date: Fri, 9 Jun 2017 23:29:39 +0200 Subject: [PATCH 51/58] Convert image into 4 bit color table format --- retroshare-gui/src/util/imageutil.cpp | 116 +++++++++++++++++++++++++- retroshare-gui/src/util/imageutil.h | 4 + 2 files changed, 119 insertions(+), 1 deletion(-) diff --git a/retroshare-gui/src/util/imageutil.cpp b/retroshare-gui/src/util/imageutil.cpp index d27f946b8..f36f442c1 100644 --- a/retroshare-gui/src/util/imageutil.cpp +++ b/retroshare-gui/src/util/imageutil.cpp @@ -1,5 +1,6 @@ #include "imageutil.h" #include "util/misc.h" +#include "util/rsscopetimer.h" #include #include @@ -11,6 +12,7 @@ #include #include #include +#include #include ImageUtil::ImageUtil() {} @@ -55,13 +57,16 @@ void ImageUtil::optimizeSize(QString &html, const QImage& original, QImage &opti } } + QVector ct; + quantization(original, ct); + //Downscale the image to fit into maxPixels qreal scale = qSqrt((qreal)(maxPixels) / original.width() / original.height()); if(scale > 1.0) scale = 1.0; //Half the resolution until image fits into maxBytes, or width becomes 0 do { - optimized = original.scaledToWidth((int)(original.width() * scale), Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8); + optimized = original.scaledToWidth((int)(original.width() * scale), Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8, ct); checkSize(html, optimized, maxBytes); scale = scale / 2.0; } while((!optimized.isNull()) && (!checkSize(html, optimized, maxBytes))); @@ -121,3 +126,112 @@ bool ImageUtil::checkSize(QString &embeddedImage, const QImage &img, int maxByte embeddedImage.clear(); return false; } + +bool redLessThan(const QRgb &c1, const QRgb &c2) +{ + return qRed(c1) < qRed(c2); +} + +bool greenLessThan(const QRgb &c1, const QRgb &c2) +{ + return qGreen(c1) < qGreen(c2); +} + +bool blueLessThan(const QRgb &c1, const QRgb &c2) +{ + return qBlue(c1) < qBlue(c2); +} + +//median cut algoritmh +void ImageUtil::quantization(const QImage &img, QVector &palette) +{ + int bits = 4; // bits/pixel + RsScopeTimer st("Quantization"); + QSet colors; + + //collect color information + for (int x = 0; x < img.width(); ++x) { + for (int y = 0; y < img.height(); ++y) { + QRgb rgb = img.pixel(x, y); + colors.insert(rgb); + } + } + + QList colorlist = colors.toList(); + //don't do the algoritmh if we have less than 16 different colors + if(colorlist.size() <= (1 << bits)) { + for(int i = 0; i < colors.count(); ++i) + palette.append(colorlist[i]); + } else { + quantization(colorlist.begin(), colorlist.end(), bits, palette); + } +} + +void ImageUtil::quantization(QList::iterator begin, QList::iterator end, int depth, QVector &palette) +{ + //the buckets are ready + if(depth == 0) { + avgbucket(begin, end, palette); + return; + } + + //nothing to do + int count = end - begin; + if(count == 1) { + palette.append(*begin); + return; + } + + //widest color channel + int rl = 255; + int gl = 255; + int bl = 255; + int rh = 0; + int gh = 0; + int bh = 0; + for(QList::iterator it = begin; it < end; ++it) { + rl = qMin(rl, qRed(*it)); + gl = qMin(gl, qGreen(*it)); + bl = qMin(bl, qBlue(*it)); + rh = qMax(rh, qRed(*it)); + gh = qMax(gh, qGreen(*it)); + bh = qMax(bh, qBlue(*it)); + } + int red = rh - rl; + int green = gh - gl; + int blue = bh - bl; + + //order by the widest channel + if(red > green) + if(red > blue) + qSort(begin, end, redLessThan); + else + qSort(begin, end, blueLessThan); + else + if(green > blue) + qSort(begin, end, greenLessThan); + else + qSort(begin, end, blueLessThan); + + //split into two buckets + QList::iterator split = begin + count / 2; + quantization(begin, split, depth - 1, palette); + quantization(split, end, depth - 1, palette); +} + +void ImageUtil::avgbucket(QList::iterator begin, QList::iterator end, QVector &palette) +{ + int red = 0; + int green = 0; + int blue = 0; + int count = end - begin; + + for(QList::iterator it = begin; it < end; ++it) { + red += qRed(*it); + green += qGreen(*it); + blue += qBlue(*it); + } + + QRgb color = qRgb(red/count, green/count, blue/count); + palette.append(color); +} diff --git a/retroshare-gui/src/util/imageutil.h b/retroshare-gui/src/util/imageutil.h index e4755f2d2..f6ed4f30a 100644 --- a/retroshare-gui/src/util/imageutil.h +++ b/retroshare-gui/src/util/imageutil.h @@ -3,6 +3,7 @@ #include #include +#include class ImageUtil { @@ -14,6 +15,9 @@ public: private: static bool checkSize(QString& embeddedImage, const QImage& img, int maxBytes = -1); + static void quantization(const QImage& img, QVector& palette); + static void quantization(QList::iterator begin, QList::iterator end, int depth, QVector& palette); + static void avgbucket(QList::iterator begin, QList::iterator end, QVector& palette); }; #endif // IMAGEUTIL_H From c17a8e7d51a51ce4c7a6b75772ce4c8871393757 Mon Sep 17 00:00:00 2001 From: hunbernd Date: Sat, 10 Jun 2017 01:43:02 +0200 Subject: [PATCH 52/58] Optimalizations --- retroshare-gui/src/util/imageutil.cpp | 73 ++++++++++++--------------- 1 file changed, 32 insertions(+), 41 deletions(-) diff --git a/retroshare-gui/src/util/imageutil.cpp b/retroshare-gui/src/util/imageutil.cpp index f36f442c1..5b5ab56d1 100644 --- a/retroshare-gui/src/util/imageutil.cpp +++ b/retroshare-gui/src/util/imageutil.cpp @@ -50,6 +50,7 @@ void ImageUtil::extractImage(QWidget *window, QTextCursor cursor) void ImageUtil::optimizeSize(QString &html, const QImage& original, QImage &optimized, int maxPixels, int maxBytes) { + //nothing to do if it fits into the limits optimized = original; if ((maxPixels <= 0) || (optimized.width()*optimized.height() <= maxPixels)) { if(checkSize(html, optimized, maxBytes)) { @@ -65,31 +66,42 @@ void ImageUtil::optimizeSize(QString &html, const QImage& original, QImage &opti if(scale > 1.0) scale = 1.0; //Half the resolution until image fits into maxBytes, or width becomes 0 + bool success = false; do { optimized = original.scaledToWidth((int)(original.width() * scale), Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8, ct); - checkSize(html, optimized, maxBytes); + success = checkSize(html, optimized, maxBytes); scale = scale / 2.0; - } while((!optimized.isNull()) && (!checkSize(html, optimized, maxBytes))); + } while((!optimized.isNull()) && !success); } bool ImageUtil::checkSize(QString &embeddedImage, const QImage &img, int maxBytes) { + RsScopeTimer st("Check size"); + //0 means no limit + if(maxBytes > 500) + maxBytes -= 500; //make place for html stuff + else if(maxBytes > 0) { + std::cerr << QString("Limit is too small nothing will fit in, limit: %1 bytes\n").arg(maxBytes).toStdString(); + return false; + } + QByteArray bytearray; QBuffer buffer(&bytearray); + bool success = false; std::cout << QString("Trying image: format PNG, size %1x%2, colors %3\n").arg(img.width()).arg(img.height()).arg(img.colorCount()).toStdString(); if (buffer.open(QIODevice::WriteOnly)) { if (img.save(&buffer, "PNG", 0)) { - QByteArray encodedByteArray = bytearray.toBase64(); - embeddedImage = ""); - if((maxBytes > 0) && (embeddedImage.size() > maxBytes)) + if((maxBytes > 0) && (bytearray.length() * 4/3 > maxBytes)) // *4/3 for base64 { - std::cout << QString("\tToo large, size: %1, limit: %2 bytes\n").arg(embeddedImage.size()).arg(maxBytes).toStdString(); + std::cout << QString("\tToo large, size: %1, limit: %2 bytes\n").arg(bytearray.length() * 4/3).arg(maxBytes).toStdString(); }else{ - std::cout << QString("\tOK, size: %1, limit: %2 bytes\n").arg(embeddedImage.size()).arg(maxBytes).toStdString(); - return true; + std::cout << QString("\tOK, size: %1, limit: %2 bytes\n").arg(bytearray.length() * 4/3).arg(maxBytes).toStdString(); + success = true; + QByteArray encodedByteArray = bytearray.toBase64(); + embeddedImage = ""); } } else { std::cerr << "ImageUtil: image can't be saved to buffer" << std::endl; @@ -99,32 +111,7 @@ bool ImageUtil::checkSize(QString &embeddedImage, const QImage &img, int maxByte } else { std::cerr << "ImageUtil: buffer can't be opened" << std::endl; } - - std::cout << QString("Trying image: format JPEG, size %1x%2, colors %3\n").arg(img.width()).arg(img.height()).arg(img.colorCount()).toStdString(); - if (buffer.open(QIODevice::WriteOnly)) { - if (img.save(&buffer, "JPEG")) { - QByteArray encodedByteArray = bytearray.toBase64(); - embeddedImage = ""); - if((maxBytes > 0) && (embeddedImage.size() > maxBytes)) - { - std::cout << QString("\tToo large, size: %1, limit: %2 bytes\n").arg(embeddedImage.size()).arg(maxBytes).toStdString(); - }else{ - std::cout << QString("\tOK, size: %1, limit: %2 bytes\n").arg(embeddedImage.size()).arg(maxBytes).toStdString(); - return true; - } - } else { - std::cerr << "ImageUtil: image can't be saved to buffer" << std::endl; - } - buffer.close(); - bytearray.clear(); - } else { - std::cerr << "ImageUtil: buffer can't be opened" << std::endl; - } - - embeddedImage.clear(); - return false; + return success; } bool redLessThan(const QRgb &c1, const QRgb &c2) @@ -146,15 +133,19 @@ bool blueLessThan(const QRgb &c1, const QRgb &c2) void ImageUtil::quantization(const QImage &img, QVector &palette) { int bits = 4; // bits/pixel + int samplesize = 100000; //only take this many color samples + RsScopeTimer st("Quantization"); QSet colors; //collect color information - for (int x = 0; x < img.width(); ++x) { - for (int y = 0; y < img.height(); ++y) { - QRgb rgb = img.pixel(x, y); - colors.insert(rgb); - } + int imgsize = img.width()*img.height(); + int width = img.width(); + samplesize = qMin(samplesize, imgsize); + double sampledist = (double)imgsize / (double)samplesize; + for (double i = 0; i < imgsize; i += sampledist) { + QRgb pixel = img.pixel((int)i % width, (int)i / width); + colors.insert(pixel); } QList colorlist = colors.toList(); From f434e6559bfe52f42c21b6299200aab7f6053029 Mon Sep 17 00:00:00 2001 From: hunbernd Date: Sun, 11 Jun 2017 00:31:20 +0200 Subject: [PATCH 53/58] Use binary search to find the right file size --- retroshare-gui/src/util/HandleRichText.cpp | 3 +- retroshare-gui/src/util/imageutil.cpp | 64 +++++++++++++++------- retroshare-gui/src/util/imageutil.h | 2 +- 3 files changed, 47 insertions(+), 22 deletions(-) diff --git a/retroshare-gui/src/util/HandleRichText.cpp b/retroshare-gui/src/util/HandleRichText.cpp index 75b3c327d..558552d19 100644 --- a/retroshare-gui/src/util/HandleRichText.cpp +++ b/retroshare-gui/src/util/HandleRichText.cpp @@ -1123,7 +1123,8 @@ bool RsHtml::makeEmbeddedImage(const QImage &originalImage, QString &embeddedIma { RsScopeTimer s("Embed image"); QImage opt; - ImageUtil::optimizeSize(embeddedImage, originalImage, opt, maxPixels, 6000); + ImageUtil::optimizeSize(embeddedImage, originalImage, opt, maxPixels, 6000-500); + // -500 bytes: keep space for html stuff } QString RsHtml::plainText(const QString &text) diff --git a/retroshare-gui/src/util/imageutil.cpp b/retroshare-gui/src/util/imageutil.cpp index 5b5ab56d1..a926f770a 100644 --- a/retroshare-gui/src/util/imageutil.cpp +++ b/retroshare-gui/src/util/imageutil.cpp @@ -53,7 +53,7 @@ void ImageUtil::optimizeSize(QString &html, const QImage& original, QImage &opti //nothing to do if it fits into the limits optimized = original; if ((maxPixels <= 0) || (optimized.width()*optimized.height() <= maxPixels)) { - if(checkSize(html, optimized, maxBytes)) { + if(checkSize(html, optimized, maxBytes) <= maxBytes) { return; } } @@ -62,43 +62,67 @@ void ImageUtil::optimizeSize(QString &html, const QImage& original, QImage &opti quantization(original, ct); //Downscale the image to fit into maxPixels - qreal scale = qSqrt((qreal)(maxPixels) / original.width() / original.height()); - if(scale > 1.0) scale = 1.0; + double whratio = (qreal)original.width() / (qreal)original.height(); + int maxwidth; + if(maxPixels > 0) + maxwidth = qSqrt((qreal)(maxPixels) * whratio); + else + maxwidth = original.width(); - //Half the resolution until image fits into maxBytes, or width becomes 0 + int minwidth = qSqrt(100.0 * whratio); + + //Use binary search to find a suitable image size + linear regression to guess the file size + double maxsize = (double)checkSize(html, original.scaledToWidth(maxwidth, Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8, ct), maxBytes); + if(maxsize <= maxBytes) return; //success + double minsize = (double)checkSize(html, original.scaledToWidth(minwidth, Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8, ct), maxBytes); + if(minsize > maxBytes) return; //impossible + +// std::cout << "maxS: " << maxsize << " minS: " << minsize << std::endl; +// std::cout << "maxW: " << maxwidth << " minW: " << minwidth << std::endl; + int region = 500; bool success = false; do { - optimized = original.scaledToWidth((int)(original.width() * scale), Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8, ct); - success = checkSize(html, optimized, maxBytes); - scale = scale / 2.0; - } while((!optimized.isNull()) && !success); + double m = (maxsize - minsize) / ((double)maxwidth * (double)maxwidth / whratio - (double)minwidth * (double)minwidth / whratio); + double b = maxsize - m * ((double)maxwidth * (double)maxwidth / whratio); + double a = ((double)(maxBytes - region/2) - b) / m; //maxBytes - region/2 target the center of the accepted region + int nextwidth = qSqrt((qreal)(a * whratio)); + double nextsize = (double)checkSize(html, original.scaledToWidth(nextwidth, Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8, ct), maxBytes); + if(nextsize <= maxBytes) { + minsize = nextsize; + minwidth = nextwidth; + if(nextsize >= (maxBytes - region)) //the file size is close anough to the limit + success = true; + } else { + maxsize = nextsize; + maxwidth = nextwidth; + } +// std::cout << "maxS: " << maxsize << " minS: " << minsize << std::endl; +// std::cout << "maxW: " << maxwidth << " minW: " << minwidth << std::endl; + } while(!success); + + //html = html.arg(original.width()); + //std::cout << html.toStdString() << std::endl; } -bool ImageUtil::checkSize(QString &embeddedImage, const QImage &img, int maxBytes) +int ImageUtil::checkSize(QString &embeddedImage, const QImage &img, int maxBytes) { RsScopeTimer st("Check size"); - //0 means no limit - if(maxBytes > 500) - maxBytes -= 500; //make place for html stuff - else if(maxBytes > 0) { - std::cerr << QString("Limit is too small nothing will fit in, limit: %1 bytes\n").arg(maxBytes).toStdString(); - return false; - } QByteArray bytearray; QBuffer buffer(&bytearray); - bool success = false; + int size = 0; std::cout << QString("Trying image: format PNG, size %1x%2, colors %3\n").arg(img.width()).arg(img.height()).arg(img.colorCount()).toStdString(); if (buffer.open(QIODevice::WriteOnly)) { if (img.save(&buffer, "PNG", 0)) { - if((maxBytes > 0) && (bytearray.length() * 4/3 > maxBytes)) // *4/3 for base64 + size = bytearray.length() * 4/3; + if((maxBytes > 0) && (size > maxBytes)) // *4/3 for base64 { std::cout << QString("\tToo large, size: %1, limit: %2 bytes\n").arg(bytearray.length() * 4/3).arg(maxBytes).toStdString(); }else{ std::cout << QString("\tOK, size: %1, limit: %2 bytes\n").arg(bytearray.length() * 4/3).arg(maxBytes).toStdString(); - success = true; QByteArray encodedByteArray = bytearray.toBase64(); + //embeddedImage = ""); @@ -111,7 +135,7 @@ bool ImageUtil::checkSize(QString &embeddedImage, const QImage &img, int maxByte } else { std::cerr << "ImageUtil: buffer can't be opened" << std::endl; } - return success; + return size; } bool redLessThan(const QRgb &c1, const QRgb &c2) diff --git a/retroshare-gui/src/util/imageutil.h b/retroshare-gui/src/util/imageutil.h index f6ed4f30a..f84142e2d 100644 --- a/retroshare-gui/src/util/imageutil.h +++ b/retroshare-gui/src/util/imageutil.h @@ -14,7 +14,7 @@ public: static void optimizeSize(QString &html, const QImage& original, QImage &optimized, int maxPixels = -1, int maxBytes = -1); private: - static bool checkSize(QString& embeddedImage, const QImage& img, int maxBytes = -1); + static int checkSize(QString& embeddedImage, const QImage& img, int maxBytes = -1); static void quantization(const QImage& img, QVector& palette); static void quantization(QList::iterator begin, QList::iterator end, int depth, QVector& palette); static void avgbucket(QList::iterator begin, QList::iterator end, QVector& palette); From b968974bc66b860122e5382f23fea48825bfb2fa Mon Sep 17 00:00:00 2001 From: RetroPooh Date: Mon, 23 Oct 2017 17:51:39 +0300 Subject: [PATCH 54/58] fix chat search button position --- retroshare-gui/src/gui/chat/ChatWidget.ui | 153 +++++++--------------- 1 file changed, 45 insertions(+), 108 deletions(-) diff --git a/retroshare-gui/src/gui/chat/ChatWidget.ui b/retroshare-gui/src/gui/chat/ChatWidget.ui index fed47f6ce..e9e1e0bfe 100644 --- a/retroshare-gui/src/gui/chat/ChatWidget.ui +++ b/retroshare-gui/src/gui/chat/ChatWidget.ui @@ -11,21 +11,12 @@ - - 0 - - - 0 - - - 0 - - - 0 - 2 + + 0 + @@ -46,16 +37,7 @@ QFrame::Raised - - 0 - - - 0 - - - 0 - - + 0 @@ -131,16 +113,7 @@ QFrame::Box - - 6 - - - 6 - - - 6 - - + 6 @@ -308,7 +281,7 @@ border-image: url(:/images/closepressed.png) 30 - + Type a message here @@ -326,16 +299,7 @@ border-image: url(:/images/closepressed.png) QFrame::Sunken - - 2 - - - 2 - - - 2 - - + 2 @@ -436,6 +400,41 @@ border-image: url(:/images/closepressed.png) + + + + + 0 + 0 + + + + Qt::NoFocus + + + Qt::CustomContextMenu + + + + :/icons/png/search.png:/icons/png/search.png + + + + 28 + 28 + + + + true + + + true + + + + + + @@ -465,9 +464,6 @@ border-image: url(:/images/closepressed.png) - - - @@ -520,38 +516,6 @@ border-image: url(:/images/closepressed.png) - - - - - 0 - 0 - - - - Qt::NoFocus - - - Qt::CustomContextMenu - - - - :/icons/png/search.png:/icons/png/search.png - - - - 28 - 28 - - - - true - - - true - - - @@ -581,16 +545,7 @@ border-image: url(:/images/closepressed.png) QFrame::Plain - - 2 - - - 2 - - - 2 - - + 2 @@ -688,16 +643,7 @@ border-image: url(:/images/closepressed.png) QFrame::Sunken - - 2 - - - 2 - - - 2 - - + 2 @@ -778,16 +724,7 @@ border-image: url(:/images/closepressed.png) QFrame::Plain - - 2 - - - 2 - - - 2 - - + 2 From 64481de74be6c15247ab6d9f9f8a86e8a5e7bc34 Mon Sep 17 00:00:00 2001 From: hunbernd Date: Mon, 23 Oct 2017 17:04:20 +0200 Subject: [PATCH 55/58] Set the proper size limits --- retroshare-gui/src/gui/chat/ChatWidget.cpp | 40 +++++++++++-------- retroshare-gui/src/gui/chat/ChatWidget.h | 2 + .../src/gui/common/MimeTextEdit.cpp | 2 +- retroshare-gui/src/gui/common/MimeTextEdit.h | 3 ++ retroshare-gui/src/util/HandleRichText.cpp | 9 ++--- retroshare-gui/src/util/HandleRichText.h | 4 +- retroshare-gui/src/util/imageutil.cpp | 28 ++++++++----- retroshare-gui/src/util/imageutil.h | 2 +- 8 files changed, 54 insertions(+), 36 deletions(-) diff --git a/retroshare-gui/src/gui/chat/ChatWidget.cpp b/retroshare-gui/src/gui/chat/ChatWidget.cpp index bc7e21de6..ba5c94af7 100644 --- a/retroshare-gui/src/gui/chat/ChatWidget.cpp +++ b/retroshare-gui/src/gui/chat/ChatWidget.cpp @@ -111,7 +111,7 @@ ChatWidget::ChatWidget(QWidget *parent) : ui->searchButton->setFixedSize(buttonSize); ui->searchButton->setIconSize(iconSize); ui->sendButton->setFixedHeight(iconHeight); - ui->sendButton->setIconSize(iconSize); + ui->sendButton->setIconSize(iconSize); //Initialize search iCharToStartSearch=Settings->getChatSearchCharToStartSearch(); @@ -295,6 +295,7 @@ void ChatWidget::init(const ChatId &chat_id, const QString &title) this->title = title; ui->titleLabel->setText(RsHtml::plainText(title)); + ui->chatTextEdit->setMaxBytes(this->maxMessageSize() - 200); RsPeerId ownId = rsPeers->getOwnId(); setName(QString::fromUtf8(rsPeers->getPeerName(ownId).c_str())); @@ -452,6 +453,25 @@ void ChatWidget::processSettings(bool load) Settings->endGroup(); } +uint32_t ChatWidget::maxMessageSize() +{ + uint32_t maxMessageSize = 0; + switch (chatType()) { + case CHATTYPE_UNKNOWN: + break; + case CHATTYPE_PRIVATE: + maxMessageSize = rsMsgs->getMaxMessageSecuritySize(RS_CHAT_TYPE_PRIVATE); + break; + case CHATTYPE_LOBBY: + maxMessageSize = rsMsgs->getMaxMessageSecuritySize(RS_CHAT_TYPE_LOBBY); + break; + case CHATTYPE_DISTANT: + maxMessageSize = rsMsgs->getMaxMessageSecuritySize(RS_CHAT_TYPE_DISTANT); + break; + } + return maxMessageSize; +} + bool ChatWidget::eventFilter(QObject *obj, QEvent *event) { if (obj == ui->textBrowser || obj == ui->textBrowser->viewport() @@ -1169,20 +1189,7 @@ void ChatWidget::updateLenOfChatTextEdit() RsHtml::optimizeHtml(chatWidget, text); std::wstring msg = text.toStdWString(); - uint32_t maxMessageSize = 0; - switch (chatType()) { - case CHATTYPE_UNKNOWN: - break; - case CHATTYPE_PRIVATE: - maxMessageSize = rsMsgs->getMaxMessageSecuritySize(RS_CHAT_TYPE_PRIVATE); - break; - case CHATTYPE_LOBBY: - maxMessageSize = rsMsgs->getMaxMessageSecuritySize(RS_CHAT_TYPE_LOBBY); - break; - case CHATTYPE_DISTANT: - maxMessageSize = rsMsgs->getMaxMessageSecuritySize(RS_CHAT_TYPE_DISTANT); - break; - } + uint32_t maxMessageSize = this->maxMessageSize(); int charRemains = 0; if (maxMessageSize > 0) { @@ -1561,7 +1568,8 @@ void ChatWidget::addExtraPicture() QString file; if (misc::getOpenFileName(window(), RshareSettings::LASTDIR_IMAGES, tr("Load Picture File"), "Pictures (*.png *.xpm *.jpg *.jpeg)", file)) { QString encodedImage; - if (RsHtml::makeEmbeddedImage(file, encodedImage, 640*480)) { + uint32_t maxMessageSize = this->maxMessageSize(); + if (RsHtml::makeEmbeddedImage(file, encodedImage, 640*480, maxMessageSize - 200)) { //-200 for the html stuff QTextDocumentFragment fragment = QTextDocumentFragment::fromHtml(encodedImage); ui->chatTextEdit->textCursor().insertFragment(fragment); } diff --git a/retroshare-gui/src/gui/chat/ChatWidget.h b/retroshare-gui/src/gui/chat/ChatWidget.h index 174b4d777..30f2e8427 100644 --- a/retroshare-gui/src/gui/chat/ChatWidget.h +++ b/retroshare-gui/src/gui/chat/ChatWidget.h @@ -198,6 +198,8 @@ private: void setColorAndFont(bool both); void processSettings(bool load); + uint32_t maxMessageSize(); + void completeNickname(bool reverse); QAbstractItemModel *modelFromPeers(); diff --git a/retroshare-gui/src/gui/common/MimeTextEdit.cpp b/retroshare-gui/src/gui/common/MimeTextEdit.cpp index e3b6d1437..3ec714f0c 100644 --- a/retroshare-gui/src/gui/common/MimeTextEdit.cpp +++ b/retroshare-gui/src/gui/common/MimeTextEdit.cpp @@ -69,7 +69,7 @@ void MimeTextEdit::insertFromMimeData(const QMimeData* source) QImage image = qvariant_cast(source->imageData()); if (image.isNull() == false) { QString encodedImage; - if (RsHtml::makeEmbeddedImage(image, encodedImage, 640*480)) { + if (RsHtml::makeEmbeddedImage(image, encodedImage, 640*480, mMaxBytes)) { QTextDocumentFragment fragment = QTextDocumentFragment::fromHtml(encodedImage); textCursor().insertFragment(fragment); return; diff --git a/retroshare-gui/src/gui/common/MimeTextEdit.h b/retroshare-gui/src/gui/common/MimeTextEdit.h index 2a6529ca1..463452bbf 100644 --- a/retroshare-gui/src/gui/common/MimeTextEdit.h +++ b/retroshare-gui/src/gui/common/MimeTextEdit.h @@ -50,6 +50,8 @@ public: QColor textColorQuote() const { return highliter->textColorQuote();} bool onlyPlainText() const {return mOnlyPlainText;} + void setMaxBytes(int limit) {mMaxBytes = limit;} + public slots: void setTextColorQuote(QColor textColorQuote) { highliter->setTextColorQuote(textColorQuote);} void setOnlyPlainText(bool bOnlyPlainText) {mOnlyPlainText = bOnlyPlainText;} @@ -83,6 +85,7 @@ private: QList mContextMenuActions; RsSyntaxHighlighter *highliter; bool mOnlyPlainText; + int mMaxBytes = -1; //limit content size, for pasting images }; #endif // MIMETEXTEDIT_H diff --git a/retroshare-gui/src/util/HandleRichText.cpp b/retroshare-gui/src/util/HandleRichText.cpp index 558552d19..27c48aacb 100644 --- a/retroshare-gui/src/util/HandleRichText.cpp +++ b/retroshare-gui/src/util/HandleRichText.cpp @@ -1107,7 +1107,7 @@ QString RsHtml::toHtml(QString text, bool realHtml) } /** Loads image and converts image to embedded image HTML fragment **/ -bool RsHtml::makeEmbeddedImage(const QString &fileName, QString &embeddedImage, const int maxPixels) +bool RsHtml::makeEmbeddedImage(const QString &fileName, QString &embeddedImage, const int maxPixels, const int maxBytes) { QImage image; @@ -1115,16 +1115,15 @@ bool RsHtml::makeEmbeddedImage(const QString &fileName, QString &embeddedImage, fprintf (stderr, "RsHtml::makeEmbeddedImage() - image \"%s\" can't be load\n", fileName.toLatin1().constData()); return false; } - return RsHtml::makeEmbeddedImage(image, embeddedImage, maxPixels); + return RsHtml::makeEmbeddedImage(image, embeddedImage, maxPixels, maxBytes); } /** Converts image to embedded image HTML fragment **/ -bool RsHtml::makeEmbeddedImage(const QImage &originalImage, QString &embeddedImage, const int maxPixels) +bool RsHtml::makeEmbeddedImage(const QImage &originalImage, QString &embeddedImage, const int maxPixels, const int maxBytes) { RsScopeTimer s("Embed image"); QImage opt; - ImageUtil::optimizeSize(embeddedImage, originalImage, opt, maxPixels, 6000-500); - // -500 bytes: keep space for html stuff + return ImageUtil::optimizeSize(embeddedImage, originalImage, opt, maxPixels, maxBytes); } QString RsHtml::plainText(const QString &text) diff --git a/retroshare-gui/src/util/HandleRichText.h b/retroshare-gui/src/util/HandleRichText.h index 54036b53c..a8f8d66ef 100644 --- a/retroshare-gui/src/util/HandleRichText.h +++ b/retroshare-gui/src/util/HandleRichText.h @@ -69,8 +69,8 @@ public: static void optimizeHtml(QString &text, unsigned int flag = 0, const QColor &backgroundColor = Qt::white, qreal desiredContrast = 1.0, int desiredMinimumFontSize = 10); static QString toHtml(QString text, bool realHtml = true); - static bool makeEmbeddedImage(const QString &fileName, QString &embeddedImage, const int maxPixels); - static bool makeEmbeddedImage(const QImage &originalImage, QString &embeddedImage, const int maxPixels); + static bool makeEmbeddedImage(const QString &fileName, QString &embeddedImage, const int maxPixels, const int maxBytes = -1); + static bool makeEmbeddedImage(const QImage &originalImage, QString &embeddedImage, const int maxPixels, const int maxBytes = -1); static QString plainText(const QString &text); static QString plainText(const std::string &text); diff --git a/retroshare-gui/src/util/imageutil.cpp b/retroshare-gui/src/util/imageutil.cpp index a926f770a..3bb7e38df 100644 --- a/retroshare-gui/src/util/imageutil.cpp +++ b/retroshare-gui/src/util/imageutil.cpp @@ -48,13 +48,13 @@ void ImageUtil::extractImage(QWidget *window, QTextCursor cursor) } } -void ImageUtil::optimizeSize(QString &html, const QImage& original, QImage &optimized, int maxPixels, int maxBytes) +bool ImageUtil::optimizeSize(QString &html, const QImage& original, QImage &optimized, int maxPixels, int maxBytes) { //nothing to do if it fits into the limits optimized = original; if ((maxPixels <= 0) || (optimized.width()*optimized.height() <= maxPixels)) { if(checkSize(html, optimized, maxBytes) <= maxBytes) { - return; + return true; } } @@ -71,11 +71,17 @@ void ImageUtil::optimizeSize(QString &html, const QImage& original, QImage &opti int minwidth = qSqrt(100.0 * whratio); + //if maxBytes not defined, do not reduce color space, just downscale + if(maxBytes <= 0) { + checkSize(html, optimized = original.scaledToWidth(maxwidth, Qt::SmoothTransformation), maxBytes); + return true; + } + //Use binary search to find a suitable image size + linear regression to guess the file size - double maxsize = (double)checkSize(html, original.scaledToWidth(maxwidth, Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8, ct), maxBytes); - if(maxsize <= maxBytes) return; //success - double minsize = (double)checkSize(html, original.scaledToWidth(minwidth, Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8, ct), maxBytes); - if(minsize > maxBytes) return; //impossible + double maxsize = (double)checkSize(html, optimized = original.scaledToWidth(maxwidth, Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8, ct), maxBytes); + if(maxsize <= maxBytes) return true; //success + double minsize = (double)checkSize(html, optimized = original.scaledToWidth(minwidth, Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8, ct), maxBytes); + if(minsize > maxBytes) return false; //impossible // std::cout << "maxS: " << maxsize << " minS: " << minsize << std::endl; // std::cout << "maxW: " << maxwidth << " minW: " << minwidth << std::endl; @@ -86,7 +92,7 @@ void ImageUtil::optimizeSize(QString &html, const QImage& original, QImage &opti double b = maxsize - m * ((double)maxwidth * (double)maxwidth / whratio); double a = ((double)(maxBytes - region/2) - b) / m; //maxBytes - region/2 target the center of the accepted region int nextwidth = qSqrt((qreal)(a * whratio)); - double nextsize = (double)checkSize(html, original.scaledToWidth(nextwidth, Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8, ct), maxBytes); + double nextsize = (double)checkSize(html, optimized = original.scaledToWidth(nextwidth, Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8, ct), maxBytes); if(nextsize <= maxBytes) { minsize = nextsize; minwidth = nextwidth; @@ -99,7 +105,7 @@ void ImageUtil::optimizeSize(QString &html, const QImage& original, QImage &opti // std::cout << "maxS: " << maxsize << " minS: " << minsize << std::endl; // std::cout << "maxW: " << maxwidth << " minW: " << minwidth << std::endl; } while(!success); - + return true; //html = html.arg(original.width()); //std::cout << html.toStdString() << std::endl; } @@ -112,15 +118,15 @@ int ImageUtil::checkSize(QString &embeddedImage, const QImage &img, int maxBytes QBuffer buffer(&bytearray); int size = 0; - std::cout << QString("Trying image: format PNG, size %1x%2, colors %3\n").arg(img.width()).arg(img.height()).arg(img.colorCount()).toStdString(); + //std::cout << QString("Trying image: format PNG, size %1x%2, colors %3\n").arg(img.width()).arg(img.height()).arg(img.colorCount()).toStdString(); if (buffer.open(QIODevice::WriteOnly)) { if (img.save(&buffer, "PNG", 0)) { size = bytearray.length() * 4/3; if((maxBytes > 0) && (size > maxBytes)) // *4/3 for base64 { - std::cout << QString("\tToo large, size: %1, limit: %2 bytes\n").arg(bytearray.length() * 4/3).arg(maxBytes).toStdString(); + //std::cout << QString("\tToo large, size: %1, limit: %2 bytes\n").arg(bytearray.length() * 4/3).arg(maxBytes).toStdString(); }else{ - std::cout << QString("\tOK, size: %1, limit: %2 bytes\n").arg(bytearray.length() * 4/3).arg(maxBytes).toStdString(); + //std::cout << QString("\tOK, size: %1, limit: %2 bytes\n").arg(bytearray.length() * 4/3).arg(maxBytes).toStdString(); QByteArray encodedByteArray = bytearray.toBase64(); //embeddedImage = " Date: Mon, 23 Oct 2017 20:01:35 +0300 Subject: [PATCH 56/58] fix checkboxes state for already accepted/signed keys on add friend dialog --- .../src/gui/connect/ConnectFriendWizard.cpp | 32 +++++-------------- 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp index ad6c93a1e..0eb83b5fc 100755 --- a/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp +++ b/retroshare-gui/src/gui/connect/ConnectFriendWizard.cpp @@ -475,33 +475,17 @@ void ConnectFriendWizard::initializePage(int id) else ui->addKeyToKeyring_CB->setToolTip(tr("Check this to add the key to your keyring\nThis might be useful for sending\ndistant messages to this peer\neven if you don't make friends.")) ; - //set the radio button to sign the GPG key - if (peerDetails.accept_connection && !peerDetails.ownsign) { - //gpg key connection is already accepted, don't propose to accept it again - ui->signGPGCheckBox->setChecked(false); - ui->acceptNoSignGPGCheckBox->hide(); - ui->acceptNoSignGPGCheckBox->setChecked(false); - } - if (!peerDetails.accept_connection && peerDetails.ownsign) { - //gpg key is already signed, don't propose to sign it again + if(tmp_det.accept_connection) { ui->acceptNoSignGPGCheckBox->setChecked(true); - ui->signGPGCheckBox->hide(); - ui->signGPGCheckBox->setChecked(false); + ui->acceptNoSignGPGCheckBox->setEnabled(false); + ui->acceptNoSignGPGCheckBox->setToolTip(tr("This key is already on your trusted list")); } - if (!peerDetails.accept_connection && !peerDetails.ownsign) { - ui->acceptNoSignGPGCheckBox->setChecked(true); - ui->signGPGCheckBox->show(); - ui->signGPGCheckBox->setChecked(false); - ui->acceptNoSignGPGCheckBox->show(); - } - if (peerDetails.accept_connection && peerDetails.ownsign) { - ui->acceptNoSignGPGCheckBox->setChecked(false); - ui->acceptNoSignGPGCheckBox->hide(); - ui->signGPGCheckBox->setChecked(false); - ui->signGPGCheckBox->hide(); - ui->alreadyRegisteredLabel->show(); - } else { + else ui->alreadyRegisteredLabel->hide(); + if(tmp_det.ownsign) { + ui->signGPGCheckBox->setChecked(true); + ui->signGPGCheckBox->setEnabled(false); + ui->signGPGCheckBox->setToolTip(tr("You have already signed this key")); } QString trustString; From 603ea7e96eed7582221db4bdc27bf0abe94bb06f Mon Sep 17 00:00:00 2001 From: csoler Date: Mon, 23 Oct 2017 22:12:52 +0200 Subject: [PATCH 57/58] removed debug info from RsCollection --- retroshare-gui/src/gui/common/RsCollection.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/common/RsCollection.cpp b/retroshare-gui/src/gui/common/RsCollection.cpp index 14f522531..f92598137 100644 --- a/retroshare-gui/src/gui/common/RsCollection.cpp +++ b/retroshare-gui/src/gui/common/RsCollection.cpp @@ -36,6 +36,8 @@ #include #include +// #define COLLECTION_DEBUG 1 + const QString RsCollection::ExtensionString = QString("rscollection") ; RsCollection::RsCollection(QObject *parent) @@ -116,14 +118,17 @@ void RsCollection::merge_in(const FileTree& tree) void RsCollection::recursCollectColFileInfos(const QDomElement& e,std::vector& colFileInfos,const QString& current_path, bool bad_chars_in_parent) const { QDomNode n = e.firstChild() ; - +#ifdef COLLECTION_DEBUG std::cerr << "Parsing element " << e.tagName().toStdString() << std::endl; +#endif while(!n.isNull()) { QDomElement ee = n.toElement(); // try to convert the node to an element. +#ifdef COLLECTION_DEBUG std::cerr << " Seeing child " << ee.tagName().toStdString() << std::endl; +#endif if(ee.tagName() == QString("File")) { From cd5eb5cb777a19287aac506c1d4ccf388e6a794a Mon Sep 17 00:00:00 2001 From: hunbernd Date: Tue, 24 Oct 2017 18:23:22 +0200 Subject: [PATCH 58/58] Got rid of QMath --- retroshare-gui/src/util/imageutil.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/retroshare-gui/src/util/imageutil.cpp b/retroshare-gui/src/util/imageutil.cpp index 3bb7e38df..c0cc2cde4 100644 --- a/retroshare-gui/src/util/imageutil.cpp +++ b/retroshare-gui/src/util/imageutil.cpp @@ -11,8 +11,8 @@ #include #include #include -#include #include +#include #include ImageUtil::ImageUtil() {} @@ -65,11 +65,11 @@ bool ImageUtil::optimizeSize(QString &html, const QImage& original, QImage &opti double whratio = (qreal)original.width() / (qreal)original.height(); int maxwidth; if(maxPixels > 0) - maxwidth = qSqrt((qreal)(maxPixels) * whratio); + maxwidth = (int)sqrt((double)(maxPixels) * whratio); else maxwidth = original.width(); - int minwidth = qSqrt(100.0 * whratio); + int minwidth = (int)sqrt(100.0 * whratio); //if maxBytes not defined, do not reduce color space, just downscale if(maxBytes <= 0) { @@ -91,7 +91,7 @@ bool ImageUtil::optimizeSize(QString &html, const QImage& original, QImage &opti double m = (maxsize - minsize) / ((double)maxwidth * (double)maxwidth / whratio - (double)minwidth * (double)minwidth / whratio); double b = maxsize - m * ((double)maxwidth * (double)maxwidth / whratio); double a = ((double)(maxBytes - region/2) - b) / m; //maxBytes - region/2 target the center of the accepted region - int nextwidth = qSqrt((qreal)(a * whratio)); + int nextwidth = (int)sqrt(a * whratio); double nextsize = (double)checkSize(html, optimized = original.scaledToWidth(nextwidth, Qt::SmoothTransformation).convertToFormat(QImage::Format_Indexed8, ct), maxBytes); if(nextsize <= maxBytes) { minsize = nextsize;