updated branch to upstream/master

This commit is contained in:
csoler 2015-09-06 17:37:13 -04:00
commit a1ce7f2d6f
273 changed files with 7386 additions and 14262 deletions

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
/RetroShare.pro.user
*.o
moc_*.cpp
qrc_*.cpp
ui_*.h
Makefile.*
*~
Thumbs.db

69
.travis.yml Normal file
View File

@ -0,0 +1,69 @@
language: cpp
compiler:
- gcc
before_install:
- echo $LANG
- echo $LC_ALL
- sudo apt-get update
- sudo apt-get install build-essential checkinstall cmake g++ git libavcodec-dev libavformat-dev libbz2-dev libcurl4-openssl-dev libdc1394-22-dev libglib2.0-dev libcv-dev libopencv-highgui-dev libhighgui-dev
- sudo apt-get install libgnome-keyring-dev libgstreamer-plugins-base0.10-dev libgstreamer0.10-dev libjasper-dev libjpeg-dev libmicrohttpd-dev libopencv-dev libprotobuf-dev libqt4-dev
- sudo apt-get install libspeex-dev libspeexdsp-dev libsqlite3-dev libssl-dev libswscale-dev
- sudo apt-get install libtbb-dev libtiff4-dev libupnp-dev libv4l-dev libxine-dev libxslt1-dev libxss-dev make pkg-config protobuf-compiler python-dev python-numpy subversion git yasm qtmobility-dev
# - if [ $TRAVIS_OS_NAME == linux ]; then sudo apt-get update && sudo apt-get install -y llvm-3.4 llvm-3.4-dev; fi
# - rvm use $RVM --install --binary --fuzzy
# - gem update --system
# - gem --version
env:
global:
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
# via the "travis encrypt" command using the project repo's public key
- secure: "auwuhxelaMriNaXzT8I03xrh1s+STicNyNToOWFCAYKxkWWQ4WeaCO6kRDmQrejhizMUILGU+s4FrWTEhDsviftGAF86EgzxxbSBfsHHAP4t2C0pcXX8/WxEoh1IrUs7iGCIpl7O2cvWqGidc20ROeptSEd1uQgkHnn14D9A2YmXf8g52PzqivKkb6HKfkVTPdmNJkMBT5eDtEw6DIk+DvnvRo6b6uanvVAKS9CBwXOdA3rLzaD9bz0LrdL9X1CNoTkGROyez0Lsc4zTr70id2Xfp1MMmJAV6hgQy+iwE37wRyrxJf3dkh5SUAAMUC9Xnvh/iBKNQKdQGhj2WGcV7GZV9k6u9DA1w2H0kcrwt9KHUXdhEQ67yr6Boa9ZFwdDb5VIOtC6iHAoDZXharHhiuxi0K/bCtwNAajrMjBCm9mWhEKvtoxUUYxAJajhJkkO3ERaOU3zHE+06esDzGozd2YOEH8a74HhYy4xvhR05Yj00hAWLS2kIaUITiqmBf6Yuh5XwH7KCDcapxF59ROWqyicdwtbfWpvN8IvFuGKyxYuEfoT8WxZ4lZpo4Q9CrTB7gedJYJxYNfZE/okWoFBb4cpPI94PHo3DZPR7lVyQ60RNyeR0nOeqf8NW8cBT1G4jw3u1LEyAdyvup+54aALw0DCVyoDojSXB8s+AlQG2JE="
addons:
coverity_scan:
project:
name: "RetroShare/RetroShare"
description: "RetroShare Build submitted via Travis CI"
build_command_prepend: "qmake CONFIG+=NO_SQLCIPHER; make clean"
build_command: "make -j 4"
branch_pattern: coverity_scan
before_script:
- qmake CONFIG+=NO_SQLCIPHER
#script: make
script: if [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then make ; fi
#after_success:
# - if [ $TRAVIS_BRANCH == $TRAVIS_TAG ]; then rake deploy; fi
#branches:
# only:
# - master
# - travis
notifications:
email: false
irc:
channels:
- "chat.freenode.net#retroshare"
template:
- "%{repository}/%{branch} (%{commit} - %{author}): %{build_url}: %{message}"
- "Message: %{commit_message}"
- "Commit details: %{compare_url}"
# webhooks:
# urls:
# - https://webhooks.gitter.im/e/9502afd22ca6c8e85fb3
# on_success: change
# on_failure: always
# on_start: always
#env:
# - RVM=2.0.0 LANG="en_US.UTF-8"
os:
- linux

120
README.md Normal file
View File

@ -0,0 +1,120 @@
RetroShare
==============================
RetroShare is a decentralized, private and secure commmunication and sharing platform. RetroShare provides filesharing, chat, messages, forums and channels.
Compilation on Linux
----------------------------
1. Install package dependencies:
* Debian/Ubuntu
```bash
sudo apt-get install libglib2.0-dev libupnp-dev qt4-dev-tools \
libqt4-dev libssl-dev libxss-dev libgnome-keyring-dev libbz2-dev \
libqt4-opengl-dev libqtmultimediakit1 qtmobility-dev \
libspeex-dev libspeexdsp-dev libxslt1-dev libcurl4-openssl-dev \
libopencv-dev tcl8.5 libmicrohttpd-dev
```
* openSUSE
```bash
sudo zypper install gcc-c++ libqt4-devel libgnome-keyring-devel \
glib2-devel speex-devel libssh-devel protobuf-devel libcurl-devel \
libxml2-devel libxslt-devel sqlcipher-devel libmicrohttpd-devel \
opencv-devel speexdsp-devel libupnp-devel
```
* Arch Linux
```bash
pacman -S base-devel libgnome-keyring libmicrohttpd libupnp libxslt \
libxss opencv qt4 speex sqlcipher
```
2. Checkout the source code
```bash
mkdir ~/retroshare
cd ~/retroshare
git clone https://github.com/RetroShare/RetroShare.git trunk
```
3. Compile
```bash
cd trunk
qmake CONFIG+=debug
make
```
4. Install
```bash
sudo make install
```
The executables produced will be:
/usr/bin/RetroShare06
/usr/bin/RetroShare06-nogui
Compile only retroshare-nogui
-----------------------------
If you want to run RetroShare on a server and dont need the gui and plugins,
you can run the following commands to only compile/install the nogui version:
```bash
qmake
make retroshare-nogui
sudo make retroshare-nogui-install_subtargets
```
For packagers
-------------
Packagers can use PREFIX and LIB\_DIR to customize the installation paths:
```bash
qmake PREFIX=/usr LIB_DIR=/usr/lib64 "CONFIG-=debug" "CONFIG+=release"
make
make INSTALL_ROOT=${PKGDIR} install
```
If libsqlcipher is not available as a package
---------------------------------------------
You need to place sqlcipher so that the hierarchy is:
retroshare
|
+--- trunk
|
+--- lib
|
+---- sqlcipher
```bash
mkdir lib
cd lib
git clone git://github.com/sqlcipher/sqlcipher.git
cd sqlcipher
./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"
make
cd ..
```
Using retroshare-nogui & webUI
------------------------------
The webUI needs to be enabled as a parameter option in retroshare-nogui:
```bash
./retroshare-nogui --webinterface 9090 --docroot /usr/share/RetroShare06/webui/
```
The webUI is only accessible on localhost:9090 (unless you canged that
option in the GUI). It is advised to keep it that way so that your RS
cannot be controlled using an untrusted connection.
To access your web UI from a distance, just open a SSH tunnel on it:
```bash
distant_machine:~/ > ssh rs_host -L 9090:localhost:9090 -N
```
"rs_host" is the machine running retroshare-nogui. Then on the distant machine, access your webUI on
http://localhost:9090
That also works with a retroshare GUI of course.

View File

@ -1,67 +0,0 @@
To compile:
- install the package dependencies. On ubuntu:
# sudo apt-get install libglib2.0-dev libupnp-dev qt4-dev-tools \
libqt4-dev libssl-dev libxss-dev libgnome-keyring-dev libbz2-dev \
libqt4-opengl-dev libqtmultimediakit1 qtmobility-dev \
libspeex-dev libspeexdsp-dev libxslt1-dev libprotobuf-dev \
protobuf-compiler cmake libcurl4-openssl-dev
- create project directory (e.g. ~/retroshare) and check out the source code
# mkdir ~/retroshare
# cd ~/retroshare && svn co svn://svn.code.sf.net/p/retroshare/code/trunk trunk
- create a new directory named lib
# mkdir lib
- get source code for libssh-0.5.4, unzip it, and create build directory (if needed)
# cd lib
# wget http://git.libssh.org/projects/libssh.git/snapshot/libssh-libssh-0.6.4.zip
# tar zxvf libssh-0.6.4.tar.gz
# cd libssh-0.6.4
# mkdir build
# cd build
# cmake -DWITH_STATIC_LIB=ON -DWITH_GSSAPI=OFF ..
# make
# cd ../../..
- get source code for sqlcipher, and build it (only needed for GXS)
# cd lib
# git clone git://github.com/sqlcipher/sqlcipher.git
# cd sqlcipher
# ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" \
LDFLAGS="-lcrypto"
# make
# cd ..
- go to your svn base directory
# cd trunk
# qmake CONFIG=release
# make -j 4
=> the executable produced will be
trunk/retroshare-gui/src/Retroshare
trunk/retroshare-nogui/src/retroshare-nogui
- to use the SSH RS server (nogui):
# ssh-keygen -t rsa -f rs_ssh_host_rsa_key # this makes a RSA
# ./retroshare-nogui -G # generates a login+passwd hash for the RSA key used.
# ./retroshare-nogui -S 7022 -U[SSLid] -P [Passwd hash]
- to connect from a remote place to the server by SSH:
# ssh -T -p 7022 [user]@[host]
and use the command line interface to control your RS instance.
List of non backward compatible changes for V0.6:
================================================
- in rscertificate.cc, enable V_06_USE_CHECKSUM
- in p3charservice, remove all usage of _deprecated items
- turn file transfer into a service. Will break item IDs, but cleanup and
simplify lots of code.

View File

@ -1,13 +1,37 @@
!include("retroshare.pri"): error("Could not include file retroshare.pri")
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += \
openpgpsdk/src/openpgpsdk.pro \
supportlibs/pegmarkdown/pegmarkdown.pro \
libbitdht/src/libbitdht.pro \
libretroshare/src/libretroshare.pro \
libresapi/src/libresapi.pro \
retroshare-gui/src/retroshare-gui.pro \
retroshare-nogui/src/retroshare-nogui.pro \
plugins/plugins.pro
openpgpsdk \
libbitdht \
libretroshare \
libresapi \
pegmarkdown \
retroshare_gui \
retroshare_nogui \
plugins
openpgpsdk.file = openpgpsdk/src/openpgpsdk.pro
libbitdht.file = libbitdht/src/libbitdht.pro
libretroshare.file = libretroshare/src/libretroshare.pro
libretroshare.depends = openpgpsdk libbitdht
libresapi.file = libresapi/src/libresapi.pro
libresapi.depends = libretroshare
pegmarkdown.file = supportlibs/pegmarkdown/pegmarkdown.pro
retroshare_gui.file = retroshare-gui/src/retroshare-gui.pro
retroshare_gui.depends = libretroshare libresapi pegmarkdown
retroshare_gui.target = retroshare-gui
retroshare_nogui.file = retroshare-nogui/src/retroshare-nogui.pro
retroshare_nogui.depends = libretroshare libresapi
retroshare_nogui.target = retroshare-nogui
plugins.file = plugins/plugins.pro
plugins.depends = retroshare_gui
plugins.target = plugins

View File

@ -63,7 +63,7 @@ GUI
0013 [ ] new design, new icons, minimal UI (from purplehaze420) comment: use webui as base for minimal ui
cyril: we cannot change everything now. But purplehaze420 said he would provide a consistent set of icons. That would be great.
0014 [ ] go to Settings -> Permissions: wait for scrollbars to appear go back to any other setting (e.g. Notify): the page now
0014 [X] go to Settings -> Permissions: wait for scrollbars to appear go back to any other setting (e.g. Notify): the page now
needs the same space as the permission matrix (happens on windows + linux; can be "fixed" by closing and reopen the setting window)
(from sehraf)

View File

@ -1,10 +1,8 @@
set QTDIR=C:\Qt\4.8.6
set MINGW=C:\MinGW
set GIT=C:\Program Files\Git
set PATH=%QTDIR%\bin;%MINGW%\bin;%PATH%
"C:\Program Files\TortoiseSVN\bin\SubWCRev" . libretroshare\src\retroshare\rsversion.in libretroshare\src\retroshare\rsversion.h
"C:\Program Files\TortoiseSVN\bin\SubWCRev" . retroshare-gui\src\retroshare.in retroshare-gui\src\retroshare.nsi
set PATH=%QTDIR%\bin;%MINGW%\bin;%GIT%\bin;%PATH%
@echo off
@ -65,12 +63,19 @@ qmake openpgpsdk.pro
mingw32-make
cd ..\..\libresapi\src
if not %clean%x==x mingw32-make clean
qmake libresapi.pro
mingw32-make %%a
cd ..\..\libretroshare\src
if not %clean%x==x mingw32-make clean
qmake libretroshare.pro
qmake libretroshare.pro "CONFIG+=version_detail_bash_script"
mingw32-make %%a
@ -97,7 +102,7 @@ cd ..\..\retroshare-gui\src
if not %clean%x==x mingw32-make clean
qmake retroshare-gui.pro
qmake retroshare-gui.pro "CONFIG+=version_detail_bash_script"
mingw32-make %%a

View File

@ -1,4 +1,232 @@
retroshare06 (0.6.0-0.XXXXXX~YYYYYY) YYYYYY; urgency=low
retroshare06 (0.6.0-1.XXXXXX~YYYYYY) YYYYYY; urgency=low
a276986 ( ) Merge pull request #60 from PhenomRetroShare/Fix_AllowChatTextFormatOption
88a6931 (GUI ) Allow Chat Text Format Option working.
0b5b20d ( ) Merge pull request #59 from AsamK/qmake_improvements
0409dd8 ( ) Merge pull request #58 from AsamK/debian_make_install
21e99cf (Packaging ) Use explicit dependencies instead of CONFIG += ordered
f002310 (Packaging ) Remove libpegmarkdown from win32 retroshare-nogui build
2337b46 (Packaging ) Specify plugins as plugins to qmake
ecb5d93 (GUI ) changed default color for the system chat bubble
d51b4b2 (Packaging ) Adapt debian/ubuntu package files to use "make install"
c07bef3 (GUI ) Fixed Create Lobby Dialog's window size
a45de1d (Chat ) Merge pull request #57 from csoler/v0.6-SignedLobbies
40bffc3 (Chat ) fixed last GUI bugs for authed lobbies
6d01461 (Chat ) fixed a few GUI bits for non anonymous chat lobbies
627dcc0 (Forums ) Merge pull request #50 from chozabu/forum_additions
7270ba9 (Chat ) Merge pull request #56 from AsamK/distant_chat_history
5dad168 (Chat ) Implement history for distant chat
d7531b3 ( ) Merge pull request #54 from cavebeat/coverity
9240512 ( ) Merge pull request #55 from AsamK/install_stylesheets
622e942 (GUI ) Remove Thumbs.db files and add to .gitignore
699213a (Packaging ) Load chat styles also from DATA_DIR/stylesheets
66ba687 (Packaging ) Install qss and chat styles
4d7f92e (GXS/NXS ) Removed unnecessary select of groups in RsGxsNetService::locked_genReqGrpTransaction.
753846b (GXS/SQL ) Added count of requests and results to debug output in RsDataService::retrieveGxsGrpMetaData
d118a13 (GXS/NXS ) Fixed adding of empty group id to notify when removing a group.
4cc1df3 (GXS/NXS ) Ignore updates of not existing groups in RsGenExchange::processGrpMask. Solves: "Error code: no such column: su
d8aa712 (Packaging ) travis/coverity tokens updated
6e1a8fa ( ) Merge pull request #21 from AsamK/lobby_history
040b4fb (Chat ) implemented gp-authed lobbies. Still needs some GUI
b8459b3 ( ) Merge pull request #44 from AsamK/improve_qmake
c622ca0 (Packaging ) Issue compile error if DATA_DIR is not set
ef499cd ( ) Merge pull request #46 from PhenomRetroShare/Fix_ChatWidgetSearchTextThreshold
668394d ( ) Merge pull request #47 from PhenomRetroShare/AddHTML_TextOptimization_0.6
6ba2f68 ( ) Merge pull request #45 from PhenomRetroShare/Fix_ChatWidgetLastCursorFormatting
1736ad8 ( ) Merge pull request #11 from cavebeat/coverity_scan
a39663d ( ) Merge branch 'master' of https://github.com/RetroShare/RetroShare
17af892 (GUI ) set a default minimum column header size for comments.
c29ae55 (Code cleaning ) Merge pull request #38 from cavebeat/rm_linkscloud
1a1a2aa (GXS/NXS ) Lowered update of server sync TS from 10 seconds to 60 seconds.
641a433 (GUI ) Fixed filter in FriendList.
217c9b9 ( ) Merge branch 'master' of https://github.com/RetroShare/RetroShare
9d65b08 (GUI ) set default background color for system messages at private chat window
da66ac5 (GXS ) GxsGroupFrameDialog: Fixed restore of active group tree item when subscrube/unsubscribe a group.
185220b (GUI ) enable customisation of columns in forum thread widget
389f2f0 (GXS/SQL ) Removed delete of message files in RsDataService::resetDataStore.
836b866 ( ) Merge pull request #37 from sehraf/pr-friendlist_import_export-V2
5aaf3e6 (Packaging ) Move data dir from build_scripts/ to root and adapt RedHat build files
4dbffe0 ( ) Merge pull request #48 from PhenomRetroShare/AddRetroShareLinkOpenFileWhenExists
5c67941 ( ) Update README.md
5ae5d76 (Packaging ) Make file names consistent with packaging
91e19fc (Packaging ) Disable installing of headers and libretroshare.a
d4a36ed (Packaging ) Make data and plugin directory configurable at compile time
6b7a6e2 (Packaging ) Make RS installable with "make install"
fa54fce ( ) Merge pull request #49 from heini/redhat_build
1fcae61 (GXS/SQL ) Removed static defines for column numbers in RsDataService and replaced it with members. Initialized members wh
531ce34 ( ) Merge branch 'master' into AddRetroShareLinkOpenFileWhenExists
860292d ( ) Merge branch 'master' into AddHTML_TextOptimization_0.6
70b9c45 ( ) Merge branch 'master' into Fix_ChatWidgetSearchTextThreshold
79fb8df ( ) Merge branch 'master' into Fix_ChatWidgetLastCursorFormatting
e9aa4ff ( ) Merge pull request #3 from chozabu/copy_version_info_button
d1deef0 (GUI ) fixed new lines in certificate string
7bd41e9 ( ) Merge pull request #4 from chozabu/grouter_stats_basic_names
7fe46ed (Packaging ) Provide RedHat family packaging script.
f30ed24 (GXS/SQL ) Moved gxs data from files into database - Added update to RsDataService - Added new table "DATABASE_RELEASE" to
b1aae2d ( ) Merge branch 'master' into AddRetroShareLinkOpenFileWhenExists
0234734 (GUI ) When the file in the link already exists, RS open it.
791fb78 (GUI ) renaming details and details2 for better clarification
ad499e6 (GUI ) renamed 'pubkey' to 'certificate' and removed empty location names
6893c58 ( ) Merge pull request #42 from cavebeat/comma
c66de1c (Packaging ) fixed comma in README for debian
f58e347 ( ) Merge pull request #23 from AsamK/patch-1
326a330 (GUI ) Fix ChatWidget last cursor formatting. To test it, search a text that will be colored a end. New messages lose
c44afc0 ( ) Merge branch 'master' into Fix_ChatWidgetSearchTextThreshold
b1fd290 ( ) Merge branch 'master' into AddHTML_TextOptimization_0.6
eb4313f ( ) merge before commit
58d29c3 (Bug fix ) fixed error message in pqissl::cansend()
5c97010 (GUI ) Fix ChatWidget search text label threshold.
5a32cca (Packaging ) README: Fix executable name
339558f (Packaging ) Update and rename README.txt to README.md
6ac107a (GXS/SQL ) Added method "tableExist" to RetroDb.
3665238 (GXS/SQL ) Added new methods for transaction to RetroDb.
4309642 ( ) merging before commit
58c70ca ( ) moved [not] operator inside parenthesis. Does not change anything except improving readability
dea7c77 (Global router ) fixed missing removal of deleted data causing a crash when large messages cause an error in Global Router
334ddf8 (GUI ) Enabled sort by columns other than name combined with sort by state in FriendList.
176c3ab (GUI ) FriendSelectionWidget: - Added sort by state - Moved buttons "All"/"None" into context menu
4923c47 (GUI ) RSTreeWidget: - Added possibility to add own actions to header context menu - Added resort of items
02775c6 (GUI ) Add HTML Text Optimization by exporting styles.
1d9e398 (Code cleaning ) removed LinksCloud LinksCloud has been replaced by Posted and is hosted for archiving reasons in https://github
04a1c10 (GUI ) fixed UTF-8 group names
941959c (GUI ) conversion from QSettings to XML
48c3eed (Packaging ) Removed "CONFIG += console" for Windows release build.
3b40f0e (GUI ) FriendList: - Show information of the "best" ssl item on the gpg item only when the gpg item is not expanded. -
42bbf76 (GUI ) fixed display of software revision in main window (patch from ASmith)
80d765e (GUI ) small fix
3634981 (GUI ) added import/export friendlist
4d7f733 (Packaging ) fixed bug in git parameter in packaging script
9734f32 (Packaging ) updated ubuntu changelog. improved ubuntu packaging script
-- Cyril Soler <csoler@users.sourceforge.net> Sun, 16 Aug 2015 20:00:00 +0100
retroshare06 (0.6.0-1.20150816~9734f32a) trusty; urgency=low
f6b830d (branch merging) Merge pull request #35 from hunbernd/chat-fix
16859a1 (GUI ) Fix: chatlobby toaster not working
2e08dde (Bug fix ) additional check for pqissl::sockfd before using it (patch from Jenster)
384e7ba (GXS ) Reworked processing of requests in RsGxsDataAccess to prevent freezes of the gui.
4a50a62 (Git management) Merge branch 'master' of https://github.com/RetroShare/RetroShare
6eccd57 (Git management) merging before commit
3084d2a (Debug info ) improved security message in console for whitelisted peers
0402e53 (GUI ) Fix: empty line duplication bug
4095d9d (GXS ) Switched retrieve of posts in GxsMessageFramePostWidget from "requestMsgRelatedInfo" to "requestMsgInfo".
b1101ed (GXS ) Prevent selecting data from the database in RsGxsNetService::syncWithPeers without online friends.
3731617 (Debug info ) Fixed typo in debug output.
e667071 (GUI ) Moved IP Filter Widgets into Tabs
caa97cc (GXS ) Added database name to the debug output in RsDataService.
2a6b623 (GXS ) Added extended debug outputs of times in RsDataService.
7472f81 (Git management) Merge branch 'master' of https://github.com/RetroShare/RetroShare
9d291aa (GUI ) update windows build scripts changed gxs id icon for linked with profile.
a765016 (GUI ) Moved column show/hide from context menu of the tree to the context menu of the header in IdDialog.
e73e68d (GUI ) Reduced the size of the status icon on the avatar image in FriendList.
442ec23 (GXS ) Added index in database for column grpId in table MESSAGES.
b8edb75 (GXS ) Optimized SELECT creation in RetroDb::sqlQuery
ab538c6 (GXS ) Avoid error messages "table already exists" in RsDataService::initialise by using "IF NOT EXISTS"
783465b (GUI ) forget to commit this, for the Search Filter DHT IPs
13e77fb (Bugs ) Merge pull request #19 from sehraf/pr-fix_crash_on_shutdown
9d0b066 (Bugs ) Fixed hide offline friends in ServicePermissionsPage
c919786 (GUI ) Fixed typo. Updated english translation.
d5c95c4 (GUI ) Fixed layout of the ServicePermissionsPage
9265145 (GUI ) Updated english translation
87f2e6d (GUI ) FriendList: - Removed avatar column, state column. Added combined avatar and status icon
ec67ee0 (VOIP ) added graph display of instantly required bandwidth for VOIP, in preparation to chosing new
video codec. GUI layout
d5c33f5 (Packaging ) fixed windows build script
c168765 (GUI ) Added tab for the DHT TreeWidgets for better view Added a search Filter for DHT IP addresses
48bb8b4 (Git management) sequel to 6b2ed2fb2d84d7e48b15fa917aa4eb8015922d15
fabc3a3 (Git management) added some rules to .gitignore
168eb45 (Debug info ) removed debug info about missing keys; added debug info about deserialization checking of string
311358b (Git management) merged changes from master
a87adb8 (Debug info ) improved README file
51ab1fc (Debug info ) updated readme file
43db562 (Packaging ) Fixed build script for Windows installer
789df68 (Packaging ) Added update of version information for Windows build - Added template file version.html.in - Removed RS_BUILD_NUM
1412dc6 (Packaging ) Removed utopic, added new ppa name
-- Cyril Soler <csoler@users.sourceforge.net> Sun, 16 Aug 2015 20:00:00 +0100
retroshare06 (0.6.0-1.20150802.34ec6dfd~precise) precise; urgency=low
GUI
- improved filtering method against lol bombs. Thx to ConcernedCitizen for pointing this out
- fix #21 typo "defaut" instead of "default" in switch statement in RSGraphWidget (patch from Chozabu)
- moved all bw graph files in statistics. Removed outqueue info widget. Created new cpp files to host the bw graph code.
Started minimal UI to display bw information. The goal is t
- fixed position of scaled/highlighted nodes in node graph (patch from Chozabu)
- fixed a few bugs in statistics GUI. Still misses names and proper curve display
- Enabled Messenger Window in system tray icon.
- Fixed overlay icon (star) for tray icon.
- fixed up various places in the GUI for high DPI screens (new icons and icon qrc file generation script, font-size based widgets, etc)
- disable update of group messages for IdService since it is unused and takes some bandwidth
- fixed typo in server page "127.0.01"
- Added stylesheet to plugins.
- Moved fix font from GenCertDialog to qss (Modified patch from Henry). Added defaults to ui without style sheet
- Fixed typo in string (Patch from Henry).
- Added customize of columns to RSTreeWidget.
- added back functionality to choose DL directory for each channel
- Removed generate of channel messages.
- FriendList: - Added customize of columns with RSTreeWidget. - Reduced display menu.
- Optimized fill of forums when modifying the read state.
- Fixed compile with Qt 5
- Added disable/enable of GxsIdDetails process. Disabled GxsIdDetails process when filling gxs id's in forums.
- Optimized load of forums by moving the avatar handling for the tooltip to the tooltip creation.
added correct image file for finished transfers
- added correct image file for finished transfers
Backend / Coverity bug fixes
- removed old function entry to collect outqueue stats.
- removed unused method for OutQueue statistics; improved BW curve display; fixed a few display bugs
- Added missing initialization in - pqissl - pqissludp - PeerConnectStateBox - RsTlvBanListEntry - RsServer
TcpStream - PGPCertificateInfo - peerConnectAddress - AudioInputConfig
- Fixed usage of member _thread_id in RsMutex
- Removed unused member from ProfileManager.
- Added missing restore of ostream format (std::dec) in rschatitems.cc.
- Added missing restore of ostream format (std::dec) in CreateLobbyDialog::createLobby.
- Fixed crash in ChatMsgItem::removeItem when "mParent == NULL".
- Added missing restore of ostream format (std::dec) in p3ServiceServer::sendItem.
- Fixed crash in ChatLobbyUserNotify::subMenuClicked when using "Remove All" of the chat lobby notifier.
- Fixed possible crash in DetailsDialog::setFileHash by checking return value of dynamic_cast.
- Fixed possible crash in ftServer::receiveTurtleData by checking return value of dynamic_cast.
- Fixed possible crash in ftServer::handleIncoming by checking return value of dynamic_cast.
- Fixed possible crash in ServiceControlSerialiser by checking return value of dynamic_cast.
- Fixed possible crash in RsFileTransferSerialiser by checking return value of dynamic_cast.
- Fixed possible crash in ChatLobbyDialog::init by checking return value of dynamic_cast.
- Fixed possible crash in RsGRouterSerialiser by checking return value of dynamic_cast.
- added basic functions to collect bandwidth info in pqistreamer both ways; added a sorting method in BWGraphSource
to create curves from extracted BW info. Still not yet functiona
- Fixed possible crash in RsGxsIdSerialiser by checking return value of dynamic_cast.
- Fixed possible crash in p3GRouter by checking return value of dynamic_cast.
- Removed dead code from ImHistoryBrowser::fillItem.
- Removed potentially unintentional integer overflow in NxsBandwidthRecorder::recordEvent.
- Added initialize of RsGxsChannelPost members.
- fixed potential integer problem in image de-serialization (reported by HM)
- Added initialize of RsVOIPPingItem members
- fixed potential integer problems in de-serialization of different TLV items (patch from Henry)
Plugins
- fix #20 crash on shutdown with plugins enabled. Settings window did leak plugin config pages (patch from hunbernd)
WebUI
- allow only whitelisted link protocols to prevent javascript in links
- improved error message in webui: show full path of file if read failed
- make link detection work if the message ends with </a>
- added chat
- fix serialisation of floating point numbers in SuperEasyJSON for german locale. JSON expects decimal points, but german locale used comma.
GXS IDs
- added additional key checking for IDs received during distant chat DH handshake
- added methods to check public/private keys for consistent fingerprint and content. Should be later used to check GXS keys when they arrive from neighbor nodes.
Distant chat
- Added check of function parameter to DistantChatService::handleRecvDHPublicKey.
-- Cyril Soler <csoler@users.sourceforge.net> Sun, 02 Aug 2015 16:00:00 +0100
retroshare06 (0.6.0-0.8551~precise) precise; urgency=low
GUI

View File

@ -1,11 +1,11 @@
#!/bin/sh
rm -f ./libssh-0.5.4.tar.gz.*
rm -f ./retroshare06_0.6.0-0.*_source.build
rm -f ./retroshare06_0.6.0-0.*_source.changes
rm -f ./retroshare06_0.6.0-0.*.tar.gz
rm -f ./retroshare06_0.6.0-0.*.diff.gz
rm -f ./retroshare06_0.6.0-0.*.dsc
rm -f ./retroshare06_0.6.0-1.*_source.build
rm -f ./retroshare06_0.6.0-1.*_source.changes
rm -f ./retroshare06_0.6.0-1.*.tar.gz
rm -f ./retroshare06_0.6.0-1.*.diff.gz
rm -f ./retroshare06_0.6.0-1.*.dsc
rm -f *.upload
rm -f *~

View File

@ -2,7 +2,7 @@ Source: retroshare06
Section: devel
Priority: standard
Maintainer: Cyril Soler <csoler@users.sourceforge.net>
Build-Depends: debhelper (>= 7), libglib2.0-dev, libupnp-dev, qt4-dev-tools, libqt4-dev, libssl-dev, libxss-dev, libgnome-keyring-dev, libbz2-dev, libqt4-opengl-dev, libqtmultimediakit1, qtmobility-dev, libspeex-dev, libspeexdsp-dev, libxslt1-dev, cmake, libcurl4-openssl-dev, libcv-dev, libopencv-core-dev, libopencv-contrib-dev, libhighgui-dev, tcl8.5, libsqlcipher-dev, libmicrohttpd-dev
Build-Depends: debhelper (>= 7), libglib2.0-dev, libupnp-dev, qt4-dev-tools, libqt4-dev, libssl-dev, libxss-dev, libgnome-keyring-dev, libbz2-dev, libqt4-opengl-dev, libqtmultimediakit1, qtmobility-dev, libspeex-dev, libspeexdsp-dev, libxslt1-dev, cmake, libcurl4-openssl-dev, libcv-dev, libopencv-core-dev, libopencv-contrib-dev, libhighgui-dev, tcl8.5, libsqlcipher-dev, libmicrohttpd-dev, libavcodec-dev
Standards-Version: 3.9.3
Homepage: http://retroshare.sourceforge.net

View File

@ -2,7 +2,7 @@ Source: retroshare06
Section: devel
Priority: standard
Maintainer: Cyril Soler <csoler@users.sourceforge.net>
Build-Depends: debhelper (>= 7), libglib2.0-dev, libupnp-dev, qt4-dev-tools, libqt4-dev, libssl-dev, libxss-dev, libgnome-keyring-dev, libbz2-dev, libqt4-opengl-dev, libqt4-multimedia, libspeex-dev, libspeexdsp-dev, libxslt1-dev, cmake, libcurl4-openssl-dev, libcv-dev, libcvaux-dev, libhighgui-dev, tcl8.5, libmicrohttpd-dev, libsqlite3-dev
Build-Depends: debhelper (>= 7), libglib2.0-dev, libupnp-dev, qt4-dev-tools, libqt4-dev, libssl-dev, libxss-dev, libgnome-keyring-dev, libbz2-dev, libqt4-opengl-dev, libqt4-multimedia, libspeex-dev, libspeexdsp-dev, libxslt1-dev, cmake, libcurl4-openssl-dev, libcv-dev, libcvaux-dev, libhighgui-dev, tcl8.5, libmicrohttpd-dev, libsqlite3-dev, libavcodec-dev
Standards-Version: 3.9.3
Homepage: http://retroshare.sourceforge.net

View File

@ -2,7 +2,7 @@ Source: retroshare
Section: devel
Priority: standard
Maintainer: Cyril Soler <csoler@users.sourceforge.net>
Build-Depends: debhelper (>= 7), libglib2.0-dev, libupnp-dev, qt4-dev-tools, libqt4-dev, libssl-dev, libxss-dev, libgnome-keyring-dev, libbz2-dev, libqt4-opengl-dev, libspeex-dev, libspeexdsp-dev, libxslt1-dev, libprotobuf-dev, protobuf-compiler, cmake, libcurl4-openssl-dev
Build-Depends: debhelper (>= 7), libglib2.0-dev, libupnp-dev, qt4-dev-tools, libqt4-dev, libssl-dev, libxss-dev, libgnome-keyring-dev, libbz2-dev, libqt4-opengl-dev, libspeex-dev, libspeexdsp-dev, libxslt1-dev, libprotobuf-dev, protobuf-compiler, cmake, libcurl4-openssl-dev, libavcodec-dev
Standards-Version: 3.9.1
Homepage: http://retroshare.sourceforge.net

View File

@ -2,7 +2,7 @@ Source: retroshare06
Section: devel
Priority: standard
Maintainer: Cyril Soler <csoler@users.sourceforge.net>
Build-Depends: debhelper (>= 7), libglib2.0-dev, libupnp-dev, qt4-dev-tools, libqt4-dev, libssl-dev, libxss-dev, libgnome-keyring-dev, libbz2-dev, libqt4-opengl-dev, libqtmultimediakit1, qtmobility-dev, libspeex-dev, libspeexdsp-dev, libxslt1-dev, cmake, libcurl4-openssl-dev, libopencv-dev, tcl8.5, libsqlcipher-dev, libmicrohttpd-dev
Build-Depends: debhelper (>= 7), libglib2.0-dev, libupnp-dev, qt4-dev-tools, libqt4-dev, libssl-dev, libxss-dev, libgnome-keyring-dev, libbz2-dev, libqt4-opengl-dev, libqtmultimediakit1, qtmobility-dev, libspeex-dev, libspeexdsp-dev, libxslt1-dev, cmake, libcurl4-openssl-dev, libopencv-dev, tcl8.5, libsqlcipher-dev, libmicrohttpd-dev, libavcodec-dev
Standards-Version: 3.9.3
Homepage: http://retroshare.sourceforge.net

View File

@ -1,10 +0,0 @@
usr/bin
usr/sbin
usr/share/pixmaps
usr/share/applications/
usr/share/RetroShare06/
usr/share/RetroShare06/webui/
usr/share/RetroShare06/sounds/
usr/share/icons/hicolor/24x24/apps/
usr/share/icons/hicolor/48x48/apps/
usr/share/icons/hicolor/64x64/apps/

View File

@ -1,2 +1 @@
usr/lib/retroshare/extensions6/libFeedReader.so
debian/tmp/usr/lib/retroshare/extensions6/libFeedReader.so*

View File

@ -1,6 +1,3 @@
usr/bin
usr/bin/RetroShare-nogui
usr/share
usr/share/RetroShare
usr/share/RetroShare/bdboot.txt
debian/tmp/usr/bin/RetroShare06-nogui
debian/tmp/usr/share/RetroShare06/bdboot.txt
debian/tmp/usr/share/RetroShare06/webui/*

View File

@ -1,2 +1 @@
usr/lib/retroshare/extensions6/libVOIP.so
debian/tmp/usr/lib/retroshare/extensions6/libVOIP.so*

View File

@ -1,10 +1,6 @@
usr/share/applications/retroshare.desktop
usr/share/pixmaps/retroshare.xpm
usr/share/RetroShare/bdboot.txt
usr/share/icons/hicolor/48x48/apps/retroshare.png
usr/share/icons/hicolor/24x24/apps/retroshare.png
usr/share/icons/hicolor/64x64/apps/retroshare.png
usr/bin
usr/bin/RetroShare
usr/bin/RetroShare-nogui
debian/tmp/usr/bin/RetroShare06
debian/tmp/usr/bin/RetroShare06-nogui
debian/tmp/usr/share/applications/retroshare06.desktop
debian/tmp/usr/share/icons/hicolor/*
debian/tmp/usr/share/pixmaps/retroshare06.xpm
debian/tmp/usr/share/RetroShare06/*

View File

@ -1,14 +1,14 @@
#!/usr/bin/make -f
builddir:
mkdir -p builddir
builddir/Makefile: builddir
configure: configure-stamp
configure-stamp:
dh_testdir
cd src && qmake-qt4 "CONFIG-=debug" "CONFIG+=release" PREFIX=/usr LIB_DIR=/usr/lib RetroShare.pro
touch $@
build: build-stamp
build-stamp: builddir/Makefile
build: build-stamp
build-stamp: configure-stamp
dh_testdir
# Add here commands to compile the package.
# cd libssh-0.6.4 && mkdir -p build && cd build && cmake -DWITH_STATIC_LIB=ON .. && make
@ -17,68 +17,24 @@ build-stamp: builddir/Makefile
# cp -r libssh-0.6.4 lib/
#cp -r sqlcipher lib/
#cd src/rsctrl/src && make
cd src && qmake-qt4 CONFIG=release RetroShare.pro && make
cd src && $(MAKE)
touch $@
clean:
dh_testdir
dh_testroot
rm -f build-stamp
rm -f configure-stamp build-stamp
# Add here commands to clean up after the build process.
rm -rf builddir
[ ! -f src/Makefile ] || (cd src && $(MAKE) distclean)
dh_clean
install: build
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs
install -D -m 644 src/data/retroshare.desktop $(CURDIR)/debian/retroshare06/usr/share/applications/retroshare06.desktop
install -D -m 644 src/data/24x24/retroshare.png $(CURDIR)/debian/retroshare06/usr/share/icons/hicolor/24x24/apps/retroshare06.png
install -D -m 644 src/data/48x48/retroshare.png $(CURDIR)/debian/retroshare06/usr/share/icons/hicolor/48x48/apps/retroshare06.png
install -D -m 644 src/data/64x64/retroshare.png $(CURDIR)/debian/retroshare06/usr/share/icons/hicolor/64x64/apps/retroshare06.png
install -D -m 644 src/data/retroshare.xpm $(CURDIR)/debian/retroshare06/usr/share/pixmaps/retroshare06.xpm
install -D -m 644 src/plugins/VOIP/libVOIP.so.1.0.0 $(CURDIR)/debian/retroshare06-voip-plugin/usr/lib/retroshare/extensions6/libVOIP.so
install -D -m 644 src/plugins/FeedReader/libFeedReader.so.1.0.0 $(CURDIR)/debian/retroshare06-feedreader-plugin/usr/lib/retroshare/extensions6/libFeedReader.so
install -D -m 644 src/libbitdht/src/bitdht/bdboot.txt $(CURDIR)/debian/retroshare06-nogui/usr/share/RetroShare06/bdboot.txt
install -D -m 644 src/libbitdht/src/bitdht/bdboot.txt $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/bdboot.txt
install -D -m 755 src/retroshare-nogui/src/retroshare-nogui $(CURDIR)/debian/retroshare06-nogui/usr/bin/RetroShare06-nogui
install -D -m 755 src/retroshare-nogui/src/retroshare-nogui $(CURDIR)/debian/retroshare06/usr/bin/RetroShare06-nogui
install -D -m 755 src/retroshare-gui/src/RetroShare $(CURDIR)/debian/retroshare06/usr/bin/RetroShare06
install -D -m 644 src/libresapi/src/webfiles/JSXTransformer.js $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/webui/JSXTransformer.js
install -D -m 644 src/libresapi/src/webfiles/RsApi.js $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/webui/RsApi.js
install -D -m 644 src/libresapi/src/webfiles/RsXHRConnection.js $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/webui/RsXHRConnection.js
install -D -m 644 src/libresapi/src/webfiles/green-black.css $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/webui/green-black.css
install -D -m 644 src/libresapi/src/webfiles/gui.jsx $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/webui/gui.jsx
install -D -m 644 src/libresapi/src/webfiles/index.html $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/webui/index.html
install -D -m 644 src/libresapi/src/webfiles/react.js $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/webui/react.js
install -D -m 644 src/retroshare-gui/src/gui/images/logo/logo_splash.png $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/webui/img/logo_splash.png
install -D -m 644 src/libresapi/src/webfiles/JSXTransformer.js $(CURDIR)/debian/retroshare06-nogui/usr/share/RetroShare06/webui/JSXTransformer.js
install -D -m 644 src/libresapi/src/webfiles/RsApi.js $(CURDIR)/debian/retroshare06-nogui/usr/share/RetroShare06/webui/RsApi.js
install -D -m 644 src/libresapi/src/webfiles/RsXHRConnection.js $(CURDIR)/debian/retroshare06-nogui/usr/share/RetroShare06/webui/RsXHRConnection.js
install -D -m 644 src/libresapi/src/webfiles/green-black.css $(CURDIR)/debian/retroshare06-nogui/usr/share/RetroShare06/webui/green-black.css
install -D -m 644 src/libresapi/src/webfiles/gui.jsx $(CURDIR)/debian/retroshare06-nogui/usr/share/RetroShare06/webui/gui.jsx
install -D -m 644 src/libresapi/src/webfiles/index.html $(CURDIR)/debian/retroshare06-nogui/usr/share/RetroShare06/webui/index.html
install -D -m 644 src/libresapi/src/webfiles/react.js $(CURDIR)/debian/retroshare06-nogui/usr/share/RetroShare06/webui/react.js
install -D -m 644 src/retroshare-gui/src/gui/images/logo/logo_splash.png $(CURDIR)/debian/retroshare06-nogui/usr/share/RetroShare06/webui/img/logo_splash.png
install -D -m 644 src/retroshare-gui/src/sounds/alert.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/alert.wav
install -D -m 644 src/retroshare-gui/src/sounds/chat1.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/chat1.wav
install -D -m 644 src/retroshare-gui/src/sounds/chat2.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/chat2.wav
install -D -m 644 src/retroshare-gui/src/sounds/file.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/file.wav
install -D -m 644 src/retroshare-gui/src/sounds/ft_complete.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/ft_complete.wav
install -D -m 644 src/retroshare-gui/src/sounds/ft_incoming.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/ft_incoming.wav
install -D -m 644 src/retroshare-gui/src/sounds/incomingchat.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/incomingchat.wav
install -D -m 644 src/retroshare-gui/src/sounds/notify.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/notify.wav
install -D -m 644 src/retroshare-gui/src/sounds/offline.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/offline.wav
install -D -m 644 src/retroshare-gui/src/sounds/online1.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/online1.wav
install -D -m 644 src/retroshare-gui/src/sounds/online2.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/online2.wav
install -D -m 644 src/retroshare-gui/src/sounds/receive.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/receive.wav
install -D -m 644 src/retroshare-gui/src/sounds/send1.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/send1.wav
install -D -m 644 src/retroshare-gui/src/sounds/send2.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/send2.wav
install -D -m 644 src/retroshare-gui/src/sounds/startup.wav $(CURDIR)/debian/retroshare06/usr/share/RetroShare06/sounds/startup.wav
#dh_installdirs
cd src && $(MAKE) INSTALL_ROOT=$(CURDIR)/debian/tmp install
# Add here commands to install the package into debian/your_appname
# cd builddir && $(MAKE) INSTALL_ROOT=$(CURDIR)/debian/$(APPNAME) install
# Build architecture-independent files here.
binary-indep: build install
# We have nothing to do by default.
@ -87,9 +43,10 @@ binary-indep: build install
binary-arch: build install
dh_testdir
dh_testroot
dh_installdocs
dh_installexamples
dh_installman
dh_install --list-missing
#dh_installdocs
#dh_installexamples
#dh_installman
dh_link
dh_strip
dh_compress
@ -102,4 +59,3 @@ binary-arch: build install
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install configure

View File

@ -2,12 +2,12 @@
###################### PARAMETERS ####################
version="0.6.0"
svnpath="svn://csoler@svn.code.sf.net/p/retroshare/code/"
gitpath="https://github.com/RetroShare/RetroShare.git"
workdir=retroshare06-${version}
#bubba3="Y" # comment out to compile for bubba3
######################################################
echo This script is going to build the debian source package for RetroShare, from the SVN repository.
echo This script is going to build the debian source package for RetroShare, from the Git repository.
if test -d "${workdir}" ; then
echo Removing the ${workdir} directory...
@ -15,14 +15,15 @@ if test -d "${workdir}" ; then
fi
# Parse options
svnrev=""
rev=""
dist=""
# This is the key for "Cyril Soler <csoler@sourceforge.net>"
gpgkey="C737CA98"
gpgkey="0932399B"
while [ ${#} -gt 0 ]; do
case ${1} in
"-rev") shift
svnrev=${1}
rev=${1}
shift
;;
"-distribution") shift
@ -46,46 +47,52 @@ while [ ${#} -gt 0 ]; do
done
if test "${dist}" = "" ; then
dist="precise trusty utopic vivid"
dist="precise trusty vivid"
fi
echo Attempting to get revision number...
ccount=`git rev-list --count --all`
ccount=`expr $ccount + 8613 - 8267`
date=`git log --pretty=format:"%ai" | head -1 | cut -d\ -f1 | sed -e s/-//g`
time=`git log --pretty=format:"%aD" | head -1 | cut -d\ -f5 | sed -e s/://g`
hhsh=`git log --pretty=format:"%H" | head -1 | cut -c1-8`
rev=${date}.${hhsh}
echo " "Using PGP key id : ${gpgkey}
echo " "Using distributions: ${dist}
echo " "Using svn : ${rev}
echo Updating SVN...
svn update
if test "${svnrev}" = "" ; then
echo Attempting to get SVN revision number...
svnrev=`svn info|awk '/^Revision:/ {print $NF}'`
else
echo SVN number has been provided. Forcing update.
fi
echo " "Commit count : ${ccount}
echo " "Date : ${date}
echo " "Time : ${time}
echo " "Hash : ${hhsh}
echo " "Using revision : ${rev}
echo Done.
version="${version}"."${svnrev}"
version="${version}"."${rev}"
echo Got version number ${version}.
echo Please check that the changelog is up to date.
echo Hit ENTER if this is correct. Otherwise hit Ctrl+C
read tmp
packages="."
echo SVN number is ${svnrev}
echo Version is ${version}
echo Extracting base archive...
mkdir -p ${workdir}/src
cp -r data ${workdir}/src/
cp -r debian ${workdir}/debian
echo Checking out latest snapshot...
cd ${workdir}/src
svn co -r${svnrev} ${svnpath}/trunk/ .
git clone --depth 1 https://github.com/RetroShare/RetroShare.git .
cd -
if ! test -d ${workdir}/src/libretroshare/; then
echo Git clone failed.
exit
fi
#cp -r data ${workdir}/src/
cp -r debian ${workdir}/debian
#svn co -r${rev} ${svnpath}/trunk/ .
# VOIP tweak
cp ${workdir}/src/retroshare-gui/src/gui/chat/PopupChatDialog.ui ${workdir}/src/plugins/VOIP/gui/PopupChatDialog.ui
@ -107,16 +114,18 @@ cd ${workdir}
echo Setting version numbers...
# setup version numbers
sed -e "s%RS_REVISION_NUMBER.*%RS_REVISION_NUMBER ${svnrev}%" src/libretroshare/src/retroshare/rsversion.in > src/libretroshare/src/retroshare/rsversion.h
sed -e "s%RS_REVISION_NUMBER.*%RS_REVISION_NUMBER 0x${hhsh}%" src/libretroshare/src/retroshare/rsversion.in > src/libretroshare/src/retroshare/rsversion.h
# Various cleaning
echo Cleaning...
find . -depth -name ".svn" -a -type d -exec rm -rf {} \; # remove all svn repositories
\rm -rf src/.git
#find . -depth -name ".svn" -a -type d -exec rm -rf {} \; # remove all svn repositories
echo Calling debuild...
for i in ${dist}; do
echo copying changelog for ${i}
sed -e s/XXXXXX/"${svnrev}"/g -e s/YYYYYY/"${i}"/g ../changelog > debian/changelog
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

View File

@ -1,3 +1,2 @@
#!/bin/sh
Apply dput ppa:csoler-users/retroshare-snapshots retroshare_0.5.5#.changes
Apply dput ppa:csoler-users/retroshare-unstable retroshare06_0.6.0-0.#.changes
Apply dput ppa:retroshare/unstable retroshare06_0.6.0-1.#.changes

View File

@ -0,0 +1,14 @@
This is the build directory for RPM based Linux distributions like RedHat
Enterprise Linux and compatible distributions (CentOS, Oracle Linux, ...) or
Fedora.
To create an RPM package (as well as Source RPM) for your distribution, just
run the makePackages.sh script found in this directory, like so:
./makepackages.sh
The script needs the rpmbuild command, which is part of the rpm-build package.
In case any build dependency is missing, the rpmbuild command will fail. Just
install the missing package(s) and restart the script (Hint: all needed
packages are listed in the provided retroshare06.spec file.)

View File

@ -0,0 +1,9 @@
[Desktop Entry]
Version=1.0
Name=RetroShare06
Comment=Securely share files with your friends
Exec=/usr/bin/RetroShare06
Icon=/usr/share/pixmaps/retroshare06.xpm
Terminal=false
Type=Application
Categories=Network;P2P;

View File

@ -0,0 +1,85 @@
#!/bin/bash
###################### PARAMETERS ####################
VERSION="0.6.0"
######################################################
dirs -c
echo "This script is going to build the RedHat family source package for RetroShare, from a clone of the GitHub repository."
# Parse options
while [[ ${#} > 0 ]]
do
case ${1} in
"-h") shift
echo "Package building script for RedHat family distributions"
echo "Usage:"
echo " ${0}"
exit 1
;;
"*") echo "Unknown option"
exit 1
;;
esac
done
GITROOT=$(git rev-parse --show-toplevel)
DATE=$(git log --pretty=format:"%ai" | head -1 | cut -d\ -f1 | sed -e s/-//g)
HASH=$(git log --pretty=format:"%H" | head -1 | cut -c1-8)
REV=${DATE}.${HASH}
FULL_VERSION=${VERSION}.${REV}
echo "Using version number: ${VERSION}"
echo "Using revision: ${REV}"
echo "Hit ENTER if this is correct. Otherwise hit Ctrl+C"
read tmp
WORKDIR="retroshare06-${FULL_VERSION}"
if [[ -d ${WORKDIR} ]]
then
echo "Removing the directory ${WORKDIR}..."
rm -rf ${WORKDIR}
fi
mkdir -p ${WORKDIR}/src
echo "Copying sources into workdir..."
rsync -rc --exclude build_scripts ${GITROOT}/* ${WORKDIR}/src
rsync -rc --copy-links data ${WORKDIR}/src
pushd ${WORKDIR} >/dev/null
# Cloning sqlcipher
echo "Cloning sqlcipher repository..."
mkdir lib
pushd lib >/dev/null
git clone https://github.com/sqlcipher/sqlcipher.git
pushd sqlcipher >/dev/null
git checkout v3.3.1
rm -rf .git
popd >/dev/null
popd >/dev/null
# VOIP tweak
cp src/retroshare-gui/src/gui/chat/PopupChatDialog.ui src/plugins/VOIP/gui/PopupChatDialog.ui
# cleaning up protobof generated files
rm -f src/retroshare-nogui/src/rpc/proto/gencc/*.pb.h
rm -f src/retroshare-nogui/src/rpc/proto/gencc/*.pb.cc
# setup version numbers
echo "Setting version numbers..."
sed -e "s%RS_REVISION_NUMBER.*%RS_REVISION_NUMBER 0x${HASH}%" src/libretroshare/src/retroshare/rsversion.in >src/libretroshare/src/retroshare/rsversion.h
popd >/dev/null
echo "Creating RPMs..."
[[ -d rpm-build/rpm ]] || mkdir -p rpm-build/rpm
pushd rpm-build/rpm >/dev/null
for DIR in BUILD RPMS SOURCES SPECS SRPMS
do
[[ -d ${DIR} ]] || mkdir ${DIR}
done
popd >/dev/null
tar -zcf rpm-build/rpm/SOURCES/${WORKDIR}.tar.gz ${WORKDIR}
rpmbuild --define="%rev ${REV}" --define="%_usrsrc $PWD/rpm-build" --define="%_topdir %{_usrsrc}/rpm" -ba retroshare06.spec
rm -rf ${WORKDIR}
exit 0

View File

@ -0,0 +1,99 @@
Summary: Secure communication with friends
Name: retroshare06
Version: 0.6.0.%{rev}
Release: 1%{?dist}
License: GPLv3
Group: Productivity/Networking/Other
URL: http://retroshare.sourceforge.net/
Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
Requires: qt-x11
BuildRequires: gcc-c++ qt-devel desktop-file-utils libgnome-keyring-devel glib2-devel libssh-devel protobuf-devel libcurl-devel libxml2-devel libxslt-devel openssl-devel libXScrnSaver-devel libupnp-devel bzip2-devel libmicrohttpd-devel
# This is because of sqlcipher:
BuildRequires: tcl
%description
RetroShare is a decentralized, private and secure commmunication and sharing platform. RetroShare provides filesharing, chat, messages, forums and channels.
Authors:
see http://retroshare.sourceforge.net/team.html
%package nogui
Summary: RetroShare cli client
Group: Productivity/Network/Other
Requires: openssl
Conflicts: %name = %{version}
%description nogui
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 voip-plugin
Summary: RetroShare VOIP plugin
Group: Productivity/Networking/Other
Requires: %name = %{version}
BuildRequires: opencv-devel speex-devel
%if 0%{?fedora} >= 22
BuildRequires: speexdsp-devel
%endif
%description voip-plugin
This package provides a plugin for RetroShare, a secured Friend-to-Friend communication platform. 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 feedreader-plugin
Summary: RetroShare FeedReader plugin
Group: Productivity/Networking/Other
Requires: %name = %{version}
%description feedreader-plugin
This package provides a plugin for RetroShare, a secured Friend-to-Friend communication platform. The plugin adds a RSS feed reader tab to retroshare.
%prep
%setup -q
%build
cd lib/sqlcipher
./configure --disable-shared --enable-static --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"
make
cd -
cd src
qmake-qt4 "CONFIG-=debug" "CONFIG+=release" PREFIX=%{_prefix} LIB_DIR=%{_libdir} RetroShare.pro
make
cd -
%install
rm -rf $RPM_BUILD_ROOT
cd src
make INSTALL_ROOT=$RPM_BUILD_ROOT install
#menu
desktop-file-validate $RPM_BUILD_ROOT%{_datadir}/applications/retroshare06.desktop
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root,-)
%{_bindir}/RetroShare06
%defattr(644, root, root)
%{_datadir}/pixmaps/%{name}.xpm
%{_datadir}/icons/hicolor
%{_datadir}/applications/%{name}.desktop
%{_datadir}/RetroShare06
%files nogui
%defattr(-, root, root)
%{_bindir}/RetroShare06-nogui
%defattr(644, root, root)
%{_datadir}/RetroShare06
%files voip-plugin
%defattr(-, root, root)
%{_libdir}/retroshare/extensions6/libVOIP.so*
%files feedreader-plugin
%defattr(-, root, root)
%{_libdir}/retroshare/extensions6/libFeedReader.so*
%changelog
* Sat Apr 4 2015 Heini <noreply@nowhere.net> -
- Initial build.

View File

@ -0,0 +1,43 @@
@:: Usage:
@:: call GetRsVersion.bat Define Variable
@setlocal
@echo off
set Define=%~1
if "%Define%"=="" (
echo.
echo Parameter error
endlocal
exit /B1
)
set Variable=%~2
if "%Variable%"=="" (
echo.
echo Parameter error
endlocal
exit /B1
)
set Result=
set VersionFile="%~dp0..\..\libretroshare\src\retroshare\rsversion.h"
if not exist "%VersionFile%" (
echo.
echo Version file doesn't exist.
echo %VersionFile%
endlocal
exit /B1
)
for /F "usebackq tokens=1,2,3" %%A in (%VersionFile%) do (
if "%%A"=="#define" (
if "%%B"=="%Define%" (
set Result=%%~C
)
)
)
endlocal & set %Variable%=%Result%
exit /B 0

View File

@ -24,32 +24,27 @@ if "%MinGWDir%" NEQ "" set NSIS_PARAM=%NSIS_PARAM% /DMINGWDIR="%MinGWDir%"
if "%OutDir%" NEQ "" set NSIS_PARAM=%NSIS_PARAM% /DOUTDIR="%OutDir%"
:: Scan version from source
set Revision=
set BuildAdd=
set VersionFile="%SourceDir%\libretroshare\src\retroshare\rsversion.h"
call "%~dp0GetRsVersion.bat" RS_REVISION_STRING Revision
if errorlevel 1 goto exit
call "%~dp0GetRsVersion.bat" RS_BUILD_NUMBER_ADD BuildAdd
if errorlevel 1 goto exit
if not exist "%VersionFile%" (
if "%Revision%"=="" (
echo.
echo Version file doesn't exist.
echo Version not found in
echo %VersionFile%
goto :exit
goto exit
)
for /F "usebackq tokens=1,2,3" %%A in (%VersionFile%) do (
if "%%A"=="#define" (
if "%%B"=="RS_BUILD_NUMBER_ADD" (
set BuildAdd=%%~C
)
)
)
if "%BuildAdd%"=="" (
echo.
echo Version not found in
echo %VersionFile%
goto :exit
goto exit
)
set NSIS_PARAM=%NSIS_PARAM% /DBUILDADD=%BuildAdd%
set NSIS_PARAM=%NSIS_PARAM% /DREVISION=%Revision% /DBUILDADD=%BuildAdd%
:: Create installer
"%NSIS_EXE%" %NSIS_PARAM% "%~dp0retroshare.nsi"

View File

@ -39,10 +39,10 @@
!endif
# Get version from executable
!GetDllVersion "${RELEASEDIR}\retroshare-gui\src\release\RetroShare.exe" VERSION_
!GetDllVersion "${RELEASEDIR}\retroshare-gui\src\release\RetroShare06.exe" VERSION_
!define VERSION ${VERSION_1}.${VERSION_2}.${VERSION_3}${BUILDADD}
!define REVISION ${VERSION_4}
;!define REVISION ${VERSION_4}
# Check version
!ifndef REVISION
@ -53,6 +53,9 @@
!error "REVISION is not defined"
!endif
# Date
!define /date Date "%Y%m%d"
# Application name and version
!define APPNAME "RetroShare"
!define APPNAMEANDVERSION "${APPNAME} ${VERSION}"
@ -68,7 +71,7 @@
# Main Install settings
Name "${APPNAMEANDVERSION}"
InstallDirRegKey HKLM "Software\${APPNAME}" ""
OutFile "${OUTDIR_}RetroShare_${VERSION}_${REVISION}_setup.exe"
OutFile "${OUTDIR_}RetroShare-${VERSION}-${Date}-${REVISION}-setup.exe"
BrandingText "${APPNAMEANDVERSION}"
RequestExecutionlevel highest
# Use compression
@ -172,8 +175,8 @@ Section $(Section_Main) Section_Main
; Main binaries
SetOutPath "$INSTDIR"
File "${RELEASEDIR}\retroshare-gui\src\release\RetroShare.exe"
File "${RELEASEDIR}\retroshare-nogui\src\release\retroshare-nogui.exe"
File /oname=RetroShare.exe "${RELEASEDIR}\retroshare-gui\src\release\RetroShare06.exe"
File /oname=retroshare-nogui.exe "${RELEASEDIR}\retroshare-nogui\src\release\RetroShare06-nogui.exe"
; Qt binaries
File "${QTDIR}\bin\QtCore4.dll"

View File

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -1,3 +1,5 @@
!include("../../retroshare.pri"): error("Could not include file ../../retroshare.pri")
TEMPLATE = lib
CONFIG += staticlib
CONFIG -= qt
@ -37,6 +39,13 @@ linux-g++-64 {
OBJECTS_DIR = temp/linux-g++-64/obj
}
unix {
data_files.path = "$${DATA_DIR}"
data_files.files = bitdht/bdboot.txt
INSTALLS += data_files
}
#################### Cross compilation for windows under Linux ####################
win32-x-g++ {

View File

@ -225,6 +225,7 @@ public:
ApiServerMainModules(ResourceRouter& router, StateTokenServer* sts, const RsPlugInInterfaces &ifaces):
mPeersHandler(sts, ifaces.mNotify, ifaces.mPeers, ifaces.mMsgs),
mIdentityHandler(ifaces.mIdentity),
mForumHandler(ifaces.mGxsForums),
mServiceControlHandler(rsServiceControl), // TODO: don't use global variable here
mFileSearchHandler(sts, ifaces.mNotify, ifaces.mTurtle, ifaces.mFiles),
mTransfersHandler(sts, ifaces.mFiles),
@ -238,6 +239,8 @@ public:
&PeersHandler::handleRequest);
router.addResourceHandler("identity", dynamic_cast<ResourceRouter*>(&mIdentityHandler),
&IdentityHandler::handleRequest);
router.addResourceHandler("forums", dynamic_cast<ResourceRouter*>(&mForumHandler),
&ForumHandler::handleRequest);
router.addResourceHandler("servicecontrol", dynamic_cast<ResourceRouter*>(&mServiceControlHandler),
&ServiceControlHandler::handleRequest);
router.addResourceHandler("filesearch", dynamic_cast<ResourceRouter*>(&mFileSearchHandler),
@ -250,6 +253,7 @@ public:
PeersHandler mPeersHandler;
IdentityHandler mIdentityHandler;
ForumHandler mForumHandler;
ServiceControlHandler mServiceControlHandler;
FileSearchHandler mFileSearchHandler;
TransfersHandler mTransfersHandler;

View File

@ -5,6 +5,7 @@
#include "ApiTypes.h"
#include "PeersHandler.h"
#include "IdentityHandler.h"
#include "ForumHandler.h"
#include "ServiceControlHandler.h"
#include "StateTokenServer.h"
#include "FileSearchHandler.h"

View File

@ -0,0 +1,148 @@
#include "ForumHandler.h"
#include <retroshare/rsgxsforums.h>
#include <time.h>
#include "Operators.h"
#include "ApiTypes.h"
#include "GxsResponseTask.h"
#ifndef WINDOWS_SYS
#include "unistd.h"
#endif
namespace resource_api
{
ForumHandler::ForumHandler(RsGxsForums* forums):
mRsGxsForums(forums)
{
addResourceHandler("*", this, &ForumHandler::handleWildcard);
}
void ForumHandler::handleWildcard(Request &req, Response &resp)
{
bool ok = true;
if(!req.mPath.empty())
{
std::string str = req.mPath.top();
req.mPath.pop();
if(str != "")
{
//assume we have a groupID
RsGxsGroupId grpId(str);
std::list<RsGxsGroupId> groupIds;
groupIds.push_back(grpId);
uint32_t token;
RsTokReqOptions opts;
opts.mReqType = GXS_REQUEST_TYPE_MSG_DATA;
mRsGxsForums->getTokenService()->requestMsgInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts, groupIds);
time_t start = time(NULL);
while((mRsGxsForums->getTokenService()->requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
&&(mRsGxsForums->getTokenService()->requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_FAILED)
&&((time(NULL) < (start+10)))
)
{
#ifdef WINDOWS_SYS
Sleep(500);
#else
usleep(500*1000) ;
#endif
}
if(mRsGxsForums->getTokenService()->requestStatus(token) == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
{
std::vector<RsGxsForumMsg> grps;
ok &= mRsGxsForums->getMsgData(token, grps);
for(std::vector<RsGxsForumMsg>::iterator vit = grps.begin(); vit != grps.end(); vit++)
{
RsGxsForumMsg& grp = *vit;
KeyValueReference<RsGxsGroupId> group_id("group_id", grp.mMeta.mGroupId);
resp.mDataStream.getStreamToMember()
<< group_id
<< makeKeyValueReference("name", grp.mMeta.mMsgName)
<< makeKeyValueReference("id", grp.mMeta.mMsgId)
<< makeKeyValueReference("parent_id", grp.mMeta.mParentId)
<< makeKeyValueReference("author_id", grp.mMeta.mAuthorId)
<< makeKeyValueReference("orig_msg_id", grp.mMeta.mOrigMsgId)
<< makeKeyValueReference("thread_id", grp.mMeta.mThreadId)
<< makeKeyValueReference("message", grp.mMsg);
}
}
else
{
ok = false;
}
}
}
else
{
// no more path element
RsTokReqOptions opts;
opts.mReqType = GXS_REQUEST_TYPE_GROUP_DATA;
uint32_t token;
mRsGxsForums->getTokenService()->requestGroupInfo(token, RS_TOKREQ_ANSTYPE_DATA, opts);
time_t start = time(NULL);
while((mRsGxsForums->getTokenService()->requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
&&(mRsGxsForums->getTokenService()->requestStatus(token) != RsTokenService::GXS_REQUEST_V2_STATUS_FAILED)
&&((time(NULL) < (start+10)))
)
{
#ifdef WINDOWS_SYS
Sleep(500);
#else
usleep(500*1000) ;
#endif
}
if(mRsGxsForums->getTokenService()->requestStatus(token) == RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE)
{
std::vector<RsGxsForumGroup> grps;
ok &= mRsGxsForums->getGroupData(token, grps);
for(std::vector<RsGxsForumGroup>::iterator vit = grps.begin(); vit != grps.end(); vit++)
{
RsGxsForumGroup& grp = *vit;
KeyValueReference<RsGxsGroupId> id("id", grp.mMeta.mGroupId);
KeyValueReference<uint32_t> vis_msg("visible_msg_count", grp.mMeta.mVisibleMsgCount);
//KeyValueReference<RsPgpId> pgp_id("pgp_id",grp.mPgpId );
// not very happy about this, i think the flags should stay hidden in rsidentities
bool own = (grp.mMeta.mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_ADMIN);
bool pgp_linked = (grp.mMeta.mGroupFlags & RSGXSID_GROUPFLAG_REALID);
bool subscribed = IS_GROUP_SUBSCRIBED(grp.mMeta.mSubscribeFlags);
resp.mDataStream.getStreamToMember()
<< id
//<< pgp_id
<< makeKeyValueReference("name", grp.mMeta.mGroupName)
//<< makeKeyValueReference("last_post", grp.mMeta.mLastPost)
<< makeKeyValueReference("pop", grp.mMeta.mPop)
//<< makeKeyValueReference("publish_ts", grp.mMeta.mPublishTs)
<< vis_msg
<< makeKeyValueReference("group_status", grp.mMeta.mGroupStatus)
<< makeKeyValueReference("author_id", grp.mMeta.mAuthorId)
<< makeKeyValueReference("parent_grp_id", grp.mMeta.mParentGrpId)
<< makeKeyValueReference("description", grp.mDescription)
<< makeKeyValueReference("own", own)
<< makeKeyValueReference("subscribed", subscribed)
<< makeKeyValueReference("pgp_linked", pgp_linked);
}
}
else
{
ok = false;
}
}
if(ok)
{
resp.setOk();
}
else
{
resp.setFail();
}
}
} // namespace resource_api

View File

@ -0,0 +1,20 @@
#ifndef FORUMHANDLER_H
#define FORUMHANDLER_H
#include "ResourceRouter.h"
class RsGxsForums;
namespace resource_api
{
class ForumHandler : public ResourceRouter
{
public:
ForumHandler(RsGxsForums* forums);
private:
RsGxsForums* mRsGxsForums;
void handleWildcard(Request& req, Response& resp);
};
} // namespace resource_api
#endif // FORUMHANDLER_H

View File

@ -1,3 +1,5 @@
!include("../../retroshare.pri"): error("Could not include file ../../retroshare.pri")
TEMPLATE = lib
CONFIG += staticlib
CONFIG -= qt
@ -8,6 +10,16 @@ CONFIG += libmicrohttpd
INCLUDEPATH += ../../libretroshare/src
unix {
webui_files.path = "$${DATA_DIR}/webui"
webui_files.files = webfiles/*
INSTALLS += webui_files
webui_img_files.path = "$${DATA_DIR}/webui/img"
webui_img_files.files = ../../retroshare-gui/src/gui/images/logo/logo_splash.png
INSTALLS += webui_img_files
}
win32{
DEFINES *= WINDOWS_SYS
INCLUDEPATH += $$PWD/../../../libs/include
@ -29,6 +41,7 @@ SOURCES += \
api/PeersHandler.cpp \
api/Operators.cpp \
api/IdentityHandler.cpp \
api/ForumHandler.cpp \
api/ServiceControlHandler.cpp \
api/StateTokenServer.cpp \
api/GxsResponseTask.cpp \
@ -49,6 +62,7 @@ HEADERS += \
api/PeersHandler.h \
api/Operators.h \
api/IdentityHandler.h \
api/ForumHandler.h \
api/ServiceControlHandler.h \
api/GxsMetaOperators.h \
api/StateTokenServer.h \

View File

@ -1019,8 +1019,8 @@ bool DistantChatService::getDistantChatStatus(const RsGxsId& gxs_id,uint32_t& st
{
status = it->second.status ;
if(from_gxs_id != NULL)
*from_gxs_id = it->second.own_gxs_id ;
if(from_gxs_id != NULL)
*from_gxs_id = it->second.own_gxs_id ;
return true ;
}

View File

@ -46,7 +46,7 @@ static const time_t CONNECTION_CHALLENGE_MAX_MSG_AGE = 30 ; // maximum age o
static const int CONNECTION_CHALLENGE_MIN_DELAY = 15 ; // sends a connection at most every 15 seconds
static const int LOBBY_CACHE_CLEANING_PERIOD = 10 ; // clean lobby caches every 10 secs (remove old messages)
static const time_t MAX_KEEP_MSG_RECORD = 1200 ; // keep msg record for 1200 secs max.
static const time_t MAX_KEEP_MSG_RECORD = 1200 ; // keep msg record for 1200 secs max.
static const time_t MAX_KEEP_INACTIVE_NICKNAME = 180 ; // keep inactive nicknames for 3 mn max.
static const time_t MAX_DELAY_BETWEEN_LOBBY_KEEP_ALIVE = 120 ; // send keep alive packet every 2 minutes.
static const time_t MAX_KEEP_PUBLIC_LOBBY_RECORD = 60 ; // keep inactive lobbies records for 60 secs max.
@ -57,11 +57,11 @@ static const uint32_t MAX_ALLOWED_LOBBIES_IN_LIST_WARNING = 50 ;
static const uint32_t MAX_MESSAGES_PER_SECONDS_NUMBER = 5 ; // max number of messages from a given peer in a window for duration below
static const uint32_t MAX_MESSAGES_PER_SECONDS_PERIOD = 10 ; // duration window for max number of messages before messages get dropped.
#define IS_PUBLIC_LOBBY(flags) (flags & RS_CHAT_LOBBY_FLAGS_PUBLIC )
#define IS_ANONYMOUS_LOBBY(flags) (flags & RS_CHAT_LOBBY_FLAGS_ANONYMOUS)
#define IS_CONNEXION_CHALLENGE(flags) (flags & RS_CHAT_LOBBY_FLAGS_CHALLENGE)
#define IS_PUBLIC_LOBBY(flags) (flags & RS_CHAT_LOBBY_FLAGS_PUBLIC )
#define IS_PGP_SIGNED_LOBBY(flags) (flags & RS_CHAT_LOBBY_FLAGS_PGP_SIGNED)
#define IS_CONNEXION_CHALLENGE(flags) (flags & RS_CHAT_LOBBY_FLAGS_CHALLENGE )
#define EXTRACT_PRIVACY_FLAGS(flags) (ChatLobbyFlags(flags.toUInt32()) & RS_CHAT_LOBBY_FLAGS_PUBLIC)
#define EXTRACT_PRIVACY_FLAGS(flags) (ChatLobbyFlags(flags.toUInt32()) * (RS_CHAT_LOBBY_FLAGS_PUBLIC | RS_CHAT_LOBBY_FLAGS_PGP_SIGNED))
DistributedChatService::DistributedChatService(uint32_t serv_type,p3ServiceControl *sc,p3HistoryMgr *hm, RsGixs *is)
: mServType(serv_type),mDistributedChatMtx("Distributed Chat"), mServControl(sc), mHistMgr(hm),mGixs(is)
@ -144,7 +144,37 @@ bool DistributedChatService::handleRecvChatLobbyMsgItem(RsChatMsgItem *ci)
std::cerr << std::endl;
return false;
}
ChatLobbyFlags fl ;
// delete items that are not for us, as early as possible.
{
RsStackMutex stack(mDistributedChatMtx); /********** STACK LOCKED MTX ******/
// send upward for display
std::map<ChatLobbyId,ChatLobbyEntry>::const_iterator it = _chat_lobbys.find(cli->lobby_id) ;
if(it == _chat_lobbys.end())
{
#ifdef DEBUG_CHAT_LOBBIES
std::cerr << "Chatlobby for id " << std::hex << item->lobby_id << " has no record. Dropping the msg." << std::dec << std::endl;
#endif
return false;
}
fl = it->second.lobby_flags ;
}
if(IS_PGP_SIGNED_LOBBY(fl))
{
RsIdentityDetails details;
if(!rsIdentity->getIdDetails(cli->signature.keyId,details) || !details.mPgpKnown)
{
std::cerr << "(WW) Received a lobby msg/item that is not PGP-authed (id=" << cli->signature.keyId << "), whereas the lobby flags require it. Rejecting!" << std::endl;
return false ;
}
}
if(!bounceLobbyObject(cli,cli->PeerId())) // forwards the message to friends, keeps track of subscribers, etc.
return false;
@ -157,7 +187,7 @@ bool DistributedChatService::handleRecvChatLobbyMsgItem(RsChatMsgItem *ci)
//name = cli->nick;
//popupChatFlag = RS_POPUP_CHATLOBBY;
RsServer::notify()->AddPopupMessage(RS_POPUP_CHATLOBBY, cli->signature.keyId.toStdString(), cli->nick, cli->message); /* notify private chat message */
RsServer::notify()->AddPopupMessage(RS_POPUP_CHATLOBBY, virtual_peer_id.toStdString(), cli->signature.keyId.toStdString(), cli->message); /* notify private chat message */
return true ;
}
@ -181,33 +211,34 @@ bool DistributedChatService::checkSignature(RsChatLobbyBouncingObject *obj,const
std::cerr << " signature id: " << obj->signature.keyId << std::endl;
#endif
if(!obj->serialise_signed_part(memory,size))
{
std::cerr << " (EE) Cannot serialise message item. " << std::endl;
return false ;
}
if(!obj->serialise_signed_part(memory,size))
{
std::cerr << " (EE) Cannot serialise message item. " << std::endl;
return false ;
}
uint32_t error_status ;
uint32_t error_status ;
if(!mGixs->validateData(memory,obj->signed_serial_size(),obj->signature,false,error_status))
{
bool res = false ;
if(!mGixs->validateData(memory,obj->signed_serial_size(),obj->signature,false,error_status))
{
bool res = false ;
switch(error_status)
{
case RsGixs::RS_GIXS_ERROR_KEY_NOT_AVAILABLE:
switch(error_status)
{
case RsGixs::RS_GIXS_ERROR_KEY_NOT_AVAILABLE:
#ifdef DEBUG_CHAT_LOBBIES
std::cerr << "(WW) Key is not is cache. Cannot verify." << std::endl;
std::cerr << "(WW) Key is not is cache. Cannot verify." << std::endl;
#endif
res =true ;
break ;
case RsGixs::RS_GIXS_ERROR_SIGNATURE_MISMATCH: std::cerr << "(EE) Signature mismatch. Spoofing/MITM?." << std::endl;
res =false ;
break ;
default: break ;
}
return res;
}
res =true ;
break ;
case RsGixs::RS_GIXS_ERROR_SIGNATURE_MISMATCH: std::cerr << "(EE) Signature mismatch. Spoofing/MITM?." << std::endl;
res =false ;
break ;
default: break ;
}
return res;
}
#ifdef DEBUG_CHAT_LOBBIES
std::cerr << " signature: CHECKS" << std::endl;
@ -249,11 +280,11 @@ void DistributedChatService::locked_printDebugInfo() const
{
std::cerr << " Lobby id\t\t: " << std::hex << it->first << std::dec << std::endl;
std::cerr << " Lobby name\t\t: " << it->second.lobby_name << std::endl;
std::cerr << " Lobby topic\t\t: " << it->second.lobby_topic << std::endl;
std::cerr << " nick name\t\t: " << it->second.gxs_id << std::endl;
std::cerr << " Lobby type\t\t: " << ((IS_PUBLIC_LOBBY(it->second.lobby_flags))?"Public":"Private") << std::endl;
std::cerr << " Lobby policy\t\t: " << ((IS_ANONYMOUS_LOBBY(it->second.lobby_flags))?"Unsigned":"Signature required") << std::endl;
std::cerr << " Lobby peer id\t: " << it->second.virtual_peer_id << std::endl;
std::cerr << " Lobby topic\t\t: " << it->second.lobby_topic << std::endl;
std::cerr << " nick name\t\t: " << it->second.gxs_id << std::endl;
std::cerr << " Lobby type\t\t: " << ((IS_PUBLIC_LOBBY(it->second.lobby_flags))?"Public":"Private") << std::endl;
std::cerr << " Lobby security\t\t: " << ((IS_PGP_SIGNED_LOBBY(it->second.lobby_flags))?"PGP-signed IDs required":"Anon IDs accepted") << std::endl;
std::cerr << " Lobby peer id\t: " << it->second.virtual_peer_id << std::endl;
std::cerr << " Challenge count\t: " << it->second.connexion_challenge_count << std::endl;
std::cerr << " Last activity\t: " << now - it->second.last_activity << " seconds ago." << std::endl;
std::cerr << " Cached messages\t: " << it->second.msg_cache.size() << std::endl;
@ -268,7 +299,7 @@ void DistributedChatService::locked_printDebugInfo() const
std::cerr << " Participating nick names: " << std::endl;
for(std::map<RsGxsId,time_t>::const_iterator it2(it->second.gxs_ids.begin());it2!=it->second.gxs_ids.end();++it2)
for(std::map<RsGxsId,time_t>::const_iterator it2(it->second.gxs_ids.begin());it2!=it->second.gxs_ids.end();++it2)
std::cerr << " " << it2->first << ": " << now - it2->second << " secs ago" << std::endl;
}
@ -446,7 +477,7 @@ void DistributedChatService::handleRecvChatLobbyListRequest(RsChatLobbyListReque
info.name = it->second.lobby_name ;
info.topic = it->second.lobby_topic ;
info.count = it->second.gxs_ids.size() ;
info.flags = it->second.lobby_flags ;
info.flags = ChatLobbyFlags(EXTRACT_PRIVACY_FLAGS(it->second.lobby_flags)) ;
item->lobbies.push_back(info) ;
}
@ -496,7 +527,7 @@ void DistributedChatService::handleRecvChatLobbyList(RsChatLobbyListItem *item)
rec.total_number_of_peers = std::max(rec.total_number_of_peers,item->lobbies[i].count) ;
rec.last_report_time = now ;
rec.lobby_flags = item->lobbies[i].flags ;
rec.lobby_flags = EXTRACT_PRIVACY_FLAGS(item->lobbies[i].flags) ;
std::map<ChatLobbyId,ChatLobbyFlags>::const_iterator it(_known_lobbies_flags.find(item->lobbies[i].id)) ;
@ -596,19 +627,24 @@ void DistributedChatService::addTimeShiftStatistics(int D)
void DistributedChatService::handleRecvChatLobbyEventItem(RsChatLobbyEventItem *item)
{
ChatLobbyFlags fl ;
// delete items that are not for us, as early as possible.
{
RsStackMutex stack(mDistributedChatMtx); /********** STACK LOCKED MTX ******/
// send upward for display
if(_chat_lobbys.find(item->lobby_id) == _chat_lobbys.end())
std::map<ChatLobbyId,ChatLobbyEntry>::const_iterator it = _chat_lobbys.find(item->lobby_id) ;
if(it == _chat_lobbys.end())
{
#ifdef DEBUG_CHAT_LOBBIES
std::cerr << "Chatlobby for id " << std::hex << item->lobby_id << " has no record. Dropping the msg." << std::dec << std::endl;
#endif
return ;
}
fl = it->second.lobby_flags ;
}
@ -624,7 +660,18 @@ void DistributedChatService::handleRecvChatLobbyEventItem(RsChatLobbyEventItem *
std::cerr << std::endl;
return ;
}
if(IS_PGP_SIGNED_LOBBY(fl))
{
RsIdentityDetails details;
if(!rsIdentity->getIdDetails(item->signature.keyId,details) || !details.mPgpKnown)
{
std::cerr << "(WW) Received a lobby msg/item that is not PGP-authed (ID=" << item->signature.keyId << "), whereas the lobby flags require it. Rejecting!" << std::endl;
return ;
}
}
addTimeShiftStatistics((int)now - (int)item->sendTime) ;
if(now+100 > (time_t) item->sendTime + MAX_KEEP_MSG_RECORD) // the message is older than the max cache keep minus 100 seconds ! It's too old, and is going to make an echo!
@ -912,10 +959,8 @@ bool DistributedChatService::locked_initLobbyBouncableObject(const ChatLobbyId&
// now sign the object, if the lobby expects it
if(!IS_ANONYMOUS_LOBBY(lobby.lobby_flags))
{
uint32_t size = item.signed_serial_size() ;
unsigned char *memory = (unsigned char *)malloc(size) ;
RsTemporaryMemory memory(size) ;
if(!item.serialise_signed_part(memory,size))
{
@ -934,12 +979,9 @@ bool DistributedChatService::locked_initLobbyBouncableObject(const ChatLobbyId&
default: std::cerr << "(EE) Cannot sign item: unknown error" << std::endl;
break ;
}
free(memory) ;
return false ;
}
#ifdef DEBUG_CHAT_LOBBIES
std::cerr << " signature done." << std::endl;
@ -953,8 +995,6 @@ bool DistributedChatService::locked_initLobbyBouncableObject(const ChatLobbyId&
std::cerr << " Item dump:" << std::endl;
item.print(std::cerr,2) ;
#endif
free(memory) ;
}
return true ;
}

View File

@ -587,7 +587,8 @@ RsGRouterAbstractMsgItem *GRouterDataInfo::addDataChunk(RsGRouterTransactionChun
std::cerr << " ERROR: chunk numbering is wrong. Dropping." << std::endl;
delete chunk ;
delete incoming_data_buffer ;
return NULL;
incoming_data_buffer = NULL ;
return NULL;
}
incoming_data_buffer->chunk_data = (uint8_t*)realloc((uint8_t*)incoming_data_buffer->chunk_data,incoming_data_buffer->chunk_size + chunk->chunk_size) ;
memcpy(&incoming_data_buffer->chunk_data[incoming_data_buffer->chunk_size],chunk->chunk_data,chunk->chunk_size) ;

File diff suppressed because it is too large Load Diff

View File

@ -29,15 +29,6 @@
#include "gxs/rsgds.h"
#include "util/retrodb.h"
class MsgOffset
{
public:
MsgOffset() : msgOffset(0), msgLen(0) {}
RsGxsMessageId msgId;
uint32_t msgOffset, msgLen;
};
class MsgUpdate
{
public:
@ -233,8 +224,9 @@ private:
/*!
* Creates an sql database and its associated file
* also creates the message and groups table
* @param isNewDatabase is new database
*/
void initialise();
void initialise(bool isNewDatabase);
/*!
* Remove entries for data base
@ -243,34 +235,99 @@ private:
bool locked_removeMessageEntries(const GxsMsgReq& msgIds);
bool locked_removeGroupEntries(const std::vector<RsGxsGroupId>& grpIds);
typedef std::map<RsGxsGroupId, std::vector<MsgUpdate> > MsgUpdates;
private:
/*!
* Start release update
* @param release
* @return true/false
*/
bool startReleaseUpdate(int release);
/*!
* Update messages entries with new values
* @param msgIds
* @param cv contains values to update message entries with
* Finish release update
* @param release
* @param result
* @return true/false
*/
bool locked_updateMessageEntries(const MsgUpdates& updates);
private:
void locked_getMessageOffsets(const RsGxsGroupId& grpId, std::vector<MsgOffset>& msgOffsets);
bool finishReleaseUpdate(int release, bool result);
private:
RsMutex mDbMutex;
std::list<std::string> msgColumns;
std::list<std::string> msgMetaColumns;
std::list<std::string> mMsgOffSetColumns;
std::list<std::string> mMsgColumns;
std::list<std::string> mMsgMetaColumns;
std::list<std::string> mMsgIdColumn;
std::list<std::string> grpColumns;
std::list<std::string> grpMetaColumns;
std::list<std::string> grpIdColumn;
std::list<std::string> mGrpColumns;
std::list<std::string> mGrpMetaColumns;
std::list<std::string> mGrpIdColumn;
std::string mServiceDir, mDbName;
// Message meta column
int mColMsgMeta_GrpId;
int mColMsgMeta_TimeStamp;
int mColMsgMeta_NxsFlags;
int mColMsgMeta_SignSet;
int mColMsgMeta_NxsIdentity;
int mColMsgMeta_NxsHash;
int mColMsgMeta_MsgId;
int mColMsgMeta_OrigMsgId;
int mColMsgMeta_MsgStatus;
int mColMsgMeta_ChildTs;
int mColMsgMeta_MsgParentId;
int mColMsgMeta_MsgThreadId;
int mColMsgMeta_Name;
int mColMsgMeta_NxsServString;
int mColMsgMeta_RecvTs;
int mColMsgMeta_NxsDataLen;
// Message columns
int mColMsg_GrpId;
int mColMsg_NxsData;
int mColMsg_MetaData;
int mColMsg_MsgId;
// Group meta columns
int mColGrpMeta_GrpId;
int mColGrpMeta_TimeStamp;
int mColGrpMeta_NxsFlags;
// int mColGrpMeta_SignSet;
int mColGrpMeta_NxsIdentity;
int mColGrpMeta_NxsHash;
int mColGrpMeta_KeySet;
int mColGrpMeta_SubscrFlag;
int mColGrpMeta_Pop;
int mColGrpMeta_MsgCount;
int mColGrpMeta_Status;
int mColGrpMeta_Name;
int mColGrpMeta_LastPost;
int mColGrpMeta_OrigGrpId;
int mColGrpMeta_ServString;
int mColGrpMeta_SignFlags;
int mColGrpMeta_CircleId;
int mColGrpMeta_CircleType;
int mColGrpMeta_InternCircle;
int mColGrpMeta_Originator;
int mColGrpMeta_AuthenFlags;
int mColGrpMeta_ParentGrpId;
int mColGrpMeta_RecvTs;
int mColGrpMeta_RepCutoff;
int mColGrpMeta_NxsDataLen;
// Group columns
int mColGrp_GrpId;
int mColGrp_NxsData;
int mColGrp_MetaData;
// Group id columns
int mColGrpId_GrpId;
// Msg id columns
int mColMsgId_MsgId;
std::string mServiceDir;
std::string mDbName;
std::string mDbPath;
uint16_t mServType;
RetroDb* mDb;

View File

@ -908,7 +908,7 @@ int RsGenExchange::validateGrp(RsNxsGrp* grp)
PrivacyBitPos pos = GRP_OPTION_BITS;
// Check required permissions, and allow them to sign it - if they want too - as well!
if (!(metaData.mAuthorId.isNull()) || checkAuthenFlag(pos, author_flag))
if ((!metaData.mAuthorId.isNull()) || checkAuthenFlag(pos, author_flag))
{
needIdentitySign = true;
std::cerr << "Needs Identity sign! (Service Flags)";
@ -1718,7 +1718,7 @@ void RsGenExchange::processGrpMetaChanges()
// process mask
bool ok = processGrpMask(g.grpId, g.val);
ok &= mDataStore->updateGroupMetaData(g) == 1;
ok = ok && (mDataStore->updateGroupMetaData(g) == 1);
if(ok)
{
@ -1761,6 +1761,12 @@ bool RsGenExchange::processGrpMask(const RsGxsGroupId& grpId, ContentValue &grpC
if((mit = grpMetaMap.find(grpId)) != grpMetaMap.end())
{
grpMeta = mit->second;
if (!grpMeta)
{
std::cerr << "RsGenExchange::processGrpMask() Ignore update for not existing grp id " << grpId.toStdString();
std::cerr << std::endl;
return false;
}
ok = true;
}
@ -2090,7 +2096,7 @@ void RsGenExchange::processGroupDelete()
gprIds.push_back(groupId);
mDataStore->removeGroups(gprIds);
toNotify.insert(std::make_pair(
token, GrpNote(true, RsGxsGroupId())));
token, GrpNote(true, groupId)));
}

View File

@ -59,7 +59,7 @@
const uint8_t RsTokenService::GXS_REQUEST_V2_STATUS_FINISHED_INCOMPLETE = 3;
const uint8_t RsTokenService::GXS_REQUEST_V2_STATUS_COMPLETE = 4;
const uint8_t RsTokenService::GXS_REQUEST_V2_STATUS_DONE = 5; // ONCE ALL DATA RETRIEVED.
const uint8_t RsTokenService::GXS_REQUEST_V2_STATUS_CANCELLED = 6;
/***********
* #define DATA_DEBUG 1
@ -367,13 +367,19 @@ uint32_t RsGxsDataAccess::requestStatus(uint32_t token)
return status;
}
bool RsGxsDataAccess::cancelRequest(const uint32_t& token)
{
return clearRequest(token);
RsStackMutex stack(mDataMutex); /****** LOCKED *****/
GxsRequest* req = locked_retrieveRequest(token);
if (!req)
{
return false;
}
req->status = GXS_REQUEST_V2_STATUS_CANCELLED;
return true;
}
bool RsGxsDataAccess::clearRequest(const uint32_t& token)
@ -389,7 +395,7 @@ bool RsGxsDataAccess::clearRequest(const uint32_t& token)
}
delete it->second;
mRequests.erase(it->first);
mRequests.erase(it);
return true;
}
@ -707,7 +713,6 @@ bool RsGxsDataAccess::getGroupList(const uint32_t& token, std::list<RsGxsGroupId
return true;
}
GxsRequest* RsGxsDataAccess::locked_retrieveRequest(const uint32_t& token)
{
@ -722,15 +727,84 @@ GxsRequest* RsGxsDataAccess::locked_retrieveRequest(const uint32_t& token)
void RsGxsDataAccess::processRequests()
{
std::list<uint32_t> toClear;
std::list<uint32_t>::iterator cit;
time_t now = time(NULL);
std::map<uint32_t, GxsRequest*>::iterator it;
{
RsStackMutex stack(mDataMutex); /******* LOCKED *******/
std::map<uint32_t, GxsRequest*>::iterator it;
// process status of the requests
for (it = mRequests.begin(); it != mRequests.end(); ++it)
{
GxsRequest* req = it->second;
switch (req->status)
{
case GXS_REQUEST_V2_STATUS_PENDING:
// process request later
break;
case GXS_REQUEST_V2_STATUS_PARTIAL:
// should not happen
req->status = GXS_REQUEST_V2_STATUS_COMPLETE;
break;
case GXS_REQUEST_V2_STATUS_DONE:
#ifdef DATA_DEBUG
std::cerr << "RsGxsDataAccess::processrequests() Clearing Done Request Token: " << req->token;
std::cerr << std::endl;
#endif
toClear.push_back(req->token);
break;
case GXS_REQUEST_V2_STATUS_CANCELLED:
#ifdef DATA_DEBUG
std::cerr << "RsGxsDataAccess::processrequests() Clearing Cancelled Request Token: " << req->token;
std::cerr << std::endl;
#endif
toClear.push_back(req->token);
break;
default:
if (now - req->reqTime > MAX_REQUEST_AGE)
{
#ifdef DATA_DEBUG
std::cerr << "RsGxsDataAccess::processrequests() Clearing Old Request Token: " << req->token;
std::cerr << std::endl;
#endif
toClear.push_back(req->token);
}
}
}
} // END OF MUTEX.
// clear requests
std::list<uint32_t>::iterator cit;
for (cit = toClear.begin(); cit != toClear.end(); ++cit)
{
clearRequest(*cit);
}
// process requests
while (true)
{
GxsRequest* req = NULL;
{
RsStackMutex stack(mDataMutex); /******* LOCKED *******/
// get the first pending request
for (it = mRequests.begin(); it != mRequests.end(); ++it)
{
GxsRequest* reqCheck = it->second;
if (reqCheck->status == GXS_REQUEST_V2_STATUS_PENDING)
{
req = reqCheck;
req->status = GXS_REQUEST_V2_STATUS_PARTIAL;
break;
}
}
} // END OF MUTEX.
if (!req) {
break;
}
GroupMetaReq* gmr;
GroupDataReq* gdr;
@ -739,101 +813,69 @@ void RsGxsDataAccess::processRequests()
MsgMetaReq* mmr;
MsgDataReq* mdr;
MsgIdReq* mir;
MsgRelatedInfoReq* mri;
GroupStatisticRequest* gsr;
ServiceStatisticRequest* ssr;
MsgRelatedInfoReq* mri;
GroupStatisticRequest* gsr;
ServiceStatisticRequest* ssr;
for(it = mRequests.begin(); it != mRequests.end(); ++it)
#ifdef DATA_DEBUG
std::cerr << "RsGxsDataAccess::processRequests() Processing Token: " << req->token << " Status: "
<< req->status << " ReqType: " << req->reqType << " Age: "
<< now - req->reqTime << std::endl;
#endif
/* PROCESS REQUEST! */
bool ok = false;
if((gmr = dynamic_cast<GroupMetaReq*>(req)) != NULL)
{
GxsRequest* req = it->second;
if (req->status == GXS_REQUEST_V2_STATUS_PENDING)
{
#ifdef DATA_DEBUG
std::cerr << "RsGxsDataAccess::processRequests() Processing Token: " << req->token << " Status: "
<< req->status << " ReqType: " << req->reqType << " Age: "
<< now - req->reqTime << std::endl;
#endif
req->status = GXS_REQUEST_V2_STATUS_PARTIAL;
/* PROCESS REQUEST! */
if((gmr = dynamic_cast<GroupMetaReq*>(req)) != NULL)
{
getGroupSummary(gmr);
}
else if((gdr = dynamic_cast<GroupDataReq*>(req)) != NULL)
{
getGroupData(gdr);
}
else if((gir = dynamic_cast<GroupIdReq*>(req)) != NULL)
{
getGroupList(gir);
}
else if((mmr = dynamic_cast<MsgMetaReq*>(req)) != NULL)
{
getMsgSummary(mmr);
}
else if((mdr = dynamic_cast<MsgDataReq*>(req)) != NULL)
{
getMsgData(mdr);
}
else if((mir = dynamic_cast<MsgIdReq*>(req)) != NULL)
{
getMsgList(mir);
}
else if((mri = dynamic_cast<MsgRelatedInfoReq*>(req)) != NULL)
{
getMsgRelatedInfo(mri);
}
else if((gsr = dynamic_cast<GroupStatisticRequest*>(req)) != NULL)
{
getGroupStatistic(gsr);
}
else if((ssr = dynamic_cast<ServiceStatisticRequest*>(req)) != NULL)
{
getServiceStatistic(ssr);
}
else
{
std::cerr << "RsGxsDataAccess::processRequests() Failed to process request, token: "
<< req->token << std::endl;
req->status = GXS_REQUEST_V2_STATUS_FAILED;
}
}
else if (req->status == GXS_REQUEST_V2_STATUS_PARTIAL)
{
req->status = GXS_REQUEST_V2_STATUS_COMPLETE;
}
else if (req->status == GXS_REQUEST_V2_STATUS_DONE)
{
#ifdef DATA_DEBUG
std::cerr << "RsGxsDataAccess::processrequests() Clearing Done Request Token: "
<< req->token;
std::cerr << std::endl;
#endif
toClear.push_back(req->token);
}
else if (now - req->reqTime > MAX_REQUEST_AGE)
{
#ifdef DATA_DEBUG
std::cerr << "RsGxsDataAccess::processrequests() Clearing Old Request Token: " << req->token;
std::cerr << std::endl;
#endif
toClear.push_back(req->token);
}
ok = getGroupSummary(gmr);
}
else if((gdr = dynamic_cast<GroupDataReq*>(req)) != NULL)
{
ok = getGroupData(gdr);
}
else if((gir = dynamic_cast<GroupIdReq*>(req)) != NULL)
{
ok = getGroupList(gir);
}
else if((mmr = dynamic_cast<MsgMetaReq*>(req)) != NULL)
{
ok = getMsgSummary(mmr);
}
else if((mdr = dynamic_cast<MsgDataReq*>(req)) != NULL)
{
ok = getMsgData(mdr);
}
else if((mir = dynamic_cast<MsgIdReq*>(req)) != NULL)
{
ok = getMsgList(mir);
}
else if((mri = dynamic_cast<MsgRelatedInfoReq*>(req)) != NULL)
{
ok = getMsgRelatedInfo(mri);
}
else if((gsr = dynamic_cast<GroupStatisticRequest*>(req)) != NULL)
{
ok = getGroupStatistic(gsr);
}
else if((ssr = dynamic_cast<ServiceStatisticRequest*>(req)) != NULL)
{
ok = getServiceStatistic(ssr);
}
else
{
std::cerr << "RsGxsDataAccess::processRequests() Failed to process request, token: "
<< req->token << std::endl;
}
} // END OF MUTEX.
for(cit = toClear.begin(); cit != toClear.end(); ++cit)
{
clearRequest(*cit);
{
RsStackMutex stack(mDataMutex); /******* LOCKED *******/
if (req->status == GXS_REQUEST_V2_STATUS_PARTIAL)
{
req->status = ok ? GXS_REQUEST_V2_STATUS_COMPLETE : GXS_REQUEST_V2_STATUS_FAILED;
}
} // END OF MUTEX.
}
return;
}
bool RsGxsDataAccess::getGroupStatistic(const uint32_t &token, GxsGroupStatistic &grpStatistic)
@ -1719,7 +1761,7 @@ bool RsGxsDataAccess::checkRequestStatus(const uint32_t& token,
GxsRequest* req = locked_retrieveRequest(token);
if(req == NULL)
if (req == NULL || req->status == GXS_REQUEST_V2_STATUS_CANCELLED)
return false;
anstype = req->ansType;

View File

@ -235,6 +235,10 @@ void RsGxsNetService::syncWithPeers()
std::set<RsPeerId> peers;
mNetMgr->getOnlineList(mServiceInfo.mServiceType, peers);
if (peers.empty()) {
// nothing to do
return;
}
std::set<RsPeerId>::iterator sit = peers.begin();
@ -1160,7 +1164,7 @@ void RsGxsNetService::data_tick()
//Start waiting as nothing to do in runup
usleep((int) (timeDelta * 1000 * 1000)); // timeDelta sec
if(mUpdateCounter >= 20)
if(mUpdateCounter >= 120) // 60 seconds
{
updateServerSyncTS();
mUpdateCounter = 0;
@ -2156,6 +2160,9 @@ void RsGxsNetService::locked_genReqGrpTransaction(NxsTransaction* tr)
std::cerr << "locked_genReqGrpTransaction(): " << std::endl;
#endif
std::map<RsGxsGroupId, RsGxsGrpMetaData*> grpMetaMap;
std::map<RsGxsGroupId, RsGxsGrpMetaData*>::const_iterator metaIter;
std::list<RsNxsSyncGrpItem*> grpItemL;
std::list<RsNxsItem*>::iterator lit = tr->mItems.begin();
@ -2165,6 +2172,7 @@ void RsGxsNetService::locked_genReqGrpTransaction(NxsTransaction* tr)
if(item)
{
grpItemL.push_back(item);
grpMetaMap[item->grpId] = NULL;
}else
{
#ifdef NXS_NET_DEBUG
@ -2174,8 +2182,11 @@ void RsGxsNetService::locked_genReqGrpTransaction(NxsTransaction* tr)
}
}
std::map<RsGxsGroupId, RsGxsGrpMetaData*> grpMetaMap;
std::map<RsGxsGroupId, RsGxsGrpMetaData*>::const_iterator metaIter;
if (grpItemL.empty())
{
return;
}
mDataStore->retrieveGxsGrpMetaData(grpMetaMap);
// now do compare and add loop
@ -2195,7 +2206,7 @@ void RsGxsNetService::locked_genReqGrpTransaction(NxsTransaction* tr)
metaIter = grpMetaMap.find(grpId);
bool haveItem = false;
bool latestVersion = false;
if (metaIter != grpMetaMap.end())
if (metaIter != grpMetaMap.end() && metaIter->second)
{
haveItem = true;
latestVersion = grpSyncItem->publishTs > metaIter->second->mPublishTs;

View File

@ -1,12 +1,16 @@
!include("../../retroshare.pri"): error("Could not include file ../../retroshare.pri")
TEMPLATE = lib
CONFIG += staticlib bitdht
CONFIG += create_prl
CONFIG -= qt
TARGET = retroshare
TARGET_PRL = libretroshare
#GXS Stuff.
# This should be disabled for releases until further notice.
CONFIG += gxs debug
CONFIG += gxs
#CONFIG += dsdv
@ -19,7 +23,6 @@ profiling {
#QMAKE_CFLAGS += -Werror
#QMAKE_CXXFLAGS += -Werror
CONFIG += debug
debug {
# DEFINES *= DEBUG
# DEFINES *= OPENDHT_DEBUG DHT_DEBUG CONN_DEBUG DEBUG_UDP_SORTER P3DISC_DEBUG DEBUG_UDP_LAYER FT_DEBUG EXTADDRSEARCH_DEBUG
@ -81,6 +84,8 @@ SOURCES += tcponudp/udppeer.cc \
# The next line is for compliance with debian packages. Keep it!
INCLUDEPATH += ../libbitdht
DEFINES *= RS_USE_BITDHT
PRE_TARGETDEPS *= ../../libbitdht/src/lib/libbitdht.a
LIBS += ../../libbitdht/src/lib/libbitdht.a
}
@ -120,10 +125,6 @@ HEADERS += $$PUBLIC_HEADERS
################################# Linux ##########################################
linux-* {
isEmpty(PREFIX) { PREFIX = /usr }
isEmpty(INC_DIR) { INC_DIR = $${PREFIX}/include/retroshare/ }
isEmpty(LIB_DIR) { LIB_DIR = $${PREFIX}/lib/ }
# These two lines fixe compilation on ubuntu natty. Probably a ubuntu packaging error.
INCLUDEPATH += $$system(pkg-config --cflags glib-2.0 | sed -e "s/-I//g")
@ -140,27 +141,25 @@ linux-* {
DEPENDPATH += . $${SSL_DIR} $${UPNP_DIR}
INCLUDEPATH += . $${SSL_DIR} $${UPNP_DIR}
# where to put the shared library itself
target.path = $$LIB_DIR
INSTALLS *= target
SQLCIPHER_OK = $$system(pkg-config --exists sqlcipher && echo yes)
isEmpty(SQLCIPHER_OK) {
# We need a explicit path here, to force using the home version of sqlite3 that really encrypts the database.
!exists(../../../lib/sqlcipher/.libs/libsqlcipher.a) {
message(libsqlcipher.a not found. Compilation will not use SQLCIPER. Database will be unencrypted.)
DEFINES *= NO_SQLCIPHER
contains(CONFIG, NO_SQLCIPHER) {
DEFINES *= NO_SQLCIPHER
LIBS *= -lsqlite3
} else {
SQLCIPHER_OK = $$system(pkg-config --exists sqlcipher && echo yes)
isEmpty(SQLCIPHER_OK) {
# We need a explicit path here, to force using the home version of sqlite3 that really encrypts the database.
exists(../../../lib/sqlcipher/.libs/libsqlcipher.a) {
LIBS += ../../../lib/sqlcipher/.libs/libsqlcipher.a
DEPENDPATH += ../../../lib/
INCLUDEPATH += ../../../lib/
} else {
error("libsqlcipher is not installed and libsqlcipher.a not found. SQLCIPHER is necessary for encrypted database, to build with unencrypted database, run: qmake CONFIG+=NO_SQLCIPHER")
}
} else {
DEPENDPATH += ../../../lib/
INCLUDEPATH += ../../../lib/
LIBS *= -lsqlcipher
}
}
# where to put the librarys interface
include_rsiface.path = $${INC_DIR}
include_rsiface.files = $$PUBLIC_HEADERS
INSTALLS += include_rsiface
#CONFIG += version_detail_bash_script
@ -179,6 +178,22 @@ linux-* {
DEFINES *= UBUNTU
INCLUDEPATH += /usr/include/glib-2.0/ /usr/lib/glib-2.0/include
LIBS *= -lgnome-keyring
LIBS *= -lssl -lupnp -lixml
LIBS *= -lcrypto -lz -lpthread
}
unix {
DEFINES *= LIB_DIR=\"\\\"$${LIB_DIR}\\\"\"
DEFINES *= DATA_DIR=\"\\\"$${DATA_DIR}\\\"\"
## where to put the librarys interface
#include_rsiface.path = "$${INC_DIR}"
#include_rsiface.files = $$PUBLIC_HEADERS
#INSTALLS += include_rsiface
## where to put the shared library itself
#target.path = "$$LIB_DIR"
#INSTALLS *= target
}
linux-g++ {
@ -190,9 +205,16 @@ linux-g++-64 {
}
version_detail_bash_script {
QMAKE_EXTRA_TARGETS += write_version_detail
PRE_TARGETDEPS = write_version_detail
write_version_detail.commands = ./version_detail.sh
linux-* {
QMAKE_EXTRA_TARGETS += write_version_detail
PRE_TARGETDEPS = write_version_detail
write_version_detail.commands = ./version_detail.sh
}
win32 {
QMAKE_EXTRA_TARGETS += write_version_detail
PRE_TARGETDEPS = write_version_detail
write_version_detail.commands = $$PWD/version_detail.bat
}
}
#################### Cross compilation for windows under Linux ####################
@ -318,6 +340,10 @@ openbsd-* {
################################### COMMON stuff ##################################
# openpgpsdk
PRE_TARGETDEPS *= ../../openpgpsdk/src/lib/libops.a
LIBS *= ../../openpgpsdk/src/lib/libops.a -lbz2
HEADERS += dbase/cachestrapper.h \
dbase/fimonitor.h \
dbase/findex.h \
@ -477,6 +503,7 @@ HEADERS += util/folderiterator.h \
util/rsmemcache.h \
util/rstickevent.h \
util/rsrecogn.h \
util/rsscopetimer.h
SOURCES += dbase/cachestrapper.cc \
dbase/fimonitor.cc \
@ -626,6 +653,7 @@ SOURCES += util/folderiterator.cc \
util/rsrandom.cc \
util/rstickevent.cc \
util/rsrecogn.cc \
util/rsscopetimer.cc
upnp_miniupnpc {

View File

@ -1,13 +1,12 @@
set QTDIR=C:\Qt\4.8.6
set MINGW=C:\MinGW
set GIT=C:\Program Files\Git
set PATH=%QTDIR%\bin;%MINGW%\bin;%PATH%
set PATH=%QTDIR%\bin;%MINGW%\bin;;%GIT%\bin;%PATH%
"c:\Program Files\TortoiseSVN\bin\SubWCRev" . retroshare\rsversion.in retroshare\rsversion.h
mingw32-make clean
mingw32-make clean
qmake libretroshare.pro
qmake libretroshare.pro "CONFIG+=version_detail_bash_script"
mingw32-make

View File

@ -99,7 +99,17 @@ void p3HistoryMgr::addMessage(const ChatMessage& cm)
enabled = true;
}
// not handled: private distant chat
if (cm.chat_id.isGxsId() && mPrivateEnable == true) {
if (cm.incoming) {
peerName = cm.chat_id.toGxsId().toStdString();
} else {
uint32_t status;
RsGxsId from_gxs_id;
if (rsMsgs->getDistantChatStatus(cm.chat_id.toGxsId(), status, &from_gxs_id))
peerName = from_gxs_id.toStdString();
}
enabled = true;
}
if(enabled == false)
return;
@ -115,11 +125,6 @@ void p3HistoryMgr::addMessage(const ChatMessage& cm)
item->sendTime = cm.sendTime;
item->recvTime = cm.recvTime;
if (cm.chat_id.isLobbyId()) {
// disable save to disc for chat lobbies until they are saved
item->saveToDisc = false;
}
item->message = cm.msg ;
//librs::util::ConvertUtf16ToUtf8(chatItem->message, item->message);
@ -392,7 +397,10 @@ bool p3HistoryMgr::chatIdToVirtualPeerId(ChatId chat_id, RsPeerId &peer_id)
return true;
}
// not handled: private distant chat
if (chat_id.isGxsId()) {
peer_id = RsPeerId(chat_id.toGxsId());
return true;
}
return false;
}
@ -428,6 +436,9 @@ bool p3HistoryMgr::getMessages(const ChatId &chatId, std::list<HistoryMsg> &msgs
if (chatId.isLobbyId() && mLobbyEnable == true) {
enabled = true;
}
if (chatId.isGxsId() && mPrivateEnable == true) {
enabled = true;
}
if(enabled == false)
return false;

View File

@ -1322,7 +1322,9 @@ int pqissl::Authorise_SSL_Connection()
if(!rsBanList->isAddressAccepted(remote_addr,checking_flags,&check_result))
{
std::cerr << "(SS) connection attempt from banned IP address " << sockaddr_storage_iptostring(remote_addr) << ". Refusing it. Reason: " << check_result << ". Attack??" << std::endl;
std::cerr << "(SS) refusing connection attempt from IP address " << sockaddr_storage_iptostring(remote_addr) << ". Reason: " <<
((check_result == RSBANLIST_CHECK_RESULT_NOT_WHITELISTED)?"not whitelisted (peer requires whitelist)":"blacklisted") << std::endl;
RsServer::notify()->AddFeedItem(RS_FEED_ITEM_SEC_IP_BLACKLISTED, PeerId().toStdString(), sockaddr_storage_iptostring(remote_addr), "", "", check_result);
reset_locked();
return 0 ;
@ -1825,6 +1827,12 @@ bool pqissl::moretoread(uint32_t usec)
}
#endif
if(sockfd == -1)
{
std::cerr << "pqissl::moretoread(): socket is invalid or closed." << std::endl;
return 0 ;
}
fd_set ReadFDs, WriteFDs, ExceptFDs;
FD_ZERO(&ReadFDs);
FD_ZERO(&WriteFDs);
@ -1887,6 +1895,12 @@ bool pqissl::cansend(uint32_t usec)
"pqissl::cansend() polling socket!");
#endif
if(sockfd == -1)
{
std::cerr << "pqissl::cansend(): socket is invalid or closed." << std::endl;
return 0 ;
}
// Interestingly - This code might be portable....
fd_set ReadFDs, WriteFDs, ExceptFDs;

0
libretroshare/src/retroshare/rsexpr.h Executable file → Normal file
View File

View File

@ -28,6 +28,7 @@ template<int n> class t_RsFlags32
inline t_RsFlags32<n> operator| (const t_RsFlags32<n>& f) const { return t_RsFlags32<n>(_bits | f._bits) ; }
inline t_RsFlags32<n> operator^ (const t_RsFlags32<n>& f) const { return t_RsFlags32<n>(_bits ^ f._bits) ; }
inline t_RsFlags32<n> operator* (const t_RsFlags32<n>& f) const { return t_RsFlags32<n>(_bits & f._bits) ; }
inline bool operator!=(const t_RsFlags32<n>& f) const { return _bits != f._bits ; }
inline bool operator==(const t_RsFlags32<n>& f) const { return _bits == f._bits ; }

View File

@ -90,9 +90,10 @@
#define RS_CHAT_TYPE_DISTANT 4
const ChatLobbyFlags RS_CHAT_LOBBY_FLAGS_AUTO_SUBSCRIBE( 0x00000001 ) ;
const ChatLobbyFlags RS_CHAT_LOBBY_FLAGS_ANONYMOUS ( 0x00000002 ) ;
const ChatLobbyFlags RS_CHAT_LOBBY_FLAGS_deprecated ( 0x00000002 ) ;
const ChatLobbyFlags RS_CHAT_LOBBY_FLAGS_PUBLIC ( 0x00000004 ) ;
const ChatLobbyFlags RS_CHAT_LOBBY_FLAGS_CHALLENGE ( 0x00000008 ) ;
const ChatLobbyFlags RS_CHAT_LOBBY_FLAGS_PGP_SIGNED ( 0x00000010 ) ; // requires the signing ID to be PGP-linked. Avoids anonymous crap.
typedef uint64_t ChatLobbyId ;
typedef uint64_t ChatLobbyMsgId ;

View File

@ -121,6 +121,7 @@ public:
static const uint8_t GXS_REQUEST_V2_STATUS_FINISHED_INCOMPLETE;
static const uint8_t GXS_REQUEST_V2_STATUS_COMPLETE;
static const uint8_t GXS_REQUEST_V2_STATUS_DONE; // ONCE ALL DATA RETRIEVED.
static const uint8_t GXS_REQUEST_V2_STATUS_CANCELLED;
public:

View File

@ -2,4 +2,11 @@
#define RS_MINOR_VERSION 6
#define RS_BUILD_NUMBER 0
#define RS_BUILD_NUMBER_ADD "x" // <-- do we need this?
#define RS_REVISION_NUMBER 0001
// The revision number should be the 4 first bytes of the git revision hash, which is obtained using:
// git log --pretty="%H" | head -1 | cut -c1-8
//
// Do not forget the 0x, since the RS_REVISION_NUMBER should be an integer.
//
#define RS_REVISION_STRING "01234567"
#define RS_REVISION_NUMBER 0x01234567

View File

@ -2,4 +2,11 @@
#define RS_MINOR_VERSION 6
#define RS_BUILD_NUMBER 0
#define RS_BUILD_NUMBER_ADD "x" // <-- do we need this?
#define RS_REVISION_NUMBER $WCREV$
// The revision number should be the 4 first bytes of the git revision hash, which is obtained using:
// git log --pretty="%H" | head -1 | cut -c1-8
//
// Do not forget the 0x, since the RS_REVISION_NUMBER should be an integer.
//
#define RS_REVISION_STRING "$REV$"
#define RS_REVISION_NUMBER 0x$REV$

View File

@ -781,9 +781,12 @@ static bool checkAccount(std::string accountdir, AccountDetails &account,std::ma
std::cerr << "getRetroshareDataDirectory() BSD: " << dataDirectory;
#else
/* For Linux, we have a fixed standard data directory */
dataDirectory = "/usr/share/RetroShare06";
std::cerr << "getRetroshareDataDirectory() Linux: " << dataDirectory;
/* For Linux, the data directory is set in libretroshare.pro */
#ifndef DATA_DIR
#error DATA_DIR variable not set. Cannot compile.
#endif
dataDirectory = DATA_DIR;
std::cerr << "getRetroshareDataDirectory() Linux: " << dataDirectory << std::endl;
#endif
#else

View File

@ -1251,7 +1251,7 @@ int RsServer::StartupRetroShare()
std::vector<std::string> plugins_directories ;
#ifndef WINDOWS_SYS
plugins_directories.push_back(std::string("/usr/lib/retroshare/extensions6/")) ;
plugins_directories.push_back(std::string(LIB_DIR) + "/retroshare/extensions6/") ;
#endif
std::string extensions_dir = rsAccounts->PathBaseDirectory() + "/extensions6/" ;
plugins_directories.push_back(extensions_dir) ;

View File

@ -602,6 +602,11 @@ bool GetTlvString(void *data, uint32_t size, uint32_t *offset,
in = std::string(strdata, strsize);
}
#ifdef TLV_BASE_DEBUG
if(type == TLV_TYPE_STR_MSG)
std::cerr << "Checking string \"" << in << "\"" << std::endl;
#endif
// Check for string content. We want to avoid possible lol bombs as soon as possible.
static const int number_of_suspiscious_strings = 4 ;

View File

@ -649,7 +649,6 @@ bool RsTlvKeySignatureSet::GetTlv(void *data, uint32_t size, uint32_t *offset)
/* get the next type */
uint16_t tlvsubtype = GetTlvType( &(((uint8_t *) data)[*offset]) );
SignType currType;
switch(tlvsubtype)
{
@ -659,16 +658,13 @@ bool RsTlvKeySignatureSet::GetTlv(void *data, uint32_t size, uint32_t *offset)
ok &= sign.GetTlv(data, size, offset);
if (ok)
{
keySignSet[currType] = sign;
keySignSet[sign_type] = sign;
}
}
break;
case TLV_TYPE_KEYSIGNATURETYPE:
{
ok = GetTlvUInt32(data, size, offset, TLV_TYPE_KEYSIGNATURETYPE, &sign_type);
if(ok)
currType = sign_type;
}
break;
default:

View File

@ -718,7 +718,9 @@ bool p3IdService::validateData(const uint8_t *data,uint32_t data_size,const RsTl
if(signature_key.keyData.bin_data == NULL)
{
#ifdef DEBUG_IDS
std::cerr << "(EE) Cannot validate signature for unknown key " << signature.keyId << std::endl;
#endif
signing_error = RS_GIXS_ERROR_KEY_NOT_AVAILABLE ;
return false;
}

View File

@ -1,2 +0,0 @@
@echo off
"D:\Programme\TortoiseSVN\bin\SubWCRev" . util\rsversion.in util\rsversion.h

View File

@ -183,12 +183,11 @@ RetroCursor* RetroDb::sqlQuery(const std::string& tableName, const std::list<std
std::list<std::string>::const_iterator it = columns.begin();
for(; it != columns.end(); ++it){
columnSelection += *it;
++it;
if(it != columns.end())
if (it != columns.begin()) {
columnSelection += ",";
--it;
}
columnSelection += *it;
}
// construct query
@ -265,6 +264,32 @@ std::string RetroDb::getKey() const
return mKey;
}
bool RetroDb::beginTransaction()
{
if (!isOpen()) {
return false;
}
return execSQL("BEGIN;");
}
bool RetroDb::commitTransaction()
{
if (!isOpen()) {
return false;
}
return execSQL("COMMIT;");
}
bool RetroDb::rollbackTransaction()
{
if (!isOpen()) {
return false;
}
return execSQL("ROLLBACK;");
}
bool RetroDb::execSQL_bind(const std::string &query, std::list<RetroBind*> &paramBindings){
// prepare statement
@ -532,6 +557,43 @@ bool RetroDb::sqlUpdate(const std::string &tableName, std::string whereClause, c
return execSQL_bind(sqlQuery, paramBindings);
}
bool RetroDb::tableExists(const std::string &tableName)
{
if (!isOpen()) {
return false;
}
std::string sqlQuery = "PRAGMA table_info(" + tableName + ");";
bool result = false;
sqlite3_stmt* stmt = NULL;
int rc = sqlite3_prepare_v2(mDb, sqlQuery.c_str(), sqlQuery.length(), &stmt, NULL);
if (rc == SQLITE_OK) {
rc = sqlite3_step(stmt);
switch (rc) {
case SQLITE_ROW:
result = true;
break;
case SQLITE_DONE:
break;
default:
std::cerr << "RetroDb::tableExists(): Error executing statement (code: " << rc << ")"
<< std::endl;
return false;
}
} else {
std::cerr << "RetroDb::tableExists(): Error preparing statement\n";
std::cerr << "Error code: " << sqlite3_errmsg(mDb)
<< std::endl;
}
if (stmt) {
sqlite3_finalize(stmt);
}
return result;
}
/********************** RetroCursor ************************/

View File

@ -38,8 +38,6 @@
#include "contentvalue.h"
class RetroCursor;
/*!
@ -90,7 +88,23 @@ public:
/* modifying db */
public:
/*!
* Start transaction
* @return true/false
*/
bool beginTransaction();
/*!
* Commit transaction
* @return true/false
*/
bool commitTransaction();
/*!
* Rollback transaction
* @return true/false
*/
bool rollbackTransaction();
/*!
* To a make query which do not return a result \n
@ -153,22 +167,13 @@ public:
*/
void vacuum();
/*!
* Build the "VALUE" part of an insertiong sql query
* @param parameter contains place holder query
* @param paramBindings
* Check if table exist in database
* @param tableName table to check
* @return true/false
*/
void buildInsertQueryValue(const std::map<std::string, uint8_t> keyMap, const ContentValue& cv,
std::string& parameter, std::list<RetroBind*>& paramBindings);
bool tableExists(const std::string& tableName);
/*!
* Build the "VALUE" part of an insertiong sql query
* @param parameter contains place holder query
* @param paramBindings
*/
void buildUpdateQueryValue(const std::map<std::string, uint8_t> keyMap, const ContentValue& cv,
std::string& parameter, std::list<RetroBind*>& paramBindings);
public:
static const int OPEN_READONLY;
@ -179,6 +184,22 @@ private:
bool execSQL_bind(const std::string &query, std::list<RetroBind*>& blobs);
/*!
* Build the "VALUE" part of an insertiong sql query
* @param parameter contains place holder query
* @param paramBindings
*/
void buildInsertQueryValue(const std::map<std::string, uint8_t> keyMap, const ContentValue& cv,
std::string& parameter, std::list<RetroBind*>& paramBindings);
/*!
* Build the "VALUE" part of an insertiong sql query
* @param parameter contains place holder query
* @param paramBindings
*/
void buildUpdateQueryValue(const std::map<std::string, uint8_t> keyMap, const ContentValue& cv,
std::string& parameter, std::list<RetroBind*>& paramBindings);
private:
sqlite3* mDb;

View File

@ -0,0 +1,59 @@
/*
* libretroshare/src/util: rsscopetimer.cc
*
* 3P/PQI network interface for RetroShare.
*
* Copyright 2013- by Cyril Soler
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License Version 2 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*
* Please report all bugs and problems to "retroshare@lunamutt.com".
*
*/
#include <iostream>
#include <sys/time.h>
#include "rsscopetimer.h"
RsScopeTimer::RsScopeTimer(const std::string& name)
{
_name = name ;
start();
}
RsScopeTimer::~RsScopeTimer()
{
if (!_name.empty())
{
std::cerr << "Time for \"" << _name << "\": " << duration() << std::endl;
}
}
double RsScopeTimer::currentTime()
{
timeval tv ;
gettimeofday(&tv,NULL) ;
return (tv.tv_sec % 10000) + tv.tv_usec/1000000.0f ; // the %1000 is here to allow double precision to cover the decimals.
}
void RsScopeTimer::start()
{
_seconds = currentTime();
}
double RsScopeTimer::duration()
{
return currentTime() - _seconds;
}

View File

@ -31,29 +31,22 @@
// callToMeasure() ;
// }
//
#include <sys/time.h>
#include <string>
class RsScopeTimer
{
public:
RsScopeTimer(const std::string& name)
{
timeval tv ;
gettimeofday(&tv,NULL) ;
_seconds = (tv.tv_sec % 10000) + tv.tv_usec/1000000.0f ; // the %1000 is here to allow double precision to cover the decimals.
_name = name ;
}
public:
RsScopeTimer(const std::string& name);
~RsScopeTimer();
~RsScopeTimer()
{
timeval tv ;
gettimeofday(&tv,NULL) ;
double ss = (tv.tv_sec % 10000) + tv.tv_usec/1000000.0f ;
void start();
double duration();
std::cerr << "Time for \"" << _name << "\": " << ss - _seconds << std::endl;
}
private:
double currentTime();
private:
std::string _name ;
double _seconds ;
private:
std::string _name ;
double _seconds ;
};

View File

@ -12,7 +12,7 @@
std::string RsUtil::retroshareVersion()
{
std::string version;
rs_sprintf(version, "%d.%d.%d%s Revision %d", RS_MAJOR_VERSION, RS_MINOR_VERSION, RS_BUILD_NUMBER, RS_BUILD_NUMBER_ADD, RS_REVISION_NUMBER);
rs_sprintf(version, "%d.%d.%d%s Revision %08x", RS_MAJOR_VERSION, RS_MINOR_VERSION, RS_BUILD_NUMBER, RS_BUILD_NUMBER_ADD, RS_REVISION_NUMBER);
return version;
}

View File

@ -0,0 +1,48 @@
@echo off
setlocal enabledelayedexpansion
:: Search git in PATH
set GitPath=
for %%P in ("%PATH:;=" "%") do (
if exist "%%~P.\git.exe" (
set GitPath=%%~P
goto found_git
)
)
:found_git
if "%GitPath%"=="" (
echo git not found in PATH. Version update cancelled.
endlocal
exit /B 0
)
echo Update version
:: Retrieve git information
set RsHash=
pushd "%~dp0"
for /f "tokens=1*" %%A in ('"git log --pretty=format:"%%H" --max-count=1"') do set RsHash=%%A
popd
if "%RsHash%"=="" (
echo Git hash not found.
endlocal
exit /B 1
)
:: Create file
set InFile=%~dp0retroshare\rsversion.in
set OutFile=%~dp0retroshare\rsversion.h
if exist "%OutFile%" del /Q "%OutFile%"
for /f "tokens=* delims= " %%a in (%InFile%) do (
set line=%%a
set line=!line:$REV$=%RsHash:~0,8%!
echo !line!>>"%OutFile%"
)
endlocal
exit /B 0

View File

@ -5,24 +5,24 @@ set +e
if ( git log -n 1 &> /dev/null); then
#retrieve git information
version="git : $(git status | grep branch | cut -c 13-) $(git log -n 1 | grep commit | cut -c 8-)"
version="$(git log --pretty=format:"%H" | head -1 | cut -c1-8)"
fi
if ( git log -n 1 | grep svn &> /dev/null); then
#retrieve git svn information
version="${version} svn : $(git log -n 1 | awk '/svn/ {print $2}' | head -1 | sed 's/.*@//')"
elif ( git log -n 10 | grep svn &> /dev/null); then
#retrieve git svn information
version="${version} svn closest version : $(git log -n 10 | awk '/svn/ {print $2}' | head -1 | sed 's/.*@//')"
fi
# if ( git log -n 1 | grep svn &> /dev/null); then
# #retrieve git svn information
# version="${version} svn : $(git log -n 1 | awk '/svn/ {print $2}' | head -1 | sed 's/.*@//')"
# elif ( git log -n 10 | grep svn &> /dev/null); then
# #retrieve git svn information
# version="${version} svn closest version : $(git log -n 10 | awk '/svn/ {print $2}' | head -1 | sed 's/.*@//')"
# fi
if ( svn info &> /dev/null); then
version=$(svn info | awk '/^Revision:/ {print $NF}')
fi
# if ( svn info &> /dev/null); then
# version=$(svn info | awk '/^Revision:/ {print $NF}')
# fi
if [[ ${version} != '' ]]; then
echo "Writing version to retroshare/rsversion.h : ${version}"
sed -e "s%RS_REVISION_NUMBER.*%RS_REVISION_NUMBER ${version}%" retroshare/rsversion.in >retroshare/rsversion.h
sed -e "s%RS_REVISION_NUMBER.*%RS_REVISION_NUMBER 0x${version}%" retroshare/rsversion.in >retroshare/rsversion.h
fi
echo "script version_detail.sh finished normally"
exit 0

View File

@ -1,8 +1,10 @@
!include("../../retroshare.pri"): error("Could not include file ../../retroshare.pri")
TEMPLATE = lib
win32 {
CONFIG += staticlib
macx {
CONFIG = staticlib
} else {
CONFIG = staticlib debug
CONFIG += staticlib
}
DEFINES *= OPENSSL_NO_IDEA

View File

@ -1,8 +1,16 @@
!include("../../retroshare.pri"): error("Could not include file ../../retroshare.pri")
TEMPLATE = lib
CONFIG *= plugin
DEPENDPATH += ../../libretroshare/src/ ../../retroshare-gui/src/
INCLUDEPATH += ../../libretroshare/src/ ../../retroshare-gui/src/
unix {
target.path = "$${LIB_DIR}/retroshare/extensions6"
INSTALLS += target
}
linux-g++ {
LIBS *= -ldl
}
@ -20,6 +28,9 @@ win32 {
QMAKE_CFLAGS += -Wextra
QMAKE_CXXFLAGS += -Wextra
# solve linker warnings because of the order of the libraries
QMAKE_LFLAGS += -Wl,--start-group
OBJECTS_DIR = temp/obj
MOC_DIR = temp/moc
RCC_DIR = temp/qrc

View File

@ -92,8 +92,7 @@ linux-* {
win32 {
DEFINES += CURL_STATICLIB LIBXML_STATIC LIBXSLT_STATIC LIBEXSLT_STATIC
# Change order of the libraries
LIBS = -lcurl -lxml2 -lz -lxslt -lws2_32 -lwldap32 -lssl -lcrypto -lgdi32 -lwsock32 $${LIBS}
LIBS += -lcurl -lxml2 -lz -lxslt -lws2_32 -lwldap32 -lssl -lcrypto
}
openbsd-* {

View File

@ -1,122 +0,0 @@
/****************************************************************
* RetroShare is distributed under the following license:
*
* Copyright (C) 2008 Robert Fernie
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
****************************************************************/
#include <gui/common/vmessagebox.h>
#include "AddLinksDialog.h"
//#include <gui/RetroShareLink.h>
#include "rsrank.h"
/* Images for context menu icons */
#define IMAGE_EXPORTFRIEND ":/images/exportpeers_16x16.png"
#define IMAGE_GREAT ":/images/filerating5.png"
#define IMAGE_GOOD ":/images/filerating4.png"
#define IMAGE_OK ":/images/filerating3.png"
#define IMAGE_SUX ":/images/filerating2.png"
#define IMAGE_BADLINK ":/images/filerating1.png"
/** Constructor */
AddLinksDialog::AddLinksDialog(QString url, QWidget *parent)
: QDialog(parent)
{
/* Invoke the Qt Designer generated object setup routine */
ui.setupUi(this);
ui.headerFrame->setHeaderImage(QPixmap(":/images/irkick.png"));
ui.headerFrame->setHeaderText(tr("Add Link to Cloud"));
setAttribute ( Qt::WA_DeleteOnClose, true );
/* add button */
connect(ui.addLinkButton, SIGNAL(clicked()), this, SLOT(addLinkComment()));
connect(ui.closepushButton, SIGNAL(clicked()), this, SLOT(close()));
connect( ui.anonBox, SIGNAL( stateChanged ( int ) ), this, SLOT( load ( void ) ) );
ui.linkLineEdit->setText(url);
// RetroShareLink link(url);
// if(link.valid() && link.type() == RetroShareLink::TYPE_FILE)
// ui.titleLineEdit->setText(link.name());
// else
ui.titleLineEdit->setText(tr("New Link"));
load();
}
int AddLinksDialog::IndexToScore(int index)
{
if ((index == -1) || (index > 4))
return 0;
int score = 2 - index;
return score;
}
void AddLinksDialog::addLinkComment()
{
/* get the title / link / comment */
QString title = ui.titleLineEdit->text();
QString link = ui.linkLineEdit->text();
QString comment = ui.linkTextEdit->toPlainText();
int32_t score = AddLinksDialog::IndexToScore(ui.scoreBox->currentIndex());
if ((link == "") || (title == ""))
{
QMessageBox::warning(NULL, tr("Add Link Failure"), tr("Missing Link and/or Title"), QMessageBox::Ok);
/* can't do anything */
return;
}
/* add it either way */
if (ui.anonBox->isChecked())
{
rsRanks->anonRankMsg("", link.toStdWString(), title.toStdWString());
}
else
{
rsRanks->newRankMsg(link.toStdWString(),
title.toStdWString(),
comment.toStdWString(), score);
}
close();
}
void AddLinksDialog::load()
{
if (ui.anonBox->isChecked())
{
/* disable comment + score */
ui.scoreBox->setEnabled(false);
ui.linkTextEdit->setEnabled(false);
/* done! */
return;
}
else
{
/* enable comment + score */
ui.scoreBox->setEnabled(true);
ui.linkTextEdit->setEnabled(true);
}
}

View File

@ -1,48 +0,0 @@
/****************************************************************
* RetroShare GUI is distributed under the following license:
*
* Copyright (C) 2008 Robert Fernie
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
****************************************************************/
#ifndef _ADDLINKS_DIALOG_H
#define _ADDLINKS_DIALOG_H
#include "ui_AddLinksDialog.h"
class AddLinksDialog : public QDialog
{
Q_OBJECT
public:
/** Default Constructor */
AddLinksDialog(QString url, QWidget *parent = 0);
/** Default Destructor */
static int IndexToScore(int index);
public slots:
void addLinkComment();
void load();
private:
/** Qt Designer generated object */
Ui::AddLinksDialog ui;
};
#endif

View File

@ -1,244 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AddLinksDialog</class>
<widget class="QDialog" name="AddLinksDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>614</width>
<height>415</height>
</rect>
</property>
<property name="windowTitle">
<string>Add Link</string>
</property>
<property name="windowIcon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/rstray3.png</normaloff>:/images/rstray3.png</iconset>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<property name="margin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0" colspan="4">
<widget class="HeaderFrame" name="headerFrame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
</widget>
</item>
<item row="1" column="0" colspan="4">
<widget class="QFrame" name="frame_2">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="1" column="1">
<widget class="QPushButton" name="closepushButton">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="addLinkButton">
<property name="text">
<string>Add Link</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
<property name="default">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>375</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0" colspan="3">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Add a new Link</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="spacing">
<number>1</number>
</property>
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>Title:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_7">
<property name="text">
<string>Url:</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLineEdit" name="titleLineEdit"/>
</item>
<item>
<widget class="QLineEdit" name="linkLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QFrame" name="buttonFrame">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>40</height>
</size>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QCheckBox" name="anonBox">
<property name="text">
<string>Add Anonymous Link</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="scoreBox">
<item>
<property name="text">
<string>+2 Great!</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/filerating5.png</normaloff>:/images/filerating5.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>+1 Good</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/filerating4.png</normaloff>:/images/filerating4.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>0 Okay</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/filerating3.png</normaloff>:/images/filerating3.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>-1 Sux</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/filerating2.png</normaloff>:/images/filerating2.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>-2 Bad Link</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/filerating1.png</normaloff>:/images/filerating1.png</iconset>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>299</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item row="2" column="0">
<widget class="QTextEdit" name="linkTextEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>HeaderFrame</class>
<extends>QFrame</extends>
<header>gui/common/HeaderFrame.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources>
<include location="../../retroshare-gui/src/gui/images.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -1,37 +0,0 @@
!include("../Common/retroshare_plugin.pri"): error("Could not include file ../Common/retroshare_plugin.pri")
CONFIG += qt uic qrc resources
greaterThan(QT_MAJOR_VERSION, 4) {
# Qt 5
QT += widgets
}
SOURCES = p3ranking.cc LinksDialog.cpp rsrankitems.cc AddLinksDialog.cpp LinksCloudPlugin.cpp
HEADERS = rsrank.h p3ranking.h LinksDialog.h rsrankitems.h AddLinksDialog.h LinksCloudPlugin.h
FORMS = LinksDialog.ui AddLinksDialog.ui
TARGET = LinksCloud
RESOURCES = LinksCloud_images.qrc lang/LinksCloud_lang.qrc
TRANSLATIONS += \
lang/LinksCloud_ca_ES.ts \
lang/LinksCloud_cs.ts \
lang/LinksCloud_da.ts \
lang/LinksCloud_de.ts \
lang/LinksCloud_el.ts \
lang/LinksCloud_en.ts \
lang/LinksCloud_es.ts \
lang/LinksCloud_fi.ts \
lang/LinksCloud_fr.ts \
lang/LinksCloud_hu.ts \
lang/LinksCloud_it.ts \
lang/LinksCloud_ja_JP.ts \
lang/LinksCloud_ko.ts \
lang/LinksCloud_nl.ts \
lang/LinksCloud_pl.ts \
lang/LinksCloud_ru.ts \
lang/LinksCloud_sv.ts \
lang/LinksCloud_tr.ts \
lang/LinksCloud_zh_CN.ts

View File

@ -1,117 +0,0 @@
#include <retroshare/rsplugin.h>
#include <util/rsversion.h>
#include <QTranslator>
#include "LinksCloudPlugin.h"
#include "LinksDialog.h"
static void *inited = new LinksCloudPlugin() ;
extern "C" {
void *RETROSHARE_PLUGIN_provide()
{
static LinksCloudPlugin *p = new LinksCloudPlugin() ;
return (void*)p ;
}
// This symbol contains the svn revision number grabbed from the executable.
// It will be tested by RS to load the plugin automatically, since it is safe to load plugins
// with same revision numbers, assuming that the revision numbers are up-to-date.
//
uint32_t RETROSHARE_PLUGIN_revision = SVN_REVISION_NUMBER ;
// This symbol contains the svn revision number grabbed from the executable.
// It will be tested by RS to load the plugin automatically, since it is safe to load plugins
// with same revision numbers, assuming that the revision numbers are up-to-date.
//
uint32_t RETROSHARE_PLUGIN_api = RS_PLUGIN_API_VERSION ;
}
#define IMAGE_LINKS ":/images/irkick.png"
void LinksCloudPlugin::getPluginVersion(int& major,int& minor,int& svn_rev) const
{
major = 5 ;
minor = 4 ;
svn_rev = SVN_REVISION_NUMBER ;
}
LinksCloudPlugin::LinksCloudPlugin()
{
mRanking = NULL ;
mainpage = NULL ;
mIcon = NULL ;
mPlugInHandler = NULL;
mPeers = NULL;
mFiles = NULL;
}
void LinksCloudPlugin::setInterfaces(RsPlugInInterfaces &interfaces){
mPeers = interfaces.mPeers;
mFiles = interfaces.mFiles;
}
MainPage *LinksCloudPlugin::qt_page() const
{
if(mainpage == NULL)
mainpage = new LinksDialog(mPeers, mFiles) ;
return mainpage ;
}
RsCacheService *LinksCloudPlugin::rs_cache_service() const
{
if(mRanking == NULL)
{
mRanking = new p3Ranking(mPlugInHandler) ; // , 3600 * 24 * 30 * 6); // 6 Months
rsRanks = mRanking ;
}
return mRanking ;
}
void LinksCloudPlugin::setPlugInHandler(RsPluginHandler *pgHandler){
mPlugInHandler = pgHandler;
}
QIcon *LinksCloudPlugin::qt_icon() const
{
if(mIcon == NULL)
{
Q_INIT_RESOURCE(LinksCloud_images) ;
mIcon = new QIcon(IMAGE_LINKS) ;
}
return mIcon ;
}
std::string LinksCloudPlugin::getShortPluginDescription() const
{
return QApplication::translate("LinksCloudPlugin", "This plugin provides a set of cached links, and a voting system to promote them.").toUtf8().constData();
}
std::string LinksCloudPlugin::getPluginName() const
{
return QApplication::translate("LinksCloudPlugin", "LinksCloud").toUtf8().constData();
}
QTranslator* LinksCloudPlugin::qt_translator(QApplication */*app*/, const QString& languageCode, const QString& externalDir) const
{
if (languageCode == "en") {
return NULL;
}
QTranslator* translator = new QTranslator();
if (translator->load(externalDir + "/LinksCloud_" + languageCode + ".qm")) {
return translator;
} else if (translator->load(":/lang/LinksCloud_" + languageCode + ".qm")) {
return translator;
}
delete(translator);
return NULL;
}

View File

@ -1,35 +0,0 @@
#pragma once
#include <retroshare/rsplugin.h>
#include <retroshare-gui/mainpage.h>
#include "p3ranking.h"
class LinksCloudPlugin: public RsPlugin
{
public:
LinksCloudPlugin() ;
virtual ~LinksCloudPlugin() {}
virtual RsCacheService *rs_cache_service() const ;
virtual MainPage *qt_page() const ;
virtual QIcon *qt_icon() const ;
virtual uint16_t rs_service_id() const { return RS_SERVICE_TYPE_RANK ; }
virtual QTranslator *qt_translator(QApplication *app, const QString& languageCode, const QString& externalDir) const;
virtual void getPluginVersion(int& major,int& minor,int& svn_rev) const ;
virtual void setPlugInHandler(RsPluginHandler *pgHandler);
virtual std::string configurationFileName() const { return std::string() ; }
virtual std::string getShortPluginDescription() const ;
virtual std::string getPluginName() const;
virtual void setInterfaces(RsPlugInInterfaces& interfaces);
private:
mutable p3Ranking *mRanking ;
mutable RsPluginHandler *mPlugInHandler;
mutable RsFiles* mFiles;
mutable RsPeers* mPeers;
mutable MainPage* mainpage ;
mutable QIcon* mIcon ;
};

View File

@ -1,5 +0,0 @@
<RCC>
<qresource prefix="/" >
<file>images/irkick.png</file>
</qresource>
</RCC>

View File

@ -1,994 +0,0 @@
/****************************************************************
* RetroShare is distributed under the following license:
*
* Copyright (C) 2008 Robert Fernie
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
****************************************************************/
#include <QMenu>
#include <QTimer>
#include <QMessageBox>
#include <QDateTime>
#include <QDesktopServices>
#include "LinksDialog.h"
#include <gui/RetroShareLink.h>
#include "AddLinksDialog.h"
#include "rsrank.h"
#include "util/QtVersion.h"
#include <sstream>
/* Images for context menu icons */
#define IMAGE_EXPORTFRIEND ":/images/exportpeers_16x16.png"
#define IMAGE_GREAT ":/images/filerating5.png"
#define IMAGE_GOOD ":/images/filerating4.png"
#define IMAGE_OK ":/images/filerating3.png"
#define IMAGE_SUX ":/images/filerating2.png"
#define IMAGE_BADLINK ":/images/filerating1.png"
#define IMAGE_NOCOMMENTRATING ":/images/filerating0.png"
#define IMAGE_DOWNLOAD ":/images/download16.png"
/******
* #define LINKS_DEBUG 1
*****/
/** Constructor */
LinksDialog::LinksDialog(RsPeers *peers, RsFiles *files, QWidget *parent)
: MainPage(parent), mPeers(peers), mFiles(files)
{
/* Invoke the Qt Designer generated object setup routine */
ui.setupUi(this);
connect( ui.linkTreeWidget, SIGNAL( customContextMenuRequested( QPoint ) ), this, SLOT( linkTreeWidgetCostumPopupMenu( QPoint ) ) );
/* link combos */
connect( ui.rankComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedSortRank( int ) ) );
connect( ui.periodComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedSortPeriod( int ) ) );
connect( ui.fromComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedSortFrom( int ) ) );
connect( ui.topComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( changedSortTop( int ) ) );
/* add button */
connect( ui.addButton, SIGNAL( clicked( void ) ), this, SLOT( addLinkComment( void ) ) );
connect( ui.expandButton, SIGNAL( clicked( void ) ), this, SLOT( toggleWindows( void ) ) );
connect( ui.addToolButton, SIGNAL( clicked( ) ), this, SLOT( addNewLink( ) ) );
connect( ui.linkTreeWidget, SIGNAL( currentItemChanged ( QTreeWidgetItem *, QTreeWidgetItem * ) ),
this, SLOT( changedItem ( QTreeWidgetItem *, QTreeWidgetItem * ) ) );
connect( ui.linkTreeWidget, SIGNAL( itemDoubleClicked ( QTreeWidgetItem *, int ) ),
this, SLOT( openLink ( QTreeWidgetItem *, int ) ) );
connect( ui.anonBox, SIGNAL( stateChanged ( int ) ), this, SLOT( checkAnon ( void ) ) );
mStart = 0;
/* Set header resize modes and initial section sizes */
QHeaderView * _header = ui.linkTreeWidget->header () ;
QHeaderView_setSectionResizeMode(_header, 0, QHeaderView::Interactive);
QHeaderView_setSectionResizeMode(_header, 1, QHeaderView::Interactive);
QHeaderView_setSectionResizeMode(_header, 2, QHeaderView::Interactive);
_header->resizeSection ( 0, 400 );
_header->resizeSection ( 1, 60 );
_header->resizeSection ( 2, 150 );
ui.linkTreeWidget->setSortingEnabled(true);
ui.linklabel->setMinimumWidth(20);
/* Set a GUI update timer - much cleaner than
* doing everything through the notify agent
*/
QTimer *timer = new QTimer(this);
timer->connect(timer, SIGNAL(timeout()), this, SLOT(checkUpdate()));
timer->start(1000);
}
void LinksDialog::checkUpdate()
{
/* update */
if (!rsRanks)
{
std::cerr << " rsRanks = 0 !!!!" << std::endl;
return;
}
if (rsRanks->updated())
{
#ifdef LINKS_DEBUG
std::cerr << " rsRanks was updated -> redraw()" << std::endl;
#endif
updateLinks();
}
return;
}
void LinksDialog::linkTreeWidgetCostumPopupMenu( QPoint point )
{
QMenu contextMnu( this );
QAction *voteupAct = new QAction(QIcon(IMAGE_EXPORTFRIEND), tr( "Share Link Anonymously" ), &contextMnu );
connect( voteupAct , SIGNAL( triggered() ), this, SLOT( voteup_anon() ) );
QMenu *voteMenu = new QMenu( tr("Vote on Link"), &contextMnu );
voteMenu->setIcon(QIcon(IMAGE_EXPORTFRIEND));
QAction *vote_p2 = new QAction( QIcon(IMAGE_GREAT), tr("+2 Great!"), &contextMnu );
connect( vote_p2 , SIGNAL( triggered() ), this, SLOT( voteup_p2() ) );
voteMenu->addAction(vote_p2);
QAction *vote_p1 = new QAction( QIcon(IMAGE_GOOD), tr("+1 Good"), &contextMnu );
connect( vote_p1 , SIGNAL( triggered() ), this, SLOT( voteup_p1() ) );
voteMenu->addAction(vote_p1);
QAction *vote_p0 = new QAction( QIcon(IMAGE_OK), tr("0 Okay"), &contextMnu );
connect( vote_p0 , SIGNAL( triggered() ), this, SLOT( voteup_p0() ) );
voteMenu->addAction(vote_p0);
QAction *vote_m1 = new QAction( QIcon(IMAGE_SUX), tr("-1 Sux"), &contextMnu );
connect( vote_m1 , SIGNAL( triggered() ), this, SLOT( voteup_m1() ) );
voteMenu->addAction(vote_m1);
QAction *vote_m2 = new QAction( QIcon(IMAGE_BADLINK), tr("-2 Bad Link"), &contextMnu );
connect( vote_m2 , SIGNAL( triggered() ), this, SLOT( voteup_m2() ) );
voteMenu->addAction(vote_m2);
QAction *downloadAct = new QAction(QIcon(IMAGE_DOWNLOAD), tr("Download"), &contextMnu);
connect(downloadAct, SIGNAL(triggered()), this, SLOT(downloadSelected()));
contextMnu.addAction(voteupAct);
contextMnu.addSeparator();
contextMnu.addMenu(voteMenu);
contextMnu.addSeparator();
contextMnu.addAction(downloadAct);
contextMnu.exec(ui.linkTreeWidget->viewport()->mapToGlobal(point));
}
void LinksDialog::changedSortRank( int index )
{
/* update */
if (!rsRanks)
return;
/* translate */
uint32_t type = 0;
switch (index)
{
case 1:
type = RS_RANK_TIME;
break;
case 2:
type = RS_RANK_SCORE;
break;
default:
case 0:
type = RS_RANK_ALG;
break;
}
if (type)
{
rsRanks->setSortMethod(type);
}
updateLinks();
}
void LinksDialog::changedSortPeriod( int index )
{
/* update */
if (!rsRanks)
return;
/* translate */
uint32_t period = 0;
switch (index)
{
case 1:
period = 60 * 60 * 24 * 7; /* WEEK */
break;
case 2:
period = 60 * 60 * 24; /* DAY */
break;
default:
case 0:
period = 60 * 60 * 24 * 30; /* MONTH */
break;
}
if (period)
{
rsRanks->setSortPeriod(period);
}
updateLinks();
}
void LinksDialog::changedSortFrom( int index )
{
/* update */
if (!rsRanks)
return;
std::list<std::string> peers;
/* translate */
switch (index)
{
default:
case 0:
break;
case 1:
peers.push_back(mPeers->getOwnId());
break;
}
if (peers.size() < 1)
{
rsRanks->clearPeerFilter();
}
else
{
rsRanks->setPeerFilter(peers);
}
updateLinks();
}
#define ENTRIES_PER_BLOCK 100
void LinksDialog::changedSortTop( int index )
{
/* update */
if (!rsRanks)
return;
std::list<std::string> peers;
/* translate */
switch (index)
{
default:
case 0:
mStart = 0;
break;
case 1:
mStart = 1 * ENTRIES_PER_BLOCK;
break;
case 2:
mStart = 2 * ENTRIES_PER_BLOCK;
break;
case 3:
mStart = 3 * ENTRIES_PER_BLOCK;
break;
case 4:
mStart = 4 * ENTRIES_PER_BLOCK;
break;
case 5:
mStart = -1;
break;
}
updateLinks();
}
/* get the list of Links from the RsRanks. */
void LinksDialog::updateLinks()
{
std::list<std::string> rids;
std::list<std::string>::iterator rit;
std::list<RsRankComment>::iterator cit;
#ifdef LINKS_DEBUG
std::cerr << "LinksDialog::updateLinks()" << std::endl;
#endif
/* Work out the number/entries to show */
uint32_t count = rsRanks->getRankingsCount();
uint32_t start;
uint32_t entries = ENTRIES_PER_BLOCK;
if (count < entries)
{
entries = count;
}
if (mStart == -1)
{
/* backwards */
start = count-entries;
}
else
{
start = mStart;
if (start + entries > count)
{
start = count - entries;
}
}
/* get a link to the table */
QTreeWidget *linkWidget = ui.linkTreeWidget;
QList<QTreeWidgetItem *> items;
rsRanks->getRankings(start, entries, rids);
float maxRank = rsRanks->getMaxRank();
for(rit = rids.begin(); rit != rids.end(); rit++)
{
RsRankDetails detail;
if (!rsRanks->getRankDetails(*rit, detail))
{
continue;
}
/* create items */
QTreeWidgetItem *item = new QTreeWidgetItem((QTreeWidget*)0);
/* (0) Title */
{
item -> setText(0, QString::fromStdWString(detail.title));
item -> setSizeHint(0, QSize( 20,20 ) );
/* Bold and bigger */
/*QFont font = item->font(0);
font.setBold(true);
font.setPointSize(font.pointSize() + 2);
item->setFont(0, font);*/
}
/* (1) Rank */
{
std::ostringstream out;
out << 100 * (detail.rank / (maxRank + 0.01));
item -> setText(1, QString::fromStdString(out.str()));
item -> setSizeHint(1, QSize( 20,20 ) );
/* Bold and bigger */
/*QFont font = item->font(1);
font.setBold(true);
font.setPointSize(font.pointSize() + 2);
item->setFont(1, font);*/
}
/* (2) Link */
{
item -> setText(2, QString::fromStdWString(detail.link));
item -> setSizeHint(2, QSize( 20,20 ) );
/* Bold and bigger */
/*QFont font = item->font(2);
font.setBold(true);
font.setPointSize(font.pointSize() + 2);
item->setFont(2, font);*/
}
/* (3) Date */
/*{
QDateTime qtime;
qtime.setTime_t(it->lastPost);
QString timestamp = qtime.toString("yyyy-MM-dd hh:mm:ss");
item -> setText(3, timestamp);
}*/
/* (4) rid */
item -> setText(4, QString::fromStdString(detail.rid));
/* add children */
int i = 0;
for(cit = detail.comments.begin();
cit != detail.comments.end(); cit++, i++)
{
/* create items */
QTreeWidgetItem *child = new QTreeWidgetItem((QTreeWidget*)0);
QString commentText;
QString peerScore;
if (cit->score > 1)
{
peerScore = "[+2] ";
child -> setIcon(0,(QIcon(IMAGE_GREAT)));
item -> setIcon(0,(QIcon(IMAGE_GREAT)));
//peerScore = "[+2 Great Link] ";
}
else if (cit->score == 1)
{
peerScore = "[+1] ";
child -> setIcon(0,(QIcon(IMAGE_GOOD)));
item -> setIcon(0,(QIcon(IMAGE_GOOD)));
//peerScore = "[+1 Good] ";
}
else if (cit->score == 0)
{
peerScore = "[+0] ";
child -> setIcon(0,(QIcon(IMAGE_OK)));
item -> setIcon(0,(QIcon(IMAGE_OK)));
//peerScore = "[+0 Okay] ";
}
else if (cit->score == -1)
{
peerScore = "[-1] ";
child -> setIcon(0,(QIcon(IMAGE_SUX)));
item -> setIcon(0,(QIcon(IMAGE_SUX)));
//peerScore = "[-1 Not Worth It] ";
}
else //if (cit->score < -1)
{
peerScore = "[-2 BAD] ";
child -> setIcon(0,(QIcon(IMAGE_BADLINK)));
item -> setIcon(0,(QIcon(IMAGE_BADLINK)));
//peerScore = "[-2 BAD Link] ";
}
/* (0) Comment */
if (cit->comment != L"")
{
commentText = peerScore + QString::fromStdWString(cit->comment);
}
else
{
commentText = peerScore + "No Comment";
}
child -> setText(0, commentText);
/* (2) Peer / Date */
{
QDateTime qtime;
qtime.setTime_t(cit->timestamp);
QString timestamp = qtime.toString("yyyy-MM-dd hh:mm:ss");
QString peerLabel = QString::fromStdString(mPeers->getPeerName(cit->id));
if (peerLabel == "")
{
peerLabel = "<";
peerLabel += QString::fromStdString(cit->id);
peerLabel += ">";
}
peerLabel += " ";
peerLabel += timestamp;
child -> setText(2, peerLabel);
}
/* (4) Id */
child -> setText(4, QString::fromStdString(cit->id));
if (i % 2 == 1)
{
/* set to light gray background */
child->setBackground(0,QBrush(Qt::lightGray));
child->setBackground(1,QBrush(Qt::lightGray));
child->setBackground(2,QBrush(Qt::lightGray));
}
/* push to items */
item->addChild(child);
}
/* add to the list */
items.append(item);
}
/* remove old items */
linkWidget->clear();
linkWidget->setColumnCount(3);
/* add the items in! */
linkWidget->insertTopLevelItems(0, items);
linkWidget->update(); /* update display */
}
void LinksDialog::openLink ( QTreeWidgetItem * item, int )
{
#ifdef LINKS_DEBUG
std::cerr << "LinksDialog::openLink()" << std::endl;
#endif
/* work out the ids */
if (!item)
{
#ifdef LINKS_DEBUG
std::cerr << "LinksDialog::openLink() Failed Item" << std::endl;
#endif
return;
}
std::string rid;
std::string pid;
QTreeWidgetItem *parent = item->parent();
if (parent)
{
/* a child comment -> ignore double click */
#ifdef LINKS_DEBUG
std::cerr << "LinksDialog::openLink() Failed Child" << std::endl;
#endif
return;
}
#ifdef LINKS_DEBUG
std::cerr << "LinksDialog::openLink() " << (item->text(2)).toStdString() << std::endl;
#endif
/* open a browser */
QUrl url(item->text(2));
QDesktopServices::openUrl ( url );
/* close expansion */
bool state = item->isExpanded();
item->setExpanded(!state);
}
void LinksDialog::changedItem(QTreeWidgetItem *curr, QTreeWidgetItem *)
{
/* work out the ids */
if (!curr)
{
updateComments("", "");
return;
}
std::string rid;
std::string pid;
QTreeWidgetItem *parent = curr->parent();
if (parent)
{
rid = (parent->text(4)).toStdString();
pid = (curr->text(4)).toStdString();
#ifdef LINKS_DEBUG
std::cerr << "LinksDialog::changedItem() Rid: " << rid << " Pid: " << pid;
std::cerr << std::endl;
#endif
updateComments(rid, pid);
}
else
{
rid = (curr->text(4)).toStdString();
#ifdef LINKS_DEBUG
std::cerr << "LinksDialog::changedItem() Rid: " << rid << " Pid: NULL";
std::cerr << std::endl;
#endif
updateComments(rid, "");
}
}
void LinksDialog::checkAnon()
{
changedItem(ui.linkTreeWidget->currentItem(), NULL);
}
int IndexToScore(int index)
{
if ((index == -1) || (index > 4))
return 0;
int score = 2 - index;
return score;
}
int ScoreToIndex(int score)
{
if ((score < -2) || (score > 2))
return 2;
int index = 2 - score;
return index;
}
/* get the list of Links from the RsRanks. */
void LinksDialog::updateComments(std::string rid, std::string )
{
std::list<RsRankComment>::iterator cit;
if (ui.anonBox->isChecked())
{
/* empty everything */
ui.titleLineEdit->setText("");
ui.linkLineEdit->setText("");
ui.linkTextEdit->setText("");
ui.scoreBox->setCurrentIndex(ScoreToIndex(0));
mLinkId = rid; /* must be set for Context Menu */
/* disable comment + score */
ui.scoreBox->setEnabled(false);
ui.linkTextEdit->setEnabled(false);
/* done! */
return;
}
else
{
/* enable comment + score */
ui.scoreBox->setEnabled(true);
ui.linkTextEdit->setEnabled(true);
}
RsRankDetails detail;
if ((rid == "") || (!rsRanks->getRankDetails(rid, detail)))
{
/* clear it up */
ui.titleLineEdit->setText("");
ui.linkLineEdit->setText("");
ui.linkTextEdit->setText("");
ui.scoreBox->setCurrentIndex(ScoreToIndex(0));
mLinkId = rid;
return;
}
/* set Link details */
ui.titleLineEdit->setText(QString::fromStdWString(detail.title));
ui.linkLineEdit->setText(QString::fromStdWString(detail.link));
ui.linklabel->setText("<a href='" + QString::fromStdWString(detail.link) + "'> " + QString::fromStdWString(detail.link) +"</a>");
if (mLinkId == rid)
{
/* leave comments */
//ui.linkTextEdit->setText("");
return;
}
mLinkId = rid;
/* Add your text to the comment */
std::string ownId = mPeers->getOwnId();
for(cit = detail.comments.begin(); cit != detail.comments.end(); cit++)
{
if (cit->id == ownId)
break;
}
if (cit != detail.comments.end())
{
QString comment = QString::fromStdWString(cit->comment);
ui.linkTextEdit->setText(comment);
ui.scoreBox->setCurrentIndex(ScoreToIndex(cit->score));
}
else
{
ui.linkTextEdit->setText("");
ui.scoreBox->setCurrentIndex(ScoreToIndex(0));
}
return;
}
void LinksDialog::addLinkComment( void )
{
/* get the title / link / comment */
QString title = ui.titleLineEdit->text();
QString link = ui.linkLineEdit->text();
QString comment = ui.linkTextEdit->toPlainText();
int32_t score = IndexToScore(ui.scoreBox->currentIndex());
if ((mLinkId == "") || (ui.anonBox->isChecked()))
{
if ((link == "") || (title == ""))
{
QMessageBox::warning ( NULL, tr("Add Link Failure"), tr("Missing Link and/or Title"), QMessageBox::Ok);
/* can't do anything */
return;
}
/* add it either way */
if (ui.anonBox->isChecked())
{
rsRanks->anonRankMsg("", link.toStdWString(), title.toStdWString());
}
else
{
rsRanks->newRankMsg(
link.toStdWString(),
title.toStdWString(),
comment.toStdWString(), score);
}
updateLinks();
return;
}
/* get existing details */
RsRankDetails detail;
if (!rsRanks->getRankDetails(mLinkId, detail))
{
/* strange error! */
QMessageBox::warning ( NULL, tr("Add Link Failure"), tr("Missing Link Data"), QMessageBox::Ok);
return;
}
if (link.toStdWString() == detail.link) /* same link! - we can add a comment */
{
if (comment == "") /* no comment! */
{
QMessageBox::warning ( NULL, tr("Add Link Failure"), tr("Missing Comment"), QMessageBox::Ok);
return;
}
rsRanks->updateComment(mLinkId,
comment.toStdWString(),
score);
}
else
{
QMessageBox::StandardButton sb = QMessageBox::Yes;
if ((title.toStdWString() == detail.title) /* same title! - wrong */
|| (title == ""))
{
sb = QMessageBox::question ( NULL, tr("Link Title Not Changed"), tr("Do you want to continue?"), (QMessageBox::Yes | QMessageBox::No));
}
/* add Link! */
if (sb == QMessageBox::Yes)
{
rsRanks->newRankMsg(
link.toStdWString(),
title.toStdWString(),
comment.toStdWString(),
score);
}
}
updateLinks();
return;
}
void LinksDialog::toggleWindows( void )
{
/* if msg header visible -> hide by changing splitter
*/
QList<int> sizeList = ui.msgSplitter->sizes();
QList<int>::iterator it;
int listSize = 0;
int msgSize = 0;
int i = 0;
for(it = sizeList.begin(); it != sizeList.end(); it++, i++)
{
if (i == 0)
{
listSize = (*it);
}
else if (i == 1)
{
msgSize = (*it);
}
}
int totalSize = listSize + msgSize;
bool toShrink = true;
if (msgSize < (int) totalSize / 10)
{
toShrink = false;
}
QList<int> newSizeList;
if (toShrink)
{
newSizeList.push_back(totalSize);
newSizeList.push_back(0);
ui.expandButton->setIcon(QIcon(QString(":/images/edit_add24.png")));
ui.expandButton->setToolTip(tr("Expand"));
}
else
{
newSizeList.push_back(totalSize * 3/4);
newSizeList.push_back(totalSize * 1/4);
ui.expandButton->setIcon(QIcon(QString(":/images/edit_remove24.png")));
ui.expandButton->setToolTip(tr("Hide"));
}
ui.msgSplitter->setSizes(newSizeList);
return;
}
QTreeWidgetItem *LinksDialog::getCurrentLine()
{
/* get the current, and extract the Id */
/* get a link to the table */
QTreeWidget *peerWidget = ui.linkTreeWidget;
QTreeWidgetItem *item = peerWidget -> currentItem();
if (!item)
{
#ifdef LINKS_DEBUG
std::cerr << "Invalid Current Item" << std::endl;
#endif
return NULL;
}
#ifdef LINKS_DEBUG
/* Display the columns of this item. */
std::ostringstream out;
out << "CurrentPeerItem: " << std::endl;
for(int i = 1; i < 6; i++)
{
QString txt = item -> text(i);
out << "\t" << i << ":" << txt.toStdString() << std::endl;
}
std::cerr << out.str();
#endif
return item;
}
void LinksDialog::voteup_anon()
{
//QTreeWidgetItem *c = getCurrentLine();
if (mLinkId == "")
{
return;
}
RsRankDetails detail;
if (!rsRanks->getRankDetails(mLinkId, detail))
{
/* not there! */
return;
}
QString link = QString::fromStdWString(detail.link);
#ifdef LINKS_DEBUG
std::cerr << "LinksDialog::voteup_anon() : " << link.toStdString() << std::endl;
#endif
// need a proper anon sharing option.
rsRanks->anonRankMsg(mLinkId, detail.link, detail.title);
}
void LinksDialog::voteup_score(int score)
{
if (mLinkId == "")
{
return;
}
RsRankDetails detail;
if (!rsRanks->getRankDetails(mLinkId, detail))
{
/* not there! */
return;
}
QString link = QString::fromStdWString(detail.link);
std::wstring comment;
#ifdef LINKS_DEBUG
std::cerr << "LinksDialog::voteup_score() : " << link.toStdString() << std::endl;
#endif
std::list<RsRankComment>::iterator cit;
/* Add your text to the comment */
std::string ownId = mPeers->getOwnId();
for(cit = detail.comments.begin(); cit != detail.comments.end(); cit++)
{
if (cit->id == ownId)
break;
}
if (cit != detail.comments.end())
{
comment = cit->comment;
}
rsRanks->updateComment(mLinkId, comment, score);
}
void LinksDialog::voteup_p2()
{
voteup_score(2);
}
void LinksDialog::voteup_p1()
{
voteup_score(1);
}
void LinksDialog::voteup_p0()
{
voteup_score(0);
}
void LinksDialog::voteup_m1()
{
voteup_score(-1);
}
void LinksDialog::voteup_m2()
{
voteup_score(-2);
}
void LinksDialog::downloadSelected()
{
if (mLinkId == "")
{
return;
}
RsRankDetails detail;
if (!rsRanks->getRankDetails(mLinkId, detail))
{
/* not there! */
return;
}
QString link = QString::fromStdWString(detail.link);
std::wstring comment;
#ifdef LINKS_DEBUG
std::cerr << "LinksDialog::downloadSelected() : " << link.toStdString() << std::endl;
#endif
//RetroShareLink rslink(QString::fromStdWString(detail.link));
//if(!rslink.valid() || rslink.type() != RetroShareLink::TYPE_FILE)
//{
// QMessageBox::critical(NULL,"Badly formed link","This link is badly formed. Can't parse/use it. This is a bug. Please contact the developers.") ;
// return ;
// }
/* retrieve all peers id for this file */
// FileInfo info;
// rsFiles->FileDetails(rslink.hash().toStdString(), 0, info);
// std::list<std::string> srcIds;
// std::list<TransferInfo>::iterator pit;
// for (pit = info.peers.begin(); pit != info.peers.end(); pit ++)
// srcIds.push_back(pit->peerId);
// rsFiles->FileRequest(rslink.name().toStdString(), rslink.hash().toStdString(), rslink.size(), "", 0, srcIds);
}
void LinksDialog::addNewLink()
{
AddLinksDialog *nAddLinksDialog = new AddLinksDialog("");
nAddLinksDialog->show();
/* window will destroy itself! */
}

View File

@ -1,97 +0,0 @@
/****************************************************************
* RetroShare GUI is distributed under the following license:
*
* Copyright (C) 2008 Robert Fernie
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
****************************************************************/
#ifndef _LINKS_DIALOG_H
#define _LINKS_DIALOG_H
#include <retroshare-gui/mainpage.h>
#include <retroshare/rsfiles.h>
#include <retroshare/rspeers.h>
#include "ui_LinksDialog.h"
class LinksDialog : public MainPage
{
Q_OBJECT
public:
/** Default Constructor */
LinksDialog(RsPeers* peers, RsFiles* files, QWidget *parent = 0);
/** Default Destructor */
void insertExample();
private slots:
/** Create the context popup menu and it's submenus */
void linkTreeWidgetCostumPopupMenu( QPoint point );
void voteup_anon();
void voteup_score(int score);
void voteup_p2();
void voteup_p1();
void voteup_p0();
void voteup_m1();
void voteup_m2();
void downloadSelected();
void changedSortRank( int index );
void changedSortPeriod( int index );
void changedSortFrom( int index );
void changedSortTop( int index );
void updateLinks();
void addLinkComment( void );
void toggleWindows( void );
void openLink ( QTreeWidgetItem * item, int column );
void changedItem(QTreeWidgetItem *curr, QTreeWidgetItem *prev);
void checkAnon();
void checkUpdate();
void addNewLink();
private:
void updateComments(std::string rid, std::string pid);
int mStart; /* start of rank list */
std::string mLinkId;
/* Worker Functions */
/* (1) Update Display */
/* (2) Utility Fns */
QTreeWidgetItem *getCurrentLine();
QTreeWidget *exampletreeWidget;
// gui interface
RsPeers* mPeers;
RsFiles* mFiles;
/** Qt Designer generated object */
Ui::LinksDialog ui;
};
#endif

View File

@ -1,572 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>LinksDialog</class>
<widget class="QWidget" name="LinksDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>738</width>
<height>583</height>
</rect>
</property>
<layout class="QGridLayout">
<property name="horizontalSpacing">
<number>6</number>
</property>
<property name="verticalSpacing">
<number>0</number>
</property>
<item row="1" column="0" colspan="3">
<widget class="QSplitter" name="msgSplitter">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<widget class="QWidget" name="layoutWidget">
<layout class="QGridLayout">
<item row="0" column="0" colspan="13">
<widget class="QTreeWidget" name="linkTreeWidget">
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
<column>
<property name="text">
<string>Title / Comment</string>
</property>
</column>
<column>
<property name="text">
<string>Score</string>
</property>
</column>
<column>
<property name="text">
<string>Peer / Link</string>
</property>
</column>
</widget>
</item>
<item row="3" column="0">
<widget class="QPushButton" name="expandButton">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/edit_remove24.png</normaloff>:/images/edit_remove24.png</iconset>
</property>
</widget>
</item>
<item row="3" column="1">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>16</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Sort by</string>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QComboBox" name="rankComboBox">
<item>
<property name="text">
<string>Combo</string>
</property>
</item>
<item>
<property name="text">
<string>Time</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/kalarm.png</normaloff>:/images/kalarm.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>Ranking</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/records.png</normaloff>:/images/records.png</iconset>
</property>
</item>
</widget>
</item>
<item row="3" column="4">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>16</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="5">
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>In last</string>
</property>
</widget>
</item>
<item row="3" column="6">
<widget class="QComboBox" name="periodComboBox">
<item>
<property name="text">
<string>Month</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/view_calendar_month.png</normaloff>:/images/view_calendar_month.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>Week</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/view_calendar_week.png</normaloff>:/images/view_calendar_week.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>Day</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/view_calendar_day.png</normaloff>:/images/view_calendar_day.png</iconset>
</property>
</item>
</widget>
</item>
<item row="3" column="7">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>16</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="8">
<widget class="QLabel" name="label_3">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>From</string>
</property>
</widget>
</item>
<item row="3" column="9">
<widget class="QComboBox" name="fromComboBox">
<item>
<property name="text">
<string>All Peers</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/user/friends24.png</normaloff>:/images/user/friends24.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>Own Links</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/user/identity16.png</normaloff>:/images/user/identity16.png</iconset>
</property>
</item>
</widget>
</item>
<item row="3" column="10">
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>16</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="11">
<widget class="QLabel" name="label_5">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Show</string>
</property>
</widget>
</item>
<item row="3" column="12">
<widget class="QComboBox" name="topComboBox">
<item>
<property name="text">
<string>Top 100</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/records.png</normaloff>:/images/records.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>101-200</string>
</property>
</item>
<item>
<property name="text">
<string>201-300</string>
</property>
</item>
<item>
<property name="text">
<string>301-400</string>
</property>
</item>
<item>
<property name="text">
<string>401-500</string>
</property>
</item>
<item>
<property name="text">
<string>Bottom 100</string>
</property>
</item>
</widget>
</item>
<item row="1" column="1" colspan="12">
<widget class="QLabel" name="linklabel">
<property name="styleSheet">
<string notr="true">QLabel{border: 2px solid #CCCCCC;
border-radius: 10px;
background: white;
padding:2}</string>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_9">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Link:</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="layoutWidget_1">
<layout class="QVBoxLayout">
<item>
<layout class="QHBoxLayout">
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>311</width>
<height>32</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="anonBox">
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Add Anonymous Link</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="addButton">
<property name="text">
<string>Add Link/Comment</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout">
<item>
<widget class="QLabel" name="label_6">
<property name="text">
<string>Title:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="titleLineEdit">
<property name="styleSheet">
<string notr="true">QLineEdit{border: 2px solid #CCCCCC;
border-radius: 10px;
background: white;}</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_8">
<property name="text">
<string>Score:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="scoreBox">
<item>
<property name="text">
<string>+2 Great!</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/filerating5.png</normaloff>:/images/filerating5.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>+1 Good</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/filerating4.png</normaloff>:/images/filerating4.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>0 Okay</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/filerating3.png</normaloff>:/images/filerating3.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>-1 Sux</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/filerating2.png</normaloff>:/images/filerating2.png</iconset>
</property>
</item>
<item>
<property name="text">
<string>-2 Bad Link</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/filerating1.png</normaloff>:/images/filerating1.png</iconset>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout">
<item>
<widget class="QLabel" name="label_7">
<property name="text">
<string>Url:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="linkLineEdit">
<property name="styleSheet">
<string notr="true">QLineEdit{border: 2px solid #CCCCCC;
border-radius: 10px;
background: white;}</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QTextEdit" name="linkTextEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">QTextEdit{border: 2px solid #CCCCCC;
border-radius: 10px;
background: white;}</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item row="0" column="0" colspan="3">
<widget class="QFrame" name="titleBarFrame">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="margin">
<number>2</number>
</property>
<item>
<widget class="QLabel" name="titleBarPixmap">
<property name="maximumSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="linksCloud_images.qrc">:/images/irkick.png</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="titleBarLabel">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Links Cloud</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>596</width>
<height>15</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="addToolButton">
<property name="text">
<string>Add new link</string>
</property>
<property name="icon">
<iconset resource="../../retroshare-gui/src/gui/images.qrc">
<normaloff>:/images/edit_add24.png</normaloff>:/images/edit_add24.png</iconset>
</property>
<property name="iconSize">
<size>
<width>24</width>
<height>16</height>
</size>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="linksCloud_images.qrc"/>
<include location="../../retroshare-gui/src/gui/images.qrc"/>
</resources>
<connections/>
</ui>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -1,329 +0,0 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="ca_ES" version="2.0">
<context>
<name>AddLinksDialog</name>
<message>
<location filename="../AddLinksDialog.ui" line="14"/>
<location filename="../AddLinksDialog.ui" line="56"/>
<source>Add Link</source>
<translation>Afegir enllaç</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="49"/>
<source>Cancel</source>
<translation>Cancel·la</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="82"/>
<source>Add a new Link</source>
<translation>Afegir un nou enllaç</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="95"/>
<source>Title:</source>
<translation>Títol:</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="102"/>
<source>Url:</source>
<translation>URL:</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="139"/>
<source>Add Anonymous Link</source>
<translation>Afegir enllaç anònim</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="147"/>
<source>+2 Great!</source>
<translation>+2 Fantàstic!</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="156"/>
<source>+1 Good</source>
<translation>+1 Molt bo</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="165"/>
<source>0 Okay</source>
<translation>0 Està </translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="174"/>
<source>-1 Sux</source>
<translation>-1 És dolent</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="183"/>
<source>-2 Bad Link</source>
<translation>-2 Enllaç dolent</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="44"/>
<source>Add Link to Cloud</source>
<translation>Afegir enllaç al núvol</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="61"/>
<source>New Link</source>
<translation>Nou enllaç</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="89"/>
<source>Add Link Failure</source>
<translation>Afegir enllaç que falla</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="89"/>
<source>Missing Link and/or Title</source>
<translation>Enllaç i/o títol perdut</translation>
</message>
</context>
<context>
<name>LinksCloudPlugin</name>
<message>
<location filename="../LinksCloudPlugin.cpp" line="93"/>
<source>This plugin provides a set of cached links, and a voting system to promote them.</source>
<translation>Aquest complement proporciona un conjunt d&apos;enllaços en cau i un sistema de votar-los i promocionar-los.</translation>
</message>
<message>
<location filename="../LinksCloudPlugin.cpp" line="98"/>
<source>LinksCloud</source>
<translation>NúvolEnllaços</translation>
</message>
</context>
<context>
<name>LinksDialog</name>
<message>
<location filename="../LinksDialog.ui" line="45"/>
<source>Title / Comment</source>
<translation>Títol / Comentari</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="50"/>
<source>Score</source>
<translation>Puntuació</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="55"/>
<source>Peer / Link</source>
<translation>Contacte / Enllaç</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="93"/>
<source>Sort by</source>
<translation>Ordenat per</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="101"/>
<source>Combo</source>
<translation>Combinació</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="106"/>
<source>Time</source>
<translation>Temps</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="115"/>
<source>Ranking</source>
<translation>Classificació</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="146"/>
<source>In last</source>
<translation>En l&apos;últim</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="154"/>
<source>Month</source>
<translation>Mes</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="163"/>
<source>Week</source>
<translation>Setmana</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="172"/>
<source>Day</source>
<translation>Dia</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="203"/>
<source>From</source>
<translation>Des de</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="211"/>
<source>All Peers</source>
<translation>Tots els contactes</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="220"/>
<source>Own Links</source>
<translation>Enllaços propis</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="251"/>
<source>Show</source>
<translation>Mostra</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="259"/>
<source>Top 100</source>
<translation>Top 100</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="268"/>
<source>101-200</source>
<translation>101-200</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="273"/>
<source>201-300</source>
<translation>201-300</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="278"/>
<source>301-400</source>
<translation>301-400</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="283"/>
<source>401-500</source>
<translation>401-500</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="288"/>
<source>Bottom 100</source>
<translation>Els últims 100</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="318"/>
<source>Link:</source>
<translation>Enllaç:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="350"/>
<source>Add Anonymous Link</source>
<translation>Afegir enllaç anònim</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="357"/>
<source>Add Link/Comment</source>
<translation>Afegir Enllaç/Comentari</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="368"/>
<source>Title:</source>
<translation>Títol:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="384"/>
<source>Score:</source>
<translation>Puntuació:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="392"/>
<location filename="../LinksDialog.cpp" line="144"/>
<source>+2 Great!</source>
<translation>+2 Fantàstic!</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="401"/>
<location filename="../LinksDialog.cpp" line="147"/>
<source>+1 Good</source>
<translation>+1 Molt bo</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="410"/>
<location filename="../LinksDialog.cpp" line="150"/>
<source>0 Okay</source>
<translation>0 Està </translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="419"/>
<location filename="../LinksDialog.cpp" line="153"/>
<source>-1 Sux</source>
<translation>-1 És dolent</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="428"/>
<location filename="../LinksDialog.cpp" line="156"/>
<source>-2 Bad Link</source>
<translation>-2 Enllaç dolent</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="444"/>
<source>Url:</source>
<translation>URL:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="531"/>
<source>Links Cloud</source>
<translation>Núvol d&apos;enllaços</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="551"/>
<source>Add new link</source>
<translation>Afegir nou enllaç</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="137"/>
<source>Share Link Anonymously</source>
<translation>Compartir enllaç anònimament</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="141"/>
<source>Vote on Link</source>
<translation>Votar un enllaç</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="160"/>
<source>Download</source>
<translation>Descarregar</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="707"/>
<location filename="../LinksDialog.cpp" line="735"/>
<location filename="../LinksDialog.cpp" line="743"/>
<source>Add Link Failure</source>
<translation>Afegir enllaç que falla</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="707"/>
<source>Missing Link and/or Title</source>
<translation>Enllaç i/o títol perdut</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="735"/>
<source>Missing Link Data</source>
<translation>Dades d&apos;enllaç perdudes</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="743"/>
<source>Missing Comment</source>
<translation>Comentari perdut</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="758"/>
<source>Link Title Not Changed</source>
<translation>Títol d&apos;enllaç no canviat</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="758"/>
<source>Do you want to continue?</source>
<translation>Vols continuar?</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="813"/>
<source>Expand</source>
<translation>Ampliar</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="820"/>
<source>Hide</source>
<translation>Amagar</translation>
</message>
</context>
</TS>

View File

@ -1,329 +0,0 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="cs" version="2.0">
<context>
<name>AddLinksDialog</name>
<message>
<location filename="../AddLinksDialog.ui" line="14"/>
<location filename="../AddLinksDialog.ui" line="56"/>
<source>Add Link</source>
<translation>Přidat odkaz</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="49"/>
<source>Cancel</source>
<translation>Zrušit</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="82"/>
<source>Add a new Link</source>
<translation>Přidat nový odkaz</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="95"/>
<source>Title:</source>
<translation>Titulek</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="102"/>
<source>Url:</source>
<translation>Url:</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="139"/>
<source>Add Anonymous Link</source>
<translation>Přidat anonymní odkaz</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="147"/>
<source>+2 Great!</source>
<translation>+2 Výborný</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="156"/>
<source>+1 Good</source>
<translation>+1 Dobrý</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="165"/>
<source>0 Okay</source>
<translation>0 OK</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="174"/>
<source>-1 Sux</source>
<translation>-1 Špatný</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="183"/>
<source>-2 Bad Link</source>
<translation>-2 Špatný odkaz</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="44"/>
<source>Add Link to Cloud</source>
<translation>Přidat odkaz do Cloudu</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="61"/>
<source>New Link</source>
<translation>Nový odkaz</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="89"/>
<source>Add Link Failure</source>
<translation>Přidání odkazu selhalo</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="89"/>
<source>Missing Link and/or Title</source>
<translation>Chybí odkaz nebo titulek</translation>
</message>
</context>
<context>
<name>LinksCloudPlugin</name>
<message>
<location filename="../LinksCloudPlugin.cpp" line="93"/>
<source>This plugin provides a set of cached links, and a voting system to promote them.</source>
<translation>Tento zásuvný modul poskytuje sadu mezipaměti odkazů, a hlasovací systém na jejich podporu</translation>
</message>
<message>
<location filename="../LinksCloudPlugin.cpp" line="98"/>
<source>LinksCloud</source>
<translation>LinksCloud</translation>
</message>
</context>
<context>
<name>LinksDialog</name>
<message>
<location filename="../LinksDialog.ui" line="45"/>
<source>Title / Comment</source>
<translation>Titulek / Komentáře</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="50"/>
<source>Score</source>
<translation>Skóre</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="55"/>
<source>Peer / Link</source>
<translation>Peer / Odkaz</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="93"/>
<source>Sort by</source>
<translation>Seřadit podle</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="101"/>
<source>Combo</source>
<translation>Dvojité</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="106"/>
<source>Time</source>
<translation>Čas</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="115"/>
<source>Ranking</source>
<translation>Žebříček</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="146"/>
<source>In last</source>
<translation>Jako poslední</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="154"/>
<source>Month</source>
<translation>Měsíc</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="163"/>
<source>Week</source>
<translation>Týden</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="172"/>
<source>Day</source>
<translation>Den</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="203"/>
<source>From</source>
<translation>Od</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="211"/>
<source>All Peers</source>
<translation>Všechny peery</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="220"/>
<source>Own Links</source>
<translation>Naše odkazy</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="251"/>
<source>Show</source>
<translation>Zobrazit</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="259"/>
<source>Top 100</source>
<translation>Top 100</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="268"/>
<source>101-200</source>
<translation>101-200</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="273"/>
<source>201-300</source>
<translation>201-300</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="278"/>
<source>301-400</source>
<translation>301-400</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="283"/>
<source>401-500</source>
<translation>401-500</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="288"/>
<source>Bottom 100</source>
<translation>Spodní 100</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="318"/>
<source>Link:</source>
<translation>Odkaz:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="350"/>
<source>Add Anonymous Link</source>
<translation>Přidat anonymní odkaz</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="357"/>
<source>Add Link/Comment</source>
<translation>Přidat odkaz / komentář</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="368"/>
<source>Title:</source>
<translation>Titulek:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="384"/>
<source>Score:</source>
<translation>Skóre:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="392"/>
<location filename="../LinksDialog.cpp" line="144"/>
<source>+2 Great!</source>
<translation>+2 Výborný</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="401"/>
<location filename="../LinksDialog.cpp" line="147"/>
<source>+1 Good</source>
<translation>+1 Dobrý</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="410"/>
<location filename="../LinksDialog.cpp" line="150"/>
<source>0 Okay</source>
<translation>0 OK</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="419"/>
<location filename="../LinksDialog.cpp" line="153"/>
<source>-1 Sux</source>
<translation>-1 Špatný</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="428"/>
<location filename="../LinksDialog.cpp" line="156"/>
<source>-2 Bad Link</source>
<translation>-2 Špatný odkaz</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="444"/>
<source>Url:</source>
<translation>Url:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="531"/>
<source>Links Cloud</source>
<translation>Odkazový Cloud</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="551"/>
<source>Add new link</source>
<translation>Přidat nový odkaz</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="137"/>
<source>Share Link Anonymously</source>
<translation>Sdílet odkaz anonymně</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="141"/>
<source>Vote on Link</source>
<translation>Volte na odkaze</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="160"/>
<source>Download</source>
<translation>Stáhnout</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="707"/>
<location filename="../LinksDialog.cpp" line="735"/>
<location filename="../LinksDialog.cpp" line="743"/>
<source>Add Link Failure</source>
<translation>Přidání odkazu selhalo</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="707"/>
<source>Missing Link and/or Title</source>
<translation>Chybí odkaz nebo titulek</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="735"/>
<source>Missing Link Data</source>
<translation>Chybějí odkazová data</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="743"/>
<source>Missing Comment</source>
<translation>Chybějící komentář</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="758"/>
<source>Link Title Not Changed</source>
<translation>Nebyl zadán titulek odkazu</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="758"/>
<source>Do you want to continue?</source>
<translation>Chcete pokračovat?</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="813"/>
<source>Expand</source>
<translation>Rozbalit</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="820"/>
<source>Hide</source>
<translation>Skrýt</translation>
</message>
</context>
</TS>

View File

@ -1,329 +0,0 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="da" version="2.0">
<context>
<name>AddLinksDialog</name>
<message>
<location filename="../AddLinksDialog.ui" line="14"/>
<location filename="../AddLinksDialog.ui" line="56"/>
<source>Add Link</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="49"/>
<source>Cancel</source>
<translation>Annuller</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="82"/>
<source>Add a new Link</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="95"/>
<source>Title:</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="102"/>
<source>Url:</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="139"/>
<source>Add Anonymous Link</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="147"/>
<source>+2 Great!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="156"/>
<source>+1 Good</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="165"/>
<source>0 Okay</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="174"/>
<source>-1 Sux</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="183"/>
<source>-2 Bad Link</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="44"/>
<source>Add Link to Cloud</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="61"/>
<source>New Link</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="89"/>
<source>Add Link Failure</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="89"/>
<source>Missing Link and/or Title</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>LinksCloudPlugin</name>
<message>
<location filename="../LinksCloudPlugin.cpp" line="93"/>
<source>This plugin provides a set of cached links, and a voting system to promote them.</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksCloudPlugin.cpp" line="98"/>
<source>LinksCloud</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>LinksDialog</name>
<message>
<location filename="../LinksDialog.ui" line="45"/>
<source>Title / Comment</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="50"/>
<source>Score</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="55"/>
<source>Peer / Link</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="93"/>
<source>Sort by</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="101"/>
<source>Combo</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="106"/>
<source>Time</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="115"/>
<source>Ranking</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="146"/>
<source>In last</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="154"/>
<source>Month</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="163"/>
<source>Week</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="172"/>
<source>Day</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="203"/>
<source>From</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="211"/>
<source>All Peers</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="220"/>
<source>Own Links</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="251"/>
<source>Show</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="259"/>
<source>Top 100</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="268"/>
<source>101-200</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="273"/>
<source>201-300</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="278"/>
<source>301-400</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="283"/>
<source>401-500</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="288"/>
<source>Bottom 100</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="318"/>
<source>Link:</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="350"/>
<source>Add Anonymous Link</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="357"/>
<source>Add Link/Comment</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="368"/>
<source>Title:</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="384"/>
<source>Score:</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="392"/>
<location filename="../LinksDialog.cpp" line="144"/>
<source>+2 Great!</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="401"/>
<location filename="../LinksDialog.cpp" line="147"/>
<source>+1 Good</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="410"/>
<location filename="../LinksDialog.cpp" line="150"/>
<source>0 Okay</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="419"/>
<location filename="../LinksDialog.cpp" line="153"/>
<source>-1 Sux</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="428"/>
<location filename="../LinksDialog.cpp" line="156"/>
<source>-2 Bad Link</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="444"/>
<source>Url:</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="531"/>
<source>Links Cloud</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.ui" line="551"/>
<source>Add new link</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.cpp" line="137"/>
<source>Share Link Anonymously</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.cpp" line="141"/>
<source>Vote on Link</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.cpp" line="160"/>
<source>Download</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.cpp" line="707"/>
<location filename="../LinksDialog.cpp" line="735"/>
<location filename="../LinksDialog.cpp" line="743"/>
<source>Add Link Failure</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.cpp" line="707"/>
<source>Missing Link and/or Title</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.cpp" line="735"/>
<source>Missing Link Data</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.cpp" line="743"/>
<source>Missing Comment</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.cpp" line="758"/>
<source>Link Title Not Changed</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.cpp" line="758"/>
<source>Do you want to continue?</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.cpp" line="813"/>
<source>Expand</source>
<translation type="unfinished"/>
</message>
<message>
<location filename="../LinksDialog.cpp" line="820"/>
<source>Hide</source>
<translation type="unfinished"/>
</message>
</context>
</TS>

View File

@ -1,329 +0,0 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="de" version="2.0">
<context>
<name>AddLinksDialog</name>
<message>
<location filename="../AddLinksDialog.ui" line="14"/>
<location filename="../AddLinksDialog.ui" line="56"/>
<source>Add Link</source>
<translation>Link hinzufügen</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="49"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="82"/>
<source>Add a new Link</source>
<translation>Neuen Link hinzufügen</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="95"/>
<source>Title:</source>
<translation>Titel:</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="102"/>
<source>Url:</source>
<translation>Url:</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="139"/>
<source>Add Anonymous Link</source>
<translation>Anonym hinzufügen</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="147"/>
<source>+2 Great!</source>
<translation>+2 Großartig!</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="156"/>
<source>+1 Good</source>
<translation>+1 Gut</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="165"/>
<source>0 Okay</source>
<translation>0 In Ordnung</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="174"/>
<source>-1 Sux</source>
<translation>-1 Nervt</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="183"/>
<source>-2 Bad Link</source>
<translation>-2 Schlechter Link</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="44"/>
<source>Add Link to Cloud</source>
<translation>Link zur Wolke hinzufügen</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="61"/>
<source>New Link</source>
<translation>Neuer Link</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="89"/>
<source>Add Link Failure</source>
<translation>Link hinzufügen fehlgeschlagen</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="89"/>
<source>Missing Link and/or Title</source>
<translation>Titel und/oder Url fehlt</translation>
</message>
</context>
<context>
<name>LinksCloudPlugin</name>
<message>
<location filename="../LinksCloudPlugin.cpp" line="93"/>
<source>This plugin provides a set of cached links, and a voting system to promote them.</source>
<translation>Dieses Plug-in stellt Links und ein Wahlsystem zur Verfügung, um sie zu verbreiten.</translation>
</message>
<message>
<location filename="../LinksCloudPlugin.cpp" line="98"/>
<source>LinksCloud</source>
<translation>Verknüpfungswolke</translation>
</message>
</context>
<context>
<name>LinksDialog</name>
<message>
<location filename="../LinksDialog.ui" line="45"/>
<source>Title / Comment</source>
<translation>Titel / Kommentar</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="50"/>
<source>Score</source>
<translation>Punkte</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="55"/>
<source>Peer / Link</source>
<translation>Nachbar / Link</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="93"/>
<source>Sort by</source>
<translation>Sortiere nach</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="101"/>
<source>Combo</source>
<translation>Kombiniert</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="106"/>
<source>Time</source>
<translation>Zeit</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="115"/>
<source>Ranking</source>
<translation>Platzierung</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="146"/>
<source>In last</source>
<translation>Im letzten</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="154"/>
<source>Month</source>
<translation>Monat</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="163"/>
<source>Week</source>
<translation>Woche</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="172"/>
<source>Day</source>
<translation>Tag</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="203"/>
<source>From</source>
<translation>Von</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="211"/>
<source>All Peers</source>
<translation>Alle Nachbarn</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="220"/>
<source>Own Links</source>
<translation>Eigene Links</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="251"/>
<source>Show</source>
<translation>Zeige</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="259"/>
<source>Top 100</source>
<translation>Top 100</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="268"/>
<source>101-200</source>
<translation>101-200</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="273"/>
<source>201-300</source>
<translation>201-300</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="278"/>
<source>301-400</source>
<translation>301-400</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="283"/>
<source>401-500</source>
<translation>401-500</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="288"/>
<source>Bottom 100</source>
<translation>Letzten 100</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="318"/>
<source>Link:</source>
<translation>Link:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="350"/>
<source>Add Anonymous Link</source>
<translation>Anonym hinzufügen</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="357"/>
<source>Add Link/Comment</source>
<translation>Link/Kommentar hinzufügen</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="368"/>
<source>Title:</source>
<translation>Titel:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="384"/>
<source>Score:</source>
<translation>Punkte:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="392"/>
<location filename="../LinksDialog.cpp" line="145"/>
<source>+2 Great!</source>
<translation>+2 Großartig!</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="401"/>
<location filename="../LinksDialog.cpp" line="148"/>
<source>+1 Good</source>
<translation>+1 Gut</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="410"/>
<location filename="../LinksDialog.cpp" line="151"/>
<source>0 Okay</source>
<translation>0 In Ordnung</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="419"/>
<location filename="../LinksDialog.cpp" line="154"/>
<source>-1 Sux</source>
<translation>-1 Nervt</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="428"/>
<location filename="../LinksDialog.cpp" line="157"/>
<source>-2 Bad Link</source>
<translation>-2 Schlechter Link</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="444"/>
<source>Url:</source>
<translation>Url:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="531"/>
<source>Links Cloud</source>
<translation>Verknüpfungswolke</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="551"/>
<source>Add new link</source>
<translation>Neuen Link hinzufügen</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="138"/>
<source>Share Link Anonymously</source>
<translation>Link anonym verteilen</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="142"/>
<source>Vote on Link</source>
<translation>Stimme für Link</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="161"/>
<source>Download</source>
<translation>Herunterladen</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="708"/>
<location filename="../LinksDialog.cpp" line="736"/>
<location filename="../LinksDialog.cpp" line="744"/>
<source>Add Link Failure</source>
<translation>Link hinzufügen fehlgeschlagen</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="708"/>
<source>Missing Link and/or Title</source>
<translation>Fehlender Link und/oder Titel</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="736"/>
<source>Missing Link Data</source>
<translation>Fehlende Linkdaten</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="744"/>
<source>Missing Comment</source>
<translation>Fehlender Kommentar</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="759"/>
<source>Link Title Not Changed</source>
<translation>Linktitel nicht geändert</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="759"/>
<source>Do you want to continue?</source>
<translation>Willst du fortfahren?</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="814"/>
<source>Expand</source>
<translation>Erweitern</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="821"/>
<source>Hide</source>
<translation>Verbergen</translation>
</message>
</context>
</TS>

View File

@ -1,329 +0,0 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="el" version="2.0">
<context>
<name>AddLinksDialog</name>
<message>
<location filename="../AddLinksDialog.ui" line="14"/>
<location filename="../AddLinksDialog.ui" line="56"/>
<source>Add Link</source>
<translation>Προσθέστε σύνδεσμο</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="49"/>
<source>Cancel</source>
<translation>Διακοπη</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="82"/>
<source>Add a new Link</source>
<translation>Προσθέσετε ένα νέο σύνδεσμο</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="95"/>
<source>Title:</source>
<translation>Τίτλος:</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="102"/>
<source>Url:</source>
<translation>URL:</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="139"/>
<source>Add Anonymous Link</source>
<translation>Προσθέστε ανώνυμη σύνδεση</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="147"/>
<source>+2 Great!</source>
<translation>+2 Μεγάλη!</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="156"/>
<source>+1 Good</source>
<translation>+1 Καλή</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="165"/>
<source>0 Okay</source>
<translation>Εντάξει 0</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="174"/>
<source>-1 Sux</source>
<translation>-1 Sux</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="183"/>
<source>-2 Bad Link</source>
<translation>-2 Κακή σύνδεση</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="44"/>
<source>Add Link to Cloud</source>
<translation>Προσθήκη συνδέσεων σε σύννεφο</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="61"/>
<source>New Link</source>
<translation>Νέα σύνδεση</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="89"/>
<source>Add Link Failure</source>
<translation>Προσθέστε αποτυχία σύνδεσης</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="89"/>
<source>Missing Link and/or Title</source>
<translation>Συνδετικός κρίκος ή/και τίτλο</translation>
</message>
</context>
<context>
<name>LinksCloudPlugin</name>
<message>
<location filename="../LinksCloudPlugin.cpp" line="93"/>
<source>This plugin provides a set of cached links, and a voting system to promote them.</source>
<translation>Αυτό το plugin παρέχει ένα σύνολο των προσωρινά αποθηκευμένων συνδέσεων, καθώς και ένα σύστημα ψηφοφορίας για την προώθηση τους.</translation>
</message>
<message>
<location filename="../LinksCloudPlugin.cpp" line="98"/>
<source>LinksCloud</source>
<translation>LinksCloud</translation>
</message>
</context>
<context>
<name>LinksDialog</name>
<message>
<location filename="../LinksDialog.ui" line="45"/>
<source>Title / Comment</source>
<translation>Τίτλος / σχόλιο</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="50"/>
<source>Score</source>
<translation>Σκορ</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="55"/>
<source>Peer / Link</source>
<translation>Peer / Link</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="93"/>
<source>Sort by</source>
<translation>Ταξινόμηση κατά</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="101"/>
<source>Combo</source>
<translation>Combo</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="106"/>
<source>Time</source>
<translation>Χρόνος</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="115"/>
<source>Ranking</source>
<translation>Κατάταξη</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="146"/>
<source>In last</source>
<translation>Στο τελευταίο</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="154"/>
<source>Month</source>
<translation>Μήνα</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="163"/>
<source>Week</source>
<translation>Εβδομάδα</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="172"/>
<source>Day</source>
<translation>Ημέρα</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="203"/>
<source>From</source>
<translation>Απο</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="211"/>
<source>All Peers</source>
<translation>Όλοι οι φορείς</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="220"/>
<source>Own Links</source>
<translation>Δικες σας συνδέσεις</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="251"/>
<source>Show</source>
<translation>Εμφανιση</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="259"/>
<source>Top 100</source>
<translation>Top 100</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="268"/>
<source>101-200</source>
<translation>101-200</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="273"/>
<source>201-300</source>
<translation>201-300</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="278"/>
<source>301-400</source>
<translation>301-400</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="283"/>
<source>401-500</source>
<translation>401-500</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="288"/>
<source>Bottom 100</source>
<translation>Κάτω 100</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="318"/>
<source>Link:</source>
<translation>Σύνδεση:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="350"/>
<source>Add Anonymous Link</source>
<translation>Προσθέστε ανώνυμη σύνδεση</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="357"/>
<source>Add Link/Comment</source>
<translation>Προσθέστε σύνδεσμο/σχόλιο</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="368"/>
<source>Title:</source>
<translation>Τίτλος:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="384"/>
<source>Score:</source>
<translation>Βαθμολογία:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="392"/>
<location filename="../LinksDialog.cpp" line="144"/>
<source>+2 Great!</source>
<translation>+2 Μεγάλη!</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="401"/>
<location filename="../LinksDialog.cpp" line="147"/>
<source>+1 Good</source>
<translation>+1 Καλή</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="410"/>
<location filename="../LinksDialog.cpp" line="150"/>
<source>0 Okay</source>
<translation>Εντάξει 0</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="419"/>
<location filename="../LinksDialog.cpp" line="153"/>
<source>-1 Sux</source>
<translation>-1 Sux</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="428"/>
<location filename="../LinksDialog.cpp" line="156"/>
<source>-2 Bad Link</source>
<translation>-2 Κακή σύνδεση</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="444"/>
<source>Url:</source>
<translation>URL:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="531"/>
<source>Links Cloud</source>
<translation>Συνδέσεις σύννεφο</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="551"/>
<source>Add new link</source>
<translation>Προσθέστε νέα σύνδεση</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="137"/>
<source>Share Link Anonymously</source>
<translation>Μοιράσμα σύνδεσης ανώνυμα</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="141"/>
<source>Vote on Link</source>
<translation>Ψηφίσμα σύνδεσης</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="160"/>
<source>Download</source>
<translation>Λυψη</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="707"/>
<location filename="../LinksDialog.cpp" line="735"/>
<location filename="../LinksDialog.cpp" line="743"/>
<source>Add Link Failure</source>
<translation>Προσθέστε αποτυχία σύνδεσης</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="707"/>
<source>Missing Link and/or Title</source>
<translation>Συνδετικός κρίκος ή/και τίτλο</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="735"/>
<source>Missing Link Data</source>
<translation>Ελλείπουσα σύνδεση δεδομένων</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="743"/>
<source>Missing Comment</source>
<translation>Λείπει το σχόλιο</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="758"/>
<source>Link Title Not Changed</source>
<translation>Τίτλος συνδέσμου, δεν αλλάζει</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="758"/>
<source>Do you want to continue?</source>
<translation>Θέλετε να συνεχίσετε;</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="813"/>
<source>Expand</source>
<translation>Επεκταση</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="820"/>
<source>Hide</source>
<translation>Αποκρυψη</translation>
</message>
</context>
</TS>

View File

@ -1,331 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="en_US">
<context>
<name>AddLinksDialog</name>
<message>
<location filename="../AddLinksDialog.ui" line="14"/>
<location filename="../AddLinksDialog.ui" line="56"/>
<source>Add Link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="49"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="82"/>
<source>Add a new Link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="95"/>
<source>Title:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="102"/>
<source>Url:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="139"/>
<source>Add Anonymous Link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="147"/>
<source>+2 Great!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="156"/>
<source>+1 Good</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="165"/>
<source>0 Okay</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="174"/>
<source>-1 Sux</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="183"/>
<source>-2 Bad Link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="44"/>
<source>Add Link to Cloud</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="61"/>
<source>New Link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="89"/>
<source>Add Link Failure</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="89"/>
<source>Missing Link and/or Title</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LinksCloudPlugin</name>
<message>
<location filename="../LinksCloudPlugin.cpp" line="93"/>
<source>This plugin provides a set of cached links, and a voting system to promote them.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksCloudPlugin.cpp" line="98"/>
<source>LinksCloud</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LinksDialog</name>
<message>
<location filename="../LinksDialog.ui" line="45"/>
<source>Title / Comment</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="50"/>
<source>Score</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="55"/>
<source>Peer / Link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="93"/>
<source>Sort by</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="101"/>
<source>Combo</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="106"/>
<source>Time</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="115"/>
<source>Ranking</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="146"/>
<source>In last</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="154"/>
<source>Month</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="163"/>
<source>Week</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="172"/>
<source>Day</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="203"/>
<source>From</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="211"/>
<source>All Peers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="220"/>
<source>Own Links</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="251"/>
<source>Show</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="259"/>
<source>Top 100</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="268"/>
<source>101-200</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="273"/>
<source>201-300</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="278"/>
<source>301-400</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="283"/>
<source>401-500</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="288"/>
<source>Bottom 100</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="318"/>
<source>Link:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="350"/>
<source>Add Anonymous Link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="357"/>
<source>Add Link/Comment</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="368"/>
<source>Title:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="384"/>
<source>Score:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="392"/>
<location filename="../LinksDialog.cpp" line="145"/>
<source>+2 Great!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="401"/>
<location filename="../LinksDialog.cpp" line="148"/>
<source>+1 Good</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="410"/>
<location filename="../LinksDialog.cpp" line="151"/>
<source>0 Okay</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="419"/>
<location filename="../LinksDialog.cpp" line="154"/>
<source>-1 Sux</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="428"/>
<location filename="../LinksDialog.cpp" line="157"/>
<source>-2 Bad Link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="444"/>
<source>Url:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="531"/>
<source>Links Cloud</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="551"/>
<source>Add new link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="138"/>
<source>Share Link Anonymously</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="142"/>
<source>Vote on Link</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="161"/>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="708"/>
<location filename="../LinksDialog.cpp" line="736"/>
<location filename="../LinksDialog.cpp" line="744"/>
<source>Add Link Failure</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="708"/>
<source>Missing Link and/or Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="736"/>
<source>Missing Link Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="744"/>
<source>Missing Comment</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="759"/>
<source>Link Title Not Changed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="759"/>
<source>Do you want to continue?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="814"/>
<source>Expand</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="821"/>
<source>Hide</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@ -1,329 +0,0 @@
<?xml version="1.0" ?><!DOCTYPE TS><TS language="es" version="2.0">
<context>
<name>AddLinksDialog</name>
<message>
<location filename="../AddLinksDialog.ui" line="14"/>
<location filename="../AddLinksDialog.ui" line="56"/>
<source>Add Link</source>
<translation>Añadir enlace</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="49"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="82"/>
<source>Add a new Link</source>
<translation>Añadir un nuevo enlace</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="95"/>
<source>Title:</source>
<translation>Título:</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="102"/>
<source>Url:</source>
<translation>Url:</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="139"/>
<source>Add Anonymous Link</source>
<translation>Añadir enlace anónimo</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="147"/>
<source>+2 Great!</source>
<translation>+2 ¡Excelente!</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="156"/>
<source>+1 Good</source>
<translation>+1 Muy bueno</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="165"/>
<source>0 Okay</source>
<translation>0 Bueno</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="174"/>
<source>-1 Sux</source>
<translation>-1 Pésimo</translation>
</message>
<message>
<location filename="../AddLinksDialog.ui" line="183"/>
<source>-2 Bad Link</source>
<translation>-2 Enlace malo</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="44"/>
<source>Add Link to Cloud</source>
<translation>Añadir enlace a la nube</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="61"/>
<source>New Link</source>
<translation>Nuevo enlace</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="89"/>
<source>Add Link Failure</source>
<translation>Añadir enlace fallido</translation>
</message>
<message>
<location filename="../AddLinksDialog.cpp" line="89"/>
<source>Missing Link and/or Title</source>
<translation>Enlace y/o título perdido</translation>
</message>
</context>
<context>
<name>LinksCloudPlugin</name>
<message>
<location filename="../LinksCloudPlugin.cpp" line="93"/>
<source>This plugin provides a set of cached links, and a voting system to promote them.</source>
<translation>Este plugin proporciona un conjunto de enlaces en caché, y un sistema de votación para promoverlos.</translation>
</message>
<message>
<location filename="../LinksCloudPlugin.cpp" line="98"/>
<source>LinksCloud</source>
<translation>Enlace en la nube</translation>
</message>
</context>
<context>
<name>LinksDialog</name>
<message>
<location filename="../LinksDialog.ui" line="45"/>
<source>Title / Comment</source>
<translation>Título / Comentario</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="50"/>
<source>Score</source>
<translation>Puntuación</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="55"/>
<source>Peer / Link</source>
<translation>Pares / Enlace</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="93"/>
<source>Sort by</source>
<translation>Ordenar por</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="101"/>
<source>Combo</source>
<translation>Combinar</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="106"/>
<source>Time</source>
<translation>Hora</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="115"/>
<source>Ranking</source>
<translation>Clasificación</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="146"/>
<source>In last</source>
<translation>En la última</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="154"/>
<source>Month</source>
<translation>Mes</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="163"/>
<source>Week</source>
<translation>Semana</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="172"/>
<source>Day</source>
<translation>Día</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="203"/>
<source>From</source>
<translation>De</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="211"/>
<source>All Peers</source>
<translation>Todos los pares</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="220"/>
<source>Own Links</source>
<translation>Enlaces propios</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="251"/>
<source>Show</source>
<translation>Mostrar</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="259"/>
<source>Top 100</source>
<translation>Top 100</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="268"/>
<source>101-200</source>
<translation>101-200</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="273"/>
<source>201-300</source>
<translation>201-300</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="278"/>
<source>301-400</source>
<translation>301-400</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="283"/>
<source>401-500</source>
<translation>401-500</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="288"/>
<source>Bottom 100</source>
<translation>Por debajo de 100</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="318"/>
<source>Link:</source>
<translation>Enlace:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="350"/>
<source>Add Anonymous Link</source>
<translation>Añadir enlace anónimo</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="357"/>
<source>Add Link/Comment</source>
<translation>Añadir enlace/comentario</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="368"/>
<source>Title:</source>
<translation>Título:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="384"/>
<source>Score:</source>
<translation>Puntuación:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="392"/>
<location filename="../LinksDialog.cpp" line="144"/>
<source>+2 Great!</source>
<translation>+2 ¡Excelente!</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="401"/>
<location filename="../LinksDialog.cpp" line="147"/>
<source>+1 Good</source>
<translation>+1 Muy bueno</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="410"/>
<location filename="../LinksDialog.cpp" line="150"/>
<source>0 Okay</source>
<translation>0 Bueno</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="419"/>
<location filename="../LinksDialog.cpp" line="153"/>
<source>-1 Sux</source>
<translation>-1 Pésimo</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="428"/>
<location filename="../LinksDialog.cpp" line="156"/>
<source>-2 Bad Link</source>
<translation>-2 Enlace malo</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="444"/>
<source>Url:</source>
<translation>Url:</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="531"/>
<source>Links Cloud</source>
<translation>Enlaces en la nube</translation>
</message>
<message>
<location filename="../LinksDialog.ui" line="551"/>
<source>Add new link</source>
<translation>Añadir nuevo enlace</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="137"/>
<source>Share Link Anonymously</source>
<translation>Compartir enlace anónimamente</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="141"/>
<source>Vote on Link</source>
<translation>Votar el enlace</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="160"/>
<source>Download</source>
<translation>Descargar</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="707"/>
<location filename="../LinksDialog.cpp" line="735"/>
<location filename="../LinksDialog.cpp" line="743"/>
<source>Add Link Failure</source>
<translation>Añadir enlace fallido</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="707"/>
<source>Missing Link and/or Title</source>
<translation>Enlace y/o título perdido</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="735"/>
<source>Missing Link Data</source>
<translation>Faltan los datos del enlace</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="743"/>
<source>Missing Comment</source>
<translation>Falta el comentario</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="758"/>
<source>Link Title Not Changed</source>
<translation>El título del enlace no ha cambiado</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="758"/>
<source>Do you want to continue?</source>
<translation>¿Desea continuar?</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="813"/>
<source>Expand</source>
<translation>Expandir</translation>
</message>
<message>
<location filename="../LinksDialog.cpp" line="820"/>
<source>Hide</source>
<translation>Ocultar</translation>
</message>
</context>
</TS>

Some files were not shown because too many files have changed in this diff Show More